Laravel5.3 Release と、 5.2 からの変更点の、わりと力尽きているメモ書き

おめでとうございます。

[Laravel 5.3 is now released](https://laravel-news.com/2016/08/laravel-5-3-is-now-released/)

いくつか新機能と、変更点があるので、それの私的なメモ書き。

## 追記

1. 2016/12/14: Notification に 5.1, 5.2 系で使うには を追加

# 新機能

新機能が、5.2に上がった時よりも多い気がする…

## 全文検索

Eloquent で全文検索ができるようになったみたいです。試してないから、細かい所まではわからない。

```php
Post::search('Alice')->get();
```

[laravel-scout](https://laravel.com/docs/5.3/scout)を使用してます。

Scoutは標準で [Algolia](https://www.algolia.com) を利用しています。AlgoliaはKV的なWebAPIサービスなので、利用するために初めは`Algolia`へデータ登録をする必要があります。詳しくは Scout に書いてるっぽい。

他にも [jeylabs/laravel-scout-elastic](https://packagist.org/packages/jeylabs/laravel-scout-elastic) で `ElasticSearch` で利用できるみたい。

- [Laravel-Scout](https://laravel.com/docs/5.3/scout)

## Laravel Passport

OAuth2のサーバ側を簡単に導入できるようにしたパッケージ「Laravel Passport」が標準ではいったっぽい。

これの機能を実装するために [Vue.js](http://viejs.org) が標準導入。

## Laravel Mailable 

5.2系ではゴリゴリ書いてたのが、5.3ではクラスベースにできます。これですっきりできる。

```php

// 5.2 base
Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
    $m->from('hello@app.com', 'Your Application');
    $m->to($user->email, $user->name)->subject('Your Reminder!');
});
```

コマンドで`mailable`クラスを作成して、そこに色々書く感じ。

```shell
php artisan make:mail YourReminder
```

```php
// メソッド
public function build()
{
    return $this->from('example@example.com')
        ->view('emails.reminder');
}
```

```php
// 使う時はこんな感じ
Mail::to($email)->send(new YourReminder);

```

see: [Laravel Mailable: The new and improved way to send email in Laravel ](https://laravel-news.com/2016/08/laravel-mailable-the-new-and-improved-way-to-send-email-in-laravel/)


## Notification

やっとか。

サーバからの通知を、Slack/TextMessage(SNS?)/Emailとかに飛ばす為のコンポーネント。パッケージが完全に分離されているので、5.1/5.2系に導入可能。

### Notification で通知できるサービス

公式で書いている限り。自分で書いたら他にも行けるんじゃない。

- Push系
	- Ionic Push Notifications
	- OneSignal
	- Pushover
	- PushBullet
	- Pusher Push Notifications
	- WebPush
- メッセンジャー系
	- Discord
	- Facebook
	- Gitter
	- Twitter
	- Telegram
	- HipChat
- SNS系
	- Clickatell
	- Jusibe
	- Messagebird
	- OVH SMS
	- Plivo
	- Smsc.ru
	- Twilio
- Todo系
	- Evernote
	- Todoist
	- Wunderlist
- その他
	- Lob Physical Mail
	- MailLift Handwritten Letters
	- Trello
	- Webhook

Webhookがあるのでiftttに飛ばせますね。

see: [Laravel Notification Channels](http://laravel-notification-channels.com)

### 5.1, 5.2 系で使うには

[backPort](https://github.com/laravel-notification-channels/backport) をインストールすればいいよ。

## Laravel Echo

tcp/udp の 7番ポートで喋るやつではありません。

websocket で喋り続けるやつです。

## Migration

既存の `migrate:rollback` では一つ前のバージョンに戻すが、戻すバージョンを数値で指定することができるようになった。

```
php artisan migrate:rollback --step=1
```


## Simple Pagination

いままでの `Pagination` より簡素になったっぽい。よくわからない。

## Blade Loop Variable

Blade に LoopCounter が入った話。

```
<ul>
@foreach ($pages as $page)
   <li>{{ $page->title }} ({{ $loop->iteration }} / {{ $loop->count }})</li>
@endforeach
</ul>
```

see: [The new $loop variable in Laravel 5.3](https://mattstauffer.co/blog/the-new-loop-variable-in-laravel-5-3)


## Directory Changes

`app` フォルダーにあった空のディレクトリが削除されました。例えば `Events`,`Jobs`,`Listeners`,`Policies`など。`make:job` などを実行すれば、必要に応じて作成されます。

## Queued Jobs

`Eloquent Collection`のシリアライズ化が新しくなったみたいです。よくわからない。

## Query Builder

配列で返していたのを`Collection`で返すようになりました。

`\DB::select('select * from `hoge_table`')->get()` の返り値が`Object[]`だったのが`Collection` になったという事？

## Cache Helper

`cache()` 関数が追加。

see: (The new cache() global helper in Laravel 5.3)[https://mattstauffer.co/blog/the-new-cache-global-helper-in-laravel-5-3]


## Documentation Changes

改善されたよってことらしい。よくわからん。

# アップグレード

- PHP5.6.4以上を推奨。
- HHVMのサポートは遠くないうちにきれます。
- 5.2アップグレードガイドは5.3では不要になる事に注意。

## Application Service Providers

`EventServiceProvider` や `RouteServiceProvider` の `boot` メソッドの引数を使うより、`facade`を使ったほうがいいかも。

## Arr クラス

PHP の連想配列に対応したので、`first`,`last`,`where`メソッドのClosureに添字の $key が追加された。

```
Arr::first(function ($value, $key) {
    return ! is_null($value);
});
```

### Collections

同様の変更がある。

## Artisan

`make:console`が`make:command`に変更されます。

## Authentication

認証まわりが 4つのコントローラクラスに変更されましたので、`Route` で指定している場合は `Auth::routes()` や [コントローラ名などを置換](https://github.com/laravel/laravel/tree/master/app/Http/Controllers/Auth)するようにしてください。

(AuthController を置いておいて、メソッドの中から`app(Controller::class)->hoge($args..)`をすればこの変更はあまりなかったように思うけどまぁいいや)

### ログアウト

`logout`メソッドが `post` routes でも動くみたいな感じ。


## パスワードリセットメール

Laravel-Notification が使われます。

`Illuminate\Auth\Passwords\CanResetPassword`トレイトの`sendPasswordResetNotification`メソッドを上書きすれば、書き換えることができます。

既存のままで、Laravel-Notificationを使用する場合は下記のような感じになります。

```php
namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;
}
```

## 認可

認証しているユーザのmodelを引数で取ることができるようになりました。

```
/**
 * Determine if the given user can create posts.
 *
 * @param  \App\User  $user
 * @return bool
 */
public function create(User $user)
{
    //
}
```

### AuthorizesResourcesの変更

`app/Http/Controllers/Controller.php`にある`AuthorizesResources`が`AuthorizesResources`に変更されました。


## Blade

力尽きた

## Database

### Collections

`all`メソッドを呼ぶには`get`メソッドを呼び出してからにする変更があったっぽい。

`$users = DB::table('users')->get()->all();`


### Eloquent $morphClass Property

力尽きた。

### Eloquent `save` method return `false`

Eloquentモデルの内容に変更がない場合、返り値が`false`になります。

### Eloquent Scopes

力尽きた。

### Join Clause

力尽きた。


## Encryption

`Mcrypt`が5.1.0から使いませんが、5.3.0から完全になくなり、全て OpenSSL に置き換わります。

DBに`Mcrypt`を使ったデータを保存している場合、[laravel/legacy-encrypter](https://github.com/laravel/legacy-encrypter)を使って、下記のようなコマンドを作成して、DBの内容を更新をしてください。

```
$legacy = new McryptEncrypter($encryptionKey);

foreach ($records as $record) {
    $record->encrypted = encrypt(
        $legacy->decrypt($record->encrypted)
    );

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

## 例外ハンドラー

`Illuminate\Container\Container` インスタンスを使うようになりました。`app/Exception/Handler.php`でコンストラクターを利用している場合、`parent::__construct(app());`を呼び出してください。


## Middleware

`can` ミドルウェアが `\Illuminate\Foundation\Http\Middleware\Authorize::class` から `\Illuminate\Auth\Middleware\Authorize::class ` に変更されましたので、変更をしてください。

そして `can` ミドルウェアで、認証していないユーザの例外が `Illuminate\Auth\AuthenticationException` になりました。ユーザが認証していない時の例外を捉えるには `Illuminate\Auth\AuthenticationException` を取るようにしてください。


### Binding Substitution Middleware

力尽きた。

## Notification

パッケージインストールをしてください。

- `config/app.php` の `providers` に `Illuminate\Notifications\NotificationServiceProvider`を追加してください。
- `config/app.php` の `aliases` に `Illuminate\Support\Facades\Notification`を追加してください。
- `User`モデルに `Illuminate\Notifications\Notifiable` トレイトを使うようにしてください。必要に応じて、他のモデルにも追加してください。


## Pagination

カスタマイズする時は下記の手順で、元テンプレートを編集してください。

`php artisan vendor:publish --tag=laravel-pagination`

コマンドを実行すれば、 `resources/views/vendor/pagination` が作成されます。`default.blade.php` がベーステンプレートになります。詳しくは [Customizing The Pagination View](https://laravel.com/docs/5.3/pagination#customizing-the-pagination-view)を参照

## Queue

### 設定の変更

全てのQueueの設定にある `expire` が `retry_after`という名前に変更されました。
同様に、Beanstalk の設定にある `ttr` が `retry_after` になりました。

### Closures

そう遠くない間に使えなくなります。Closureからクラスと Queue インスタンスで動くように書き換えてください。

### Collection Serialization

`Illuminate\Queue\SerializesModels`トレイトが `Illuminate\Database\Eloquent\Collection`のインスタンスを適切にシリアライズするようになりました。

これの変更による膨大な量の書き換えは起こらないはずです。

### Daemon Workers

`queue:work` のオプション引数 `--daemon` が必要にならなくなるでしょう。

`php artisan queue:work`で起動されるプロセスは、自動的に Daemon Mode になります。

シングルジョブとして動かしたい場合は `--once` オプションを追加してください。

### Event Data Changes

よくわからない。

### Jobs Table

`database`を使用している場合、`jobs`テーブルから `jobs_queue_reserved_reserved_at_index`インデックスと、`reserved`カラムを削除してください。このカラムはこれから使用しません。

それらの変更をしたら、`queue`カラムと`reserved_at`カラムをもつ複合インデックスを作成してください。

### Failed Jobs Table

`failed_jobs`を使用している場合、`exception`カラムを追加してください。

`exception`カラムは `TEXT`タイプで、Jobの実行が失敗した時の例外を保存するのに使用します。

### Serializing Models On Legacy Style Queue Jobs

`Queue:push`の引数が変わりました。

従来では `Queue::push('ClassName@method');` でしたが、`Job class`に`Illuminate\Queue\SerializesModels`トレイトを利用させて、`Queue::push(new ClassName);`という方法を取ってくださいみたいな感じ。



## Routing

Resource Parameters Are Singular By Default とある。力尽きた。


## Validation

Validationエラーで発生する例外が `HttpException` を継承した `Illuminate\Validation\ValidationException` になった。

例外を受け取っている場合は `ValidationException` を受け取るようにしてください。

## Nullable ルールの追加

よくわからない。「パラメータでは渡されているけど空白」もしくは「パラメータがない」のどっちなんだろ。

# 参考

1. [Github Diff between 5.2 and 5.3](https://github.com/laravel/laravel/compare/5.2...5.3)