[Laravel] 5.6がリリースされました
先日laravel 5.6がリリースされました。新しい機能や修正点について確認しましょう。
General
Sympony
のバージョン4
を使うようアップデートしました
Bootstrap
のバージョン4
を使うようアップデートしました
Application
ContractにrunningUnitTests()
が追加されました
cron-expression
が2.x
を使うようアップデートしました
Artisan Console
optimize
コマンドが廃止されました
queue:work
実行時にJob ID
が出力されるようになりました
migrate:status
コマンドが追加されました
migrate:status
を実行することで、現在のマイグレーションの情報を確認できます
call()
メソッドの第3引数に$outputBuffer
が追加されました
migrate
コマンドに--realpath
オプションが追加されました
--realpath
オプションを使用することで、マイグレーションファイルを相対パスで指定できます
$ php artisan migrate --path=./tests/migrations --realpath
make:controller
コマンドに--api
オプションが追加されました
--api
オプションを使用することで、API用のコントローラー(index, store, show, update, destroy)が作成できます
Authentication
ResetPassword::toMail()
を使ってパスワードリセット時の送信メールをカスタマイズできるようになりました
AuthServiceProvider::policies()
メソッドが追加されました
policies()
メソッドを利用して、現在適用されているポリシーを取得できます
Blade Templates
@csrf
と@method
ディレクテブが追加されました
今まで{{ csrf_field() }}
や{{ method_field('PUT') }}
と記述する必要があったものがディレクティブになりました。
Blade::component()
メソッドを使ってカスタムディレクティブが登録できるようになりました
より便利にコンポーネントを利用するためにcomponent()
メソッドを利用してディレクティブとして名前をつけることができます。
// プロバイダなどで登録
Blade::component('components.alert', 'alert');
// Bladeでの使用例
@component('alert')
<p>This is an alert component</p>
@endcomponent
htmlspecialchars
のdouble_encodeがデフォルトで'true'になりました
今まではdoubleEncode()
メソッドがこの役割を果たしていましたが廃止され、withDoubleEncoding()
メソッドとwithoutDoubleEncoding()
メソッドが追加されました。
// src/Illuminate/View/Compilers/BladeCompiler.php
/**
* Set the "echo" format to double encode entities.
*
* @return void
*/
public function withDoubleEncoding()
{
$this->setEchoFormat('e(%s, true)');
}
/**
* Set the "echo" format to not double encode entities.
*
* @return void
*/
public function withoutDoubleEncoding()
{
$this->setEchoFormat('e(%s, false)');
}
Laravel5.6では、Bladeとe()
ヘルパーがデフォルトで特殊文字を二重にエンコードします。これにより、基礎となるhtmlspecialchars
のデフォルトの動作に揃えられます。
以前のダブルエンコーデング防止の動作を維持したい場合はBlade::withoutDoubleEncoding
を利用します。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::withoutDoubleEncoding();
}
}
Broadcasting
購読するチャンネルをクラスとして渡せるようになりました
Cache
RateLimiter::tooManyAttempts()
から$decayMinutes
の引数が削除されました
Collections
Collection@unique()
メソッドにkey
を指定しなかった場合の挙動が修正されました
Collection@partition()
メソッドにオペレーターの指定ができるようになりました
これによって、引数がcallback
から、key
とoperator
とvalue
へ変更されました。
Collection::mapToDictionary()
のパフォーマンスが改善されました
Collection::except()
がキーの配列のみで実行可能になりました
Database
マイグレーションのBlueprint@morphs
とBlueprint@nullableMorphs
メソッド実行時に作成されるインデックスの命名規則が変更されました
// 変更前
$this->index(["{$name}_id", "{$name}_type"], $indexName);
// 変更後
$this->index(["{$name}_type", "{$name}_id"], $indexName);
PostgreSQLでコメントが利用可能になりました
enum
タイプのカラムを使用する際の挙動が変更されました
SQLiteGrammar::compileColumnListing()
メソッドで重複したテーブルプレフィックスが防止されるよう修正されました
SQLite
で複数レコードに対するupdate()
メソッドが利用可能になりました
SQLite
で実行された複数のクエリの中にサポートされていないメソッドがある場合に例外が発生するようになりました
whereTime()
メソッドでオペレーターが省略可能 (=) になりました
Queue利用時のデータベーストランザクションの挙動が変更されました
whereRowValues()
メソッドが追加されました
whereRowValues()
を使用して複数の条件を一度に指定することができます。
$builder->whereRowValues(['last_update', 'order_number'], '<', [1, 2]);
Pivot Modelのシリアライズが修正されました
DetectsLostConnections
でThrowable
が投げられるようになりました
Eloquent
Queue登録時に関連モデルの内容もシリアライズ可能になりました
関連モデルがポリモーフィックの場合に内部キーを指定可能になりました
refresh()
メソッド実行時に内容が同期されるようになりました
MassAssignmentException
発生時のメッセージが変更されました
getDateFormat()
がpublicに変更されました
BelongsToMany::getPivotClass()
が追加されました
Pivotレコード作成時に、自身の$dateFormat
が正常に指定されるようになりました
BelongsToMany::withPivotValues()
メソッドが追加されました
$pivotValues
が追加され、デフォルトの値を指定できます。
Eloquent EventにforceDeleted
が追加されました
FactoryBuilder::getRawAttributes()
メソッドが追加され、登録されていないfactoryが呼び出された場合に例外が発生するようになりました
一部のResource
クラスの命名が変更されました
日付形式へのキャスティングフォーマットをカスタムできるようになりました
Eloquentのdateとdatetimeのキャストフォーマットを個別に指定することができます。
protected $casts = [
'birthday' => 'date:Y-m-d',
'joined_at' => 'datetime:Y-m-d H:00',
];
Hashing
暗号化方式にArgon
が追加されました
Helpers
Arr::wrap()
メソッドが引数がnull
の場合に[]
を返却するようになりました
class_uses_recursive()
の戻り値のソート順が親クラスを優先するようになりました
Str::uuid()
とStr::orderedUuid()
メソッドが追加されました
Str::orderedUuid()
はタイムスタンプをベースとしたUUIDを生成し、データベースのインデックスキーなどに効率よく利用できます。
// The methods return a Ramsey\Uuid\Uuid object
return (string) Str::uuid();
return (string) Str::orderedUuid();
Logging
ログの出力方法が大幅に変更されました
- #22635
- 106ac2a7a1b337afd9edd11367039e3511c85f81
- 7ba0c22133da7ca99d1ec1459630de01f95130c1
- 03f870cb0b0eefde363b8985843aba68446a407c
- e691230578b010fe753f1973d5ab218a6510c0e9
新しくconfig/logging.php
が追加されました。
新しいLoggingはメッセージを複数のハンドラへ送信できるstack
を用意しています。
syslog
のラベルにアプリケーション名 (APP_ENV) になりました
MessageSend
イベントのプロパティに$data
が追加されました
$data
に値を渡すことで、メッセージに追加の情報を付与することができるようになります。
メッセージ作成時のcallbacks
の実行順序がattachments
の前に変更されました
メール内容にHTMLの文字列を渡せるようになりました
Notifications
routeNotificationFor()
メソッドを利用して通知クラスを指定可能になりました
Queues
Job
contractにpayload()
とgetJobId()
メソッドが追加されました
Worker::raiseFailedJobEvent()
メソッドが削除されました
Redis
のQueueでblocking popが指定可能になりました
Requests
expectsJson()
が明確なContent Typeでない場合にfalse
を返すようになりました
Request::getSession()
メソッドが追加されました
Request::hasAny()
メソッドの引数に配列が指定可能になりました
Responses
Cookie\Factory
クラスに$raw
と$sameSite
のパラメーターが追加されました
Modelで新しいレコードが作成された時に201
のステータスコードを返却するようになりました
Resource
クラスでオリジナルのJsonResponseを指定できるようになりました
streamDownload()
メソッドが追加されました
session.secure
がtrue
の場合にセキュアなセッションが許可されるように変更されました
Routing
SetCacheHeaders
ミドルウェアが追加されました
ThrottleRequests
で任意の上限が指定可能になりました
ミドルウェアの引数でrate_limit
を直接指定することができます。
Route::middleware('auth:api', 'throttle:rate_limit,1')
->group(function () {
Route::get('/user', function () {
//
});
});
Service Container
登録時のサービスプロバイダにおけるバルクバインディングのサポート
Support
Manager::driver()
メソッドが引数がnull
の場合に例外を投げるようになりました
Bus\Dispatcher
contractにhasCommandHandler()
とgetCommandHandler()
とmap()
メソッドが追加されました
PaginatoruseBootstrapThree()
が追加されました
Bootstrap 3のページネーションを利用する場合はPaginator::useBootstrapThree
を使用します。
<?php
namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapThree();
}
}
Task Scheduling
マルチサーバーでのCron実行スケジュールが追加されました
この機能はCache Driverにmemcached
かredis
を指定している場合にのみ利用できます。
$schedule->command('report:generate')
->fridays()
->at('17:00')
->onOneServer();