laravel5.5の変更点覚え書き 各ページ編

# 各ページより

[非公式ドキュメント（日本語訳）](https://readouble.com/laravel/5.5/ja/releases.html)の各ページを5.4との差分を見ながら気になるものだけ追加していきます。

## サービスコンテナ

### サービスコンテナのPSR-11コンテナインターフェース呼び出し

```php
use Psr\Container\ContainerInterface;

Route::get('/', function (ContainerInterface $container) {
    $service = $container->get('Service');

    //
});
```

https://readouble.com/laravel/5.5/ja/container.html#psr-11

## HTTPリクエスト

### intersectメソッドの削除

[onlyメソッドのロジック修正](http://qiita.com/piotzkhider/items/934dd9aed9adfabc699b#only%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E4%BF%AE%E6%AD%A3)にて後述

### onlyメソッドのロジック修正

5.4では`only()`の引数に存在しないキーを入れるとそのキーの値には`null`が入り返却されていたが、
5.5からは`only()`は存在するキーの値のみ返却されるようになった。
（5.4までの`intersect()`と同様の機能のため`intersect()`は消えた）

```php:5.4
   /**
     * Get a subset containing the provided keys with values from the input data.
     *
     * @param  array|mixed  $keys
     * @return array
     */
    public function only($keys)
    {
        $keys = is_array($keys) ? $keys : func_get_args();

        $results = [];

        $input = $this->all();

        foreach ($keys as $key) {
            Arr::set($results, $key, data_get($input, $key));
        }

        return $results;
    }
```

```php:5.5
    /**
     * Get a subset containing the provided keys with values from the input data.
     *
     * @param  array|mixed  $keys
     * @return array
     */
    public function only($keys)
    {
        $results = [];

        $input = $this->all();

        $placeholder = new stdClass;

        foreach (is_array($keys) ? $keys : func_get_args() as $key) {
            $value = data_get($input, $key, $placeholder);

            if ($value !== $placeholder) {
                Arr::set($results, $key, $value);
            }
        }

        return $results;
    }
```

### hasメソッドのロジック修正

5.4では`isEmptyString()`を通して値を取得していたが、
5.5では存在する値かどうかのみを見るよう修正されている

これは後述の[filledメソッドの追加](http://qiita.com/piotzkhider/items/934dd9aed9adfabc699b#filled%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E8%BF%BD%E5%8A%A0)により、機能を分割したためと思われる

```php:5.4

    /**
     * Determine if the request contains a non-empty value for an input item.
     *
     * @param  string|array  $key
     * @return bool
     */
    public function has($key)
    {
        $keys = is_array($key) ? $key : func_get_args();

        foreach ($keys as $value) {
            if ($this->isEmptyString($value)) {
                return false;
            }
        }

        return true;
    }
```

```php:5.5

    /**
     * Determine if the request contains a given input item key.
     *
     * @param  string|array  $key
     * @return bool
     */
    public function has($key)
    {
        $keys = is_array($key) ? $key : func_get_args();

        $input = $this->all();

        foreach ($keys as $value) {
            if (! Arr::has($input, $value)) {
                return false;
            }
        }

        return true;
    }
```

### filledメソッドの追加

リクエストに値が存在しており、かつ空でないかを確認する

```php:filled()
if ($request->filled('name')) { // }
```

## バリデーション

### formatValidationErrors & formatErrorsメソッドの削除

前述の[Consistent Exception Handling](http://qiita.com/piotzkhider/items/934dd9aed9adfabc699b#consistent-exception-handling)により削除（移動）

## エラーとログ

### The report Helper

「例外を報告はするが、現在のリクエストを処理し続ける」という際に使用するヘルパー関数の実装

```php:
public function isValid($value)
{
    try {
        // Validate the value...
    } catch (Exception $e) {
        report($e);

        return false;
    }
}
```

## Bladeテンプレート

### sectionディレクティブのTips

> Tip!! Contrary to the previous example, this sidebar section ends with @endsection instead of @show. The @endsection directive will only define a section while @show will define and immediately yield the section.

> `@endsection`はセクションを定義するだけだが、`@show`は定義して直ちに出力する

意味がよくわからないが、親テンプレートは`@show`を使い、子テンプレートは`@endsection`を使うってことかな？

[Laravel Recipes](http://recipes.laravel.jp/recipe/111)
この話がTipsとして表示されたということだろうか。

### Switch Statements

bladeにswitch文の追加

```php:
@switch($i)
    @case(1)
        First case...
        @break

    @case(2)
        Second case...
        @break

    @default
        Default case...
@endswitch
```


### eachディレクティブのNote

> Views rendered via @each do not inherit the variables from the parent view. If the child view requires these variables, you should use @foreach and @include instead.

`@each`を介してレンダリングされたビューは、親ビューから変数を継承しません。 子ビューにこれらの変数が必要な場合は、代わりに`@foreach`と`@include`を使用する必要があります。

## ヘルパ

### tapメソッドの追加

> The tap function accepts two arguments: an arbitrary \$value and a Closure. The $value will be passed to the Closure and then be returned by the tap function. The return value of the Closure is irrelevant:

tap関数は、任意の`$value`と`Closure`の2つの引数を受け取ります。
`$value`はクロージャに渡され、 tap関数によって返されます。 `Closure`の戻り値は無関係です。

```php:
$user = tap(User::first(), function ($user) {
    $user->name = 'taylor';

    $user->save();
});
```

> If no Closure is passed to the tap function, you may call any method on the given $value. The return value of the method you call will always be \$value, regardless of the what the method actually returns in its definition. For example, the Eloquent update method typically returns an integer. However, we can force the method to return the model itself by chaining the update method call through the tap function:

`Closure`がtap関数に渡されない場合、指定された`$value`に対して任意のメソッドを呼び出すことができる。
呼び出すメソッドの戻り値は、メソッドが実際にその定義に返すものに関係なく、常に`$value`になります。 
たとえば、Eloquentの`update`メソッドは通常、整数を返します。 しかし、`update`メソッド呼び出しをtap関数を通して連鎖させることによって、メソッドがモデル自体を返すように強制することができます。

```php:
$user = tap($user)->update([
    'name' => $name,
    'email' => $email
]);
```

## リレーション

### loadMissingメソッドの追加

まだloadしていないときのみloadする場合に使用する

```php:
public function format(Book $book)
{
    $book->loadMissing('author');

    return [
        'name' => $book->name,
        'author' => $book->author->name
    ];
}
```