Laravel 5.2 追加機能とかメモ


Laravel 5.2 が出たので、変更箇所とかぼんやり眺める系メモ


追記 -- 2016/01/29

1. iron-mq の事, 設定のこと, Cashierのこと

## Authenticate Multi-Auth

複数のテーブルにユーザ情報を置いている場合、例えば `admin` テーブルと `student` テーブルがある場合などの時に対応。っぽい。

これに伴い、`config/auth.php`やら認証周りの内容が変わるので、アップグレード時は注意。

see: https://github.com/laravel/laravel/blob/v5.2.0/config/auth.php

## Authentication Scaffolding

`php artisan make:auth` でBootstrapを使ったログイン画面、登録画面、パスワードリセット画面を生成する。( ただし、新規アプリケーションのみで、アップグレードでは…）

## Route::model

Route URL からモデルを引っ張ってこれるようになった。

```routes.php
<?php

use App\User;

Route::get('/user/{user}', function (User $user) {
    return $user;
});
```

`{user}` はタイプヒンティングで Eloquent Model から自動的に引っ張ってくる。

## Middleware Group

ミドルウェアをグループ化することで、今ではRouteで複数指定しているのを、短くすることができる。

```App\Http\Kernel.php
/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
    ],
];
```

```routes.php
<?php
Route::group(['middleware' => ['web']], function () {
    //
});
```

## Rate Limitting

新しい標準のMiddlewareに、IPアドレスからのリクエスト制限をするMiddlewareが追加。

下記の例だと、1つのIPから毎分60リクエストを上限にする。

```routes.php
Route::get('/api/users', ['middleware' => 'throttle:60,1', function () {
    //
}]);
```


## Array Validation

FormRequst に配列を指定した場合、Validation を指定する方法が`Request::rules` の中でループを回してValidationを追加していく形だったけど、それをしなくて良くなった。

```
<?php
$validator = Validator::make($request->all(), [
    'person.*.email' => 'email|unique:users'
]);
```

Languageファイルなどでメッセージを書く時は下記のようになる

```
'custom' => [
    'person.*.email' => [
        'unique' => 'Each person must have a unique e-mail address',
    ]
],
```

## Eloquent Global Scope

よくわかんない。 http://laravel.com/docs/5.2/eloquent#global-scopes

## Illuminate\Support\Collection に追加

`pluck`, `keys`, `zip`, `collapse`, `flatten`, `flip` それぞれのメソッドを追加

## CSRF Verification

影響ないと思うけど、CSRF対策はunit test時には動かなくなりました。

## Event まわり

Event名変更が16個ある。そして、Closureの引数が変更。例えば、`DB::listen` は下記のような変更になる。

```
<?php

// Laravel 5.1系
DB::listen(function($sql, $bindings, $time) {
    // hogehoge
});

// Laravel 5.2系
DB::listen(function ($event) {
    dump($event->sql);
    dump($event->bindings);
});
```

## Jobs / Queue

`php artisan make:job --queued` としていしていたのを標準化。そして、同期型Jobの作成に `php artisan make:job --sync`オプションを追加。

## Service Provider

`Illuminate\Foundation\Providers\ArtisanServiceProvider` および `Illuminate\Routing\ControllerServiceProvider` を `app.php` から削除。必要時は手動追加？

## Session

新しい `database` ドライバを追加。それにより UserID, IPAddress, User-Agent を見るようになった。今までのは `legacy-database` として存在するので、使用し続ける時は `session.php` に記述する。

新しい`database`ドライバを使う時は、３つのレコードを sessionテーブルに追加する必要がある。

1. `user_id (nullable integer)`
2. `ip_address (nullable string)`
3. `user_agent (text)`

## 設定のこと

割りとある。もれあると思う。

1.  `config/app.php` にある`providers`から数行削除

    1. Illuminate\Foundation\Providers\ArtisanServiceProvider::class
    2. Illuminate\Routing\ControllerServiceProvider::class

1. `config/app.php` にある`aliases` から数行削除

    ソース内で使っている `\Input::` や `\Bus::` が使えなくなります。使うには、下２行を追記すればいけるかも…？

    1. 'Bus' => Illuminate\Support\Facades\Bus::class
    1. 'Input'   => Illuminate\Support\Facades\Input::class

1. auth.php の記述が変更

    `'driver' => 'eloquent',` と書いていたのが、Multi-Auth への対応をするために大幅変更されました。
    アップグレードして使うなら、[Github](https://github.com/laravel/laravel/blob/eb59458d175e757a1e952f552b5eb3c6518a2ab5/config/auth.php)などから持ってきたほうがいいっぽい。


1. database path の変更

    これは 5.0→5.1の変更時に含まれてました。 see: [5.0...master diff](https://github.com/laravel/laravel/compare/5.0...master#diff-8a025ad5d4f4fade612727b1bb0e974fR51)

## IronMQ のサポート

別パッケージになりました。
 
使うには、[http://github.com/LaravelCollective/iron-queue](http://github.com/LaravelCollective/iron-queue) をインストールして使うみたいです。


## {{ }} とか {!! !!} とか

「{!! !!}」は非推奨とか聞いた気がするんだけど、ソースコード見たら使ってる部分ある。[see](https://github.com/laravel/framework/compare/5.1...5.2#diff-3bbffbf6637f18fbe38b480b3342fbc3R18)

非推奨ってのはボクの勘違いだったのかしら…


## Cashier

[Stripe](https://stripe.com/)専用だけど、APIに連携していい感じにするのが追加されています。

[dompdf](https://github.com/dompdf/dompdf)が上手く動いてくれれば、領収書とかがPDFで吐き出せるそうです。多分。

## 廃止予定

5.2では使えるが、5.3では廃止予定のもの。

1. Jobs から `Illuminate\Contracts\Bus\SelfHandling` が消えます
2. `Collection` の `list`メソッド。代わりに `pluck` を使用してください。
3. 暗黙的に指定していた `Route::controller` はなくなります。明確に実行するメソッドを指定するようにしてください。
4. 5.2 で言う`legacy-database`はなくなります。
5. `Str::randomBytes` は PHP7 で導入された `random_bytes` を使うようにしてください。
6. `Str::equals` は `hash_equals` を使うようにしてください
7. `Illuminate\View\Expression` は `Illuminate\Support\HtmlString` を使うようにしてください

## 参考

1. http://laravel.com/docs/5.2/releases#laravel-5.2
1. http://laravel.com/docs/5.2/upgrade
1. [Github: laravel/laravel 変更差分 5.1...5.2](https://github.com/laravel/laravel/compare/5.1...5.2)
1. https://github.com/laravel/cashier