
[Laravel] BladeのComponent Aliasesを便利に使う方法
Laravel5.6がリリースされましたが、目玉の一つとしてBladeコンポーネントが大きくアップデートされました。
Bladeをより便利に使うために、コンポーネントとしての利用方法を紹介します。
Component Aliases
コンポーネント化されたviewファイルの呼び出しにエイリアスが利用できます。
以下のファイルを作成します。
<!-- /resources/views/components/alert.blade.php -->
<div class="alert alert-danger">
<div class="alert-title">{{ $title }}</div>
{{ $slot }}
</div>
@includeを利用した呼び出し
引数に/resources/views以下のパス(ドット)と、Blade内で利用する変数を配列で渡します。
@include('components/alert, ['title' => 'タイトル', 'slot' => 'メッセージ'])
@componentを利用した呼び出し
引数に/resources/views以下のパス(ドット)を渡して、@endcomponentの間に記述した内容が$slotとして展開されます。
また、@slot()を記述することにより、引数に渡した文字列の変数に展開されます。
@includeの呼び出しに対して、より動的な値や、HTMLタグを用いることが用意になります。
@component('alert')
@slot('title')
タイトル
@endslot
メッセージ
@endcomponent
Blade::component()を利用した呼び出し
作成したBladeファイルにオリジナルの名前をつけて利用することができるようになります。
サービスプロバイダ等で登録することにより、より柔軟な利用が可能になりました。
use Illuminate\Support\Facades\Blade;
Blade::component('components.alert', 'alert');
上記によりエイリアスとして登録され、@alertディレクティブとして/resources/views/components/alert.blade.phpが利用可能になります。
@alert(['title' => 'タイトル'])
メッセージ
@endalert
Blade::include()を利用した呼び出し
Blade::component()と似ていますが、こちらもエイリアスを利用した呼び出しが可能になります。
ただしこちらは@includeをより簡単にしたもので、slotを利用することは出来ません。
<!-- /resources/views/includes/input.blade.php -->
<input type="{{ $type ?? 'text' }}">
サービスプロバイダで登録します。
use Illuminate\Support\Facades\Blade;
// ドット記法の最後の単語がエイリアスとして登録されます
Blade::includes('includes.input');
// オリジナルのエイリアスを指定することも出来ます
Blade::include('includes.input', 'textinput');
登録が終われば、@inputディレクティブとして/resources/views/includes/input.blade.phpが利用可能になります。
@input(['type' => 'email'])
番外編
特定の条件によって、表示の有無を切り替える必要があることもあります。
@ifディレクティブやPolicyを利用することでコントロール可能ですが、@includeWhenディレクティブの利用でよりスマートに記述できます。
// @ifを利用した書き方
@if ($user->ownsPost($post)
@include('post.edit', ['post' => $post])
@endif
// @includeWhenを利用した書き方
@includeWhen($user->ownsPost($post), 'post.edit', ['post' => $post])
Blade Component Aliasesをより詳しく学ぶためにも、公式のドキュメントを確認して起きましょう。

[Laravel] 5.6.12がリリースされました
Laravelのバージョン5.6.12がリリースされました。
blade:cacheコマンドが追加されました。
事前にBladeテンプレートをプリコンパイルすることで表示速度が向上します。
$ php artisan blade:cache
Blade templates cached successfully!
詳細については追加されたIlluminate\Foundation\Console\BladeCacheCommandを参照してください。

[Laravel] 5.6.10がリリースされました
Laravelのバージョン5.6.10がリリースされました。更新された機能について確認していきます。
Added
1. Blueprint::dropMorphs()メソッドが追加されました
Added Blueprint::dropMorphs() (#23431)
2. メール送信時にStorageからファイルを添付できるようになりました
FileSystemを利用しているS3等のストレージからファイルを添付できます。
// 今までのファイル添付
$message->attach($pathToFile, array $options = []);
// ストレージから添付 - 5.6.10で追加
$message->attachFromStorage($path, $name = null, array $options = []);
// ストレージから添付 (ディスク指定) - 5.6.10で追加
$messaeg->attachFromStorageDisk($disk, $path, $name = null, array $options = []);
attachFromStorageの場合は、config/filesystems.phpでdefaultに指定しているストレージが利用されます。
Added Mailable::attachFromStorage() methods (@0fa361d)
3. Query BuilderにorWhereDay、orWhereMonth、orWhereYearが追加されました
// 2018-03-10もしくは2018-03-11に作成されたレコード
$query->whereDay('created_at', '2018-03-10');
$query->orWhereDay('created_at', '2018-03-11');
// ...
Added orWhere*() builder methods for day, month and year (#23449 )
Changed
1. stub作成じのドロップダウンリンクにv-pre属性を含むように変更されました
Added v-pre to dropdown link in app.stub (@98fdbb0)
2. JSON_PARTIAL_OUTPUT_ON_ERRORが発生した場合のエラーメッセージが変更されました
Handle more JSON errors gracefully when JSON_PARTIAL_OUTPUT_ON_ERROR is set (#23410, @972b82a)
3. ログ設定にbubble、permission、lockingが指定できるように変更されました
loggingにsingle、もしくはdailyを指定する場合にこのオプションが使用できます。
confing/logging.phpへ以下のように追加しましょう。
'channels' => [
// ...
'single' => [
// ...
'bubble' => true,
'permission' => 0775,
'locking' => false,
],
'daily' => [
// ...
'bubble' => true,
'permission' => 0775,
'locking' => false,
],
// ...
],
4. Request::validate()の戻り値がStr::contains()に変更されました
Use Str::contains() instead of str_contains() (@ae4cb28)
Fixed
1. unique()バリデーションでkeyが重複する場合に値が失われる問題を修正しました
Fixed unique() call in Validator::validate() (#23432)
2. Carbon利用時の処理が修正されました
Fix for Carbon 1.24.0 (@67d8a4b)
Release v5.6.10 · laravel/framework · GitHub

[Laravel] 5.6.9がリリースされました
Laravelのバージョン5.6.8、5.6.9がリリースされました。更新された機能について確認していきます。
Changed (5.6.9)
セッションの再発行時 (Session::regenerate) にトークン情報も再設定されるようになりました。
また、潜在的なXSSに対する修正により、Bootstrapのscaffoldingが変更されました。
JS Frameworks, Server Side Rendering, and XSS – Taylor Otwell – Medium
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }} <span class="caret"></span>
</a>
v-pre属性を付与することにより既存のコードを修正できます。
Regenerate token when regenerating the session (@20e8419)
Fixed (5.6.9)
Fixed an issue with resources when loading a single merge value with an associative array (#23414)
Release v5.6.9 · laravel/framework · GitHub
Added (5.6.8)
MySQLのsounds likeが利用可能になりました。
$builder->select('*')->from('users')->where('name', 'sounds like', 'John Doe');
Added support for MySQL’s sounds-like operator (#23351)
リクエスト数超過時の例外にIlluminate\Http\Exceptions\ThrottleRequestsExceptionが投げられるようになりました。
Added ThrottleRequestsException exception (#23358)
Bladeエンジンに@dumpディレクティブが追加されました。
Added @dump Blade directive (#23364)
Collection::whereInstanceOfMethod()メソッドが追加されました。
メッソド名の通り、指定のクラスをコレクションからフィルタリングできます。
$c = new Collection([new stdClass, new stdClass, new Collection, new stdClass]);
$this->assertCount(3, $c->whereInstanceOf(stdClass::class));
Added Collection::whereInstanceOfMethod() (@78b5b92)
Dispatchable::dispatchNow()メソッドが追加されました。
Illuminate\Contracts\Bus\Dispatcher\Dispatchableトレイトを利用する場合にも同期的にJOB実行が可能になりました。
Added Dispatchable::dispatchNow() (#23399)
Changed (5.6.8)
DatabaseNotificationを使用する際に発行される通知データを変更可能になりました。
\Illuminate\Notifications\Channels\DatabaseChannel::buildPayload()メソッドをOverwriteすることで、Model毎の通知データをカスタマイズできます。
/**
* Build an array payload for the DatabaseNotification Model.
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $notification
* @return array
*/
protected function buildPayload($notifiable, Notification $notification)
{
return [
'id' => $notification->id,
'type' => get_class($notification),
'data' => $this->getData($notifiable, $notification),
'read_at' => null,
];
}
Allow extension of DatabaseNotification model attributes (#23337)
認証系のscaffoldingがi18nに対応しました。
make:authコマンドで生成されるBladeファイルの全てが修正されました。
下記はresources/views/auth/login.blae.phpのstubファイルです。
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Login') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-sm-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>
@if ($errors->has('email'))
<span class="invalid-feedback">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>
@if ($errors->has('password'))
<span class="invalid-feedback">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group row">
<div class="col-md-6 offset-md-4">
<div class="checkbox">
<label>
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> {{ __('Remember Me') }}
</label>
</div>
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Login') }}
</button>
<a class="btn btn-link" href="{{ route('password.request') }}">
{{ __('Forgot Your Password?') }}
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Made auth scaffolding translatable (#23342)
Eloquent ModelのgetForeignKey()(リレーションを作成する際に外部キーを取得するメソッド)の処理が変更されました。
Str::snake(class_basename($this)).'_'.$this->primaryKeyからStr::snake(class_basename($this)).'_'.$this->getKeyName()変更されました。
これによってgetKeyName()をOverwrite可能になり、継承先のモデルからでも外部キーの変更が可能になりました。
Use getKeyName() in getForeignKey() (#23362)
FileSystemにてファイルやディレクトリを複数取得する際のソート順が名前順に変更されました。
Sort FileSystem files and directories by name (#23387)
Validatorのvalidate()メソッドが検証済みの値を返却するように変更されました。
Return validated data from Validator::validate() (#23397, @3657d66)
Fixed
serveコマンドが修正されました
Fixed serve command escaping (#23348)
Query BuilderのwithCount()メソッドの実装が移動されました。
Fixed an issue with multiple select statements in combination with withCount() (#23357)
Conditional loadの方法を修正しました。
Fixed conditional loading issues (#23369)
Model Factoryで配列を指定した場合の挙動が修正されました。
Prevent considering arrays as callable while building model factories (#23372)
Composerでtighenco/collectがコンフリクトしていた問題を修正しました。
Move tightenco/collect to Composer’s conflict (#23379)
View内でループの引数にTraversableオブジェクトを渡した際の挙動が修正されました。
Set up loop variable correctly on all Traversable objects (#23388, @49770ec)
Pivot Modelで値をフィルタリングする処理が修正されました。
Removed attribute filling from pivot model (#23401
Release v5.6.8 · laravel/framework · GitHub

[Laravel] Pwnedを使って安全なパスワードを利用する
サービスを利用する際にアカウントに設定する「パスワード」はとても重要です。他のサービスと同じパスワードの使い回しや、簡単なパスワードを利用したことによるアカウントの乗っ取り(不正アクセス)の危険があります。
Pwned Passwordsは過去に漏洩した膨大なデータを収集して、利用するパスワードが過去に何らかの形で漏洩したパスワードかどうかを確認できます。
このサービスをLaravelのユーザー登録時のValidationとして使ってみましょう。
パッケージのインストール
valorin/pwned-validatorをインストールします。
$ composer require valorin/pwned-validator
Laravelの5.4未満を利用している場合は下記をconfig/app.phpへ追記します。
'providers' => [
Valorin\Pwned\ServiceProvider::class,
],
バリデーションの設定
Laravelの認証システムを利用できるようにしておきましょう。
$ php artisan make:auth
App\Http\Controllers\Auth\RegisterControllerのvalidatorメソッドのpasswordにpwnedルールを追加します。
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|pwned|confirmed',
]);
/registerのURLへアクセスして、パスワード情報に12345678といった簡易なものを入力してみましょう。バリデーションに引っかかります。
※ 作成時点では12345678のパスワードは過去に2,680,521回漏洩しています。
バリデーションの際のメッセージを変更する場合はresources/lang/{言語}/validation.phpに追加しましょう。
また、pwnedのデフォルトの漏洩回数は1回です。
この値を変更する場合は下記のように記述します。
// 100回以上漏洩しているパスワードをチェック
'password' => 'required|string|min:6|pwned:100|confirmed',
Laravelの5.5で追加されたRuleクラスでの利用も可能です。
// 150回以上漏洩しているパスワードをチェック
'password' => ['required', 'string', 'min:6', new \Valorin\Pwned\Pwned(150), 'confirmed'],

[Laravel] Macroableを使ってクラスを拡張する
LaravelのMacroableトレイトを使ったクラスの拡張について。
Illuminate\Support\Traits\MacroableをuseするとClass::macro(method, callback)として既存のクラスにメソッドを拡張することができます。
公式では実装済みのCollectionクラスにでの使い方が記されており、独自のメソッドを追加できるようになっています。
Collections - Laravel - The PHP Framework For Web Artisans
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
return $this->map(function ($value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
また、コントローラーでリクエストされた値に対しての評価をする方法として下記があります。
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
}
このvalidate()メソッドは下記のようにMacroableトレイトを使って定義されています。
Illuminate\Http\RequestにIlluminate\Support\Traits\Macroableをuseしてメソッドの拡張を可能に
Illuminate\Foundation\Providers\FoundationServiceProviderでmacro
で登録
// laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php
/**
* Register the "validate" macro on the request.
*
* @return void
*/
public function registerRequestValidate()
{
Request::macro('validate', function (array $rules, ...$params) {
validator()->validate($this->all(), $rules, ...$params);
return $this->only(collect($rules)->keys()->map(function ($rule) {
return str_contains($rule, '.') ? explode('.', $rule)[0] : $rule;
})->unique()->toArray());
});
}
Macroableトレイトのデメリットとしては、ServiceProvider等を使わずに拡張しすぎると見通しが悪くなってしまう点と、barryvdh/laravel-ide-helperで補完されないようです。
Validate method not found in Illuminate\Http\Request · Issue #608 · barryvdh/laravel-ide-helper · GitHub

[Laravel] 5.6.7がリリースされました
Laravelのバージョン5.6.7がリリースされました(2018-02-28)。更新された機能について確認していきます。
Added
SFTPのファイルシステムが追加されました
#23308
league/flysystem-sftpパッケージが含まれるようになりました。
GitHub - thephpleague/flysystem-sftp: Flysystem Adapter for SFTP
config/filesystems.phpへは以下のように記述します。
// SSH鍵ベースの認証のサンプル
'sftp' => [
'driver' => 'sftp',
'host' => 'example.com',
'username' => 'username',
'password' => 'password',
'privateKey' => '/path/to/privateKey',
],
// すべてのオプション
'sftp' => [
'driver' => 'sftp',
'host' => 'example.com',
'port' => 22,
'username' => 'username',
'password' => 'password',
'privateKey' => 'path/to/or/contents/of/privatekey',
'root' => '/path/to/root',
'timeout' => 10,
'directoryPerm' => 0755
],
Changed
ModelのwithDefaultメソッッドのコールバックに関連Modelの値を渡せるようになりました
#23334
Parsedownパッケージが1.7にアップデートされました
@816f893
Fixed
PostgresGrammar::whereTime()のキャスティングの問題が修正されました
#23323
SQLiteGrammar::whereTime()のキャスティングの問題が修正されました
#23321
Release v5.6.7 · laravel/framework · GitHub

[Laravel] QRコードの画像を作成してダウンロードする方法
スマートフォンの普及により、イベントやキャンペーンなどのURLの共有にはQRコードがよく使われるようになりました。画面上に表示するのはもちろんですが、画像としてDownloadしたい場合もあると思います。
Laravelを使えば簡単です。
パッケージのダウンロード
今回はwerneckbh/laravel-qr-codeを利用します。
GitHub - werneckbh/laravel-qr-code: QR Code Generator for PHP wrapper for Laravel
以下の通りcomposerでインストールしてください。
$ composer require werneckbh/laravel-qr-code
Laravel5.4以下の場合はconfig/app.phpへサービスプロバイダとエイリアスを登録します。
<?php
'providers' => [
LaravelQRCode\Providers\QRCodeServiceProvider::class,
],
'aliases' => [
'QRCode' => LaravelQRCode\Facades\QRCode::class,
]
QRコードダウンロード用のルーティング
routes/web.phpへ下記の用に追加します。
Route::get('qr-code', function() {
return response()->streamDownload(function () {
\QRCode::url('https://laravel.com/')
->setSize(10)
->setMargin(2)
->png();
}, 'qr-code.png');
});
streamDownload()については、\Illuminate\Routing\ResponseFactoryを参照してください。
また、werneckbh/laravel-qr-codeではURL以外にも様々なQRコードが発行できます。
Calendar Event
Email Message
Phone
SMS
Text
URL
meCard
vCard v3
Wi-fi Network Settings
http://your-domain/qr-codeへアクセスするとQRコードの画像がダウンロードされることを確認しましょう。

[Laravel] 5.5から5.6へ3分でアップグレードする方法
既存のLaravel5.5のアプリケーションを5.6へアップグレードする際のまとめです。
細かな変更方法については以下で確認することをお勧めします。
Upgrade Guide - Laravel
※ Laravel5.6の動作には、PHPバージョン7.1.3以上が必要です。
依存パッケージのアップデート
composer.json の以下の内容を変更します。
laravel/frameworkの依存指定を5.6.*へ変更
fideloper/proxyの依存指定を~4.0へ変更
phpunit/phpunitの依存指定を~7.0へ変更
また、公式パッケージのDusk、Passport、Scountを利用している場合は下記も変更します。
laravel/duskの依存指定を~3.0へ変更
laravel/passportの依存指定を~5.0へ変更
laravel/scoutの依存指定を~4.0へ変更
変更したらcomposer updateしましょう。
環境ファイルの変更
.envファイルを変更します。
# .envから削除
APP_LOG
APP_LOG_LEVEL
# .envへ追加
LOG_CHANNEL=stack
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
設定ファイルの変更
config/app.phpから以下の項目を削除しましょう。
'log' => env('APP_LOG', 'single'),
'log_level' => env('APP_LOG_LEVEL', 'debug'),
config/hashing.phpを追加します。
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Hash Driver
|--------------------------------------------------------------------------
|
| This option controls the default hash driver that will be used to hash
| passwords for your application. By default, the bcrypt algorithm is
| used; however, you remain free to modify this option if you wish.
|
| Supported: "bcrypt", "argon"
|
*/
'driver' => 'bcrypt',
];
config/loging.phpを追加します。
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 7,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
],
];
Laravel5.6ではより一層便利なメソッドなどが増えました。積極的にアップデートしていきましょう!

[Laravel] 5.6.6がリリースされました
Laravelのバージョン5.6.6がリリースされました(2018-02-28)。更新された機能について確認していきます。
Added
CollectionにsortKeys()、sortKeysDesc()メソッドが追加されました
#23286
コレクションのキーを元に昇順、降順にソートできます。
$arr = [
'b' => 'second',
'a' => 'first',
'c' => 'third'
];
$sortKeys = collect($arr)->sortKeys();
// array:3 [▼
// "a" => "first"
// "b" => "second"
// "c" => "third"
// ]
$ssortKeysDesc = collect($arr)->sortKeysDesc();
// array:3 [▼
// "c" => "third"
// "b" => "second"
// "a" => "first"
// ]
Changed
オブジェクトのプロパティが定義されていない場合にもoptional()メソッドがnullを返すようになりました
#23267
$object = (object) ['foo' => 'bar'];
echo optional($object)->bar; // null
イベントにワイルドカードでリスナーを指定した場合の挙動が変更されました
#23299
@82099cb
スキーマ作成時のmorphs、nullableMorphsメソッドがunsignedBigIntegerを作成するように変更されました
#23320
Fixed
v5.5の遅延JOBがv5.6で実行されない問題を修正されました
#23287
Queue::bulk()が適切なダミーJOBが生成されない問題を修正されました
#23294
presetがnoneの場合に元のパッケージファイルが残る問題を修正しました
#23305
orHavingメソッドの引数の問題を修正しました
@e7f13be
Release v5.6.6 · laravel/framework · GitHub



