リリースノートより
非公式ドキュメント(日本語訳)のリリースノートなどを見ながら追加していきます。
全部見ていくのは辛くなったので、気になるものだけ抜粋。
Package Discovery
パッケージインストール時に必要だった、config/app.php
への登録(providers
、aliases
)が不要になる
(パッケージ側のcomposer.json
の設定による)
API Resources
API構築時などにEloquentと実際に返却されるjsonの差を埋める変換レイヤーとしてResource
クラスの追加。(App\Http\Resources
)
コンストラクタでEloquent(もしくはそのコレクション)を渡すことで$this->id
や$this->collection
などの形でモデルにアクセスできる。
Validation Rule Objects
以前はValidator::extend
を用いて、クロージャを追加していたカスタムバリデーションだが、
5.5ではRule
クラスとして追加することが可能になった。
use App\Rules\ValidName;
$this->validate($request, [
'name' => ['required', new ValidName],
]);
Trusted Proxy Integration
fideloper/TrustedProxyパッケージが5.5からApp\Http\Middleware\TrustProxies
として同梱された。
これは以下のような理由に起因した状態を防ぐもの。
ロードバランサの背後にあるアプリケーションを実行すると、アプリケーションでHTTPSリンクが生成されないことがあります。通常、これは、アプリケーションがロードバランサからのトラフィックがポート80で転送されており、セキュアなリンクが生成されることがわからないためです。
(これパッケージあったんだ…気付かなかった)
Renderable & Reportable Exceptions
以前のバージョンではそれぞれのException
に対する処理をカスタマイズするため、App\Exceptions\Handler
などで型チェックを行っていたが、
5.5では、Exception
それ自体にrender()
、report()
を追加することが出来る。
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
if ($exception instanceof SpecialException) {
return response(...);
}
return parent::render($request, $exception);
}
<?php
namespace App\Exceptions;
use Exception;
class SpecialException extends Exception
{
/**
* Report the exception.
*
* @return void
*/
public function report()
{
//
}
/**
* Report the exception.
*
* @param \Illuminate\Http\Request
* @return void
*/
public function render($request)
{
return response(...);
}
}
Request Validation
Illuminate\Http\Request
からvalidate()
が生やせるようになった。
また、Request
だけでなくController
のvalidate()
も返り値がvoid
でなくなり、検証ルールの属性でonly()
されたものが返されるようになった。
/**
* 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(array_keys($rules));
});
}
public function store(Request $request)
{
$validated = $request->([
'key1' => 'required',
]);
// $request->all() = ['key1' => 'value1', 'key2' => 'value2']
// $validated = ['key1' => 'value1']
//...
}
Consistent Exception Handling
バリデーション例外処理をApp\Exceptions\Handler
にて一括設定できるようになった。
/**
* Convert a validation exception into a response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Validation\ValidationException $exception
* @return \Illuminate\Http\Response
*/
protected function invalid($request, ValidationException $exception)
{
$url = $exception->redirectTo ?? url()->previous();
return redirect($url)
->withInput($request->except($this->dontFlash))
->withErrors(
$exception->errors(),
$exception->errorBag
);
}
/**
* Convert a validation exception into a JSON response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Validation\ValidationException $exception
* @return \Illuminate\Http\JsonResponse
*/
protected function invalidJson($request, ValidationException $exception)
{
return response()->json([
'message' => $exception->getMessage(),
'errors' => $exception->errors(),
], $exception->status);
}
Blade Improvements
@if(auth()->check()) ... @else ... @endif
などとしていた条件分岐を、もっと宣言的に行えるようにした
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Blade::if('env', function ($environment) {
return app()->environment($environment);
});
}
@env('local')
// The application is in the local environment...
@else
// The application is not in the local environment...
@endenv
また、それに伴いユーザーの認証状態を確認できる新しい@auth
や@guest
などのディレクティブの追加