laravel5.5の変更点覚え書き リリースノート編

# リリースノートより

[非公式ドキュメント（日本語訳）](https://readouble.com/laravel/5.5/ja/releases.html)のリリースノートなどを見ながら追加していきます。
全部見ていくのは辛くなったので、気になるものだけ抜粋。

## Package Discovery

パッケージインストール時に必要だった、`config/app.php`への登録(`providers`、`aliases`）が不要になる
（パッケージ側の`composer.json`の設定による）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47107/5ec946a4-392b-2134-789d-9ba0f552b2f1.png)

## API Resources

API構築時などにEloquentと実際に返却されるjsonの差を埋める変換レイヤーとして`Resource`クラスの追加。（`App\Http\Resources`）

コンストラクタでEloquent（もしくはそのコレクション）を渡すことで`$this->id`や`$this->collection`などの形でモデルにアクセスできる。

https://readouble.com/laravel/5.5/ja/eloquent-resources.html

## Validation Rule Objects

以前は`Validator::extend`を用いて、クロージャを追加していたカスタムバリデーションだが、
5.5では`Rule`クラスとして追加することが可能になった。


```php:使用例
use App\Rules\ValidName;

$this->validate($request, [
    'name' => ['required', new ValidName],
]);
```

# Trusted Proxy Integration

[fideloper/TrustedProxy](https://github.com/fideloper/TrustedProxy)パッケージが5.5から`App\Http\Middleware\TrustProxies`として同梱された。

これは以下のような理由に起因した状態を防ぐもの。

> ロードバランサの背後にあるアプリケーションを実行すると、アプリケーションでHTTPSリンクが生成されないことがあります。通常、これは、アプリケーションがロードバランサからのトラフィックがポート80で転送されており、セキュアなリンクが生成されることがわからないためです。

（これパッケージあったんだ…気付かなかった）

## Renderable & Reportable Exceptions

以前のバージョンではそれぞれの`Exception`に対する処理をカスタマイズするため、`App\Exceptions\Handler`などで型チェックを行っていたが、
5.5では、`Exception`それ自体に`render()`、`report()`を追加することが出来る。

```php:以前
/**
 * 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:5.5
<?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()`されたものが返されるようになった。

```php: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(array_keys($rules));
        });
    }
```

```php:validate()の返り値変更
    public function store(Request $request)
    {
        $validated = $request->([
            'key1' => 'required',
        ]); 

        // $request->all() = ['key1' => 'value1', 'key2' => 'value2']
        // $validated = ['key1' => 'value1']

        //...
    }
```

## Consistent Exception Handling

バリデーション例外処理を`App\Exceptions\Handler`にて一括設定できるようになった。

```php:デフォルトの書式
    /**
     * 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`などとしていた条件分岐を、もっと宣言的に行えるようにした

```php:AppServiceProvider
/**
 * Perform post-registration booting of services.
 *
 * @return void
 */
public function boot()
{
    Blade::if('env', function ($environment) {
        return app()->environment($environment);
    });
}
```

```php:blade
@env('local')
    // The application is in the local environment...
@else
    // The application is not in the local environment...
@endenv
```

また、それに伴いユーザーの認証状態を確認できる新しい`@auth`や`@guest`などのディレクティブの追加