6月 012017
 

こんばんは。ファガイです。
今日はLaravel5.2から現在の5.4までに追加されたrelease noteに書いてある機能を軽くまとめました。

5.2

Laravel5.2は主に5.1をサポートするような機能の追加がされています。

認証ドライバーがマルチAuthに対応

認証のScaffoldingが提供

これは標準の認証機能のテンプレートを生成してくれるものです。基本的に新規でアプリケーションを作る時等に使用します。

php artisan make:auth

暗黙のモデルバインディング

ルーティング等の際に自動的にモデルの情報を取得してコントローラーに渡すには、5.1まではRoute::modelを利用する必要がありました。
しかし、5.2以降はメソッドのパラメータにルートパラメータを同じ名前を利用することで自動的にバインディングが出来るようになりました。

5.1まで

Route::model('user', 'App\User');
// または
Route::bind('user', function($value) {
    return App\User::find($value);
});

Route::get('/user/{user}', function (App\User $user) {
    //
});

5.2以降

// ルートパラメータに{user}を指定し、パラメータの変数名もuserにしておくことで自動的にモデルにインジェクションされます。
Route::get('/user/{user}', function (App\User $user) {
    //
});

Middleware Groupの追加

Middlewareをグループ化して定義することが出来るようになりました。
これにより、web用のMiddlewareはこっち、api用のMiddlewareはこっちのように柔軟性が向上しました。

レート制限のミドルウェアが追加

新しく追加された\Illuminate\Routing\Middleware\ThrottleRequestsクラスは、単一IPからのアクセス数の制限を設定できます。

// 1分間に60回までのアクセス制限をかける
Route::get('/api/users', ['middleware' => 'throttle:60,1', function () {
    //
}]);

配列の中のバリデーションが可能になりました

*をつかうことで、配列の中身の要素のバリデーションが可能になりました。

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

バリデーションルールにbailルールが追加されました。

bailルールは順番にバリデーションルールを確認していき、バリデーションに失敗した時点で以降のバリデーションルールをチェックしないルールです。
以下の場合、integerルールに失敗した場合はuniqueルールは実行されません。

$this->validate($request, [
    'user_id' => 'bail|integer|unique:users'
]);

Eloquentのグローバルスコープの改善

以前までのバーションではEloquentのグローバルスコープに問題が有りましたが、こちらが改善されています。

Laravel5.3

Laravel5.3は全体的に新しい機能の追加がメインです。

通知機能の追加

Laravel5.3では通知機能が新しく実装されました。
通知機能では、メール送信をしたりSlackに通知を投げたり、SMSを送信できたりする機能をサポートします。

WebSockets / Event Broadcastingのサポート

Laravel5.3ではWebsocketなどのチャンネルレベルの認証及び、送信をサポートしています。

Laravel Passport(OAuth2 Server)の提供

Laravel PassportはOAuth2認証を提供できるようにするパッケージです。
APIでの認証などを出来るようにする際に便利そうです。

Eloquentへドライバベースの全文検索を提供するLaravel Scoutの提供

Laravel Scoutは全文検索の検索をEloquentへ提供してくれているパッケージです。
Laravel Scoutを使うことで、検索インデックスを自動的にEloqunetのレコードと同期してくれます。

標準ではAlgoliaドライバを提供していますが、カスタムドライバも簡単に書くことが可能。

Mailableオブジェクトの追加

Mailableオブジェクトの追加により、メッセージ情報などをクラス化出来るようになりました。

アップロードされたファイルの保存が簡単に

アップロードされたファイルをすぐ保存できるメソッド、storeメソッドが追加されました。
以前まではStorageクラスを利用する必要がありました。

$path = $request->file('avatar')->store('avatars', 's3');

Laravel Elixirが更新

Laravel Elixirが更新され、Webpack+RollupでのJavaScriptのバンドルが標準になりました。

Laravel5.4

Markdownを利用してメールや通知のViewを書けるようになりました。

利用は簡単で、markdownというメソッドが提供されるようになっているため、そのmarkdownメソッドを利用して指定すればOKです。

Laravel Dusk

Laravel Duskはブラウザテスト及び、APIのテストを提供します。
従来のSeleniumなどでのテストも可能ですが、ChromeDriverを利用したテストも可能です。

Laravel ElixirがLaravel Mixへ

Laravel Elixirは名前を変え、Laravel Mixとなりました。
Laravel Mixからはgulpを利用せず、Webpackベースになりました。

Blade ComponentsとSlotの追加

Bladeの1ファイルをコンポーネントとみなし、そのcomponentへ注入出来るSlotが追加されました。
これはおそらくVueの機能をLaravelへ落としたものだと考えられます。

<!-- /resources/views/alert.blade.php -->

<div class="alert alert-danger">
    {{ $slot }}
</div>
@component('alert')
    <strong>Whoops!</strong> Something went wrong!
@endcomponent

上記の様に@componentディレクティブでalertコンポーネントを呼び出し、$slotに対象の情報が入ります。

複数のslotを用意したい場合には以下のように出来ます。

<!-- /resources/views/alert.blade.php -->

<div class="alert alert-danger">
    <div class="alert-title">{{ $title }}</div>

    {{ $slot }}
</div>
@component('alert')
    @slot('title')
        Forbidden
    @endslot

    You are not allowed to access this resource!
@endcomponent

Bloadcastへのモデルのバインディングが可能に

5.2で追加されたルーティングのモデルのバインディングと同じものです。

Broadcast::channel('order.{order}', function ($user, App\Order $order) {
    return $user->id === $order->user_id;
});

CollectionでHigher Order Messagesをサポート

うまい訳が見当たらなかったのですが、以下のようなことがcontains,each,every,filter,first,map,partition,reject,sortBy,sortByDesc,sumで行うことが出来ます。

$invoices->each(function($invoice) {
    $invoice->pay();
});

これが

$invoices->each->pay();

に出来るようになります。

また、sumメソッドに関してはコレクションに含まれる数値のプロパティを足した結果を返すようなことが出来ます。

// $usersのコレクションのvotesの合計を返します。
return $users->sum->votes;

正直ソースが把握しにくくなりそうな気がして使うべきか迷うところです。

オブジェクトベースのEloquentイベント

Eloquentのイベントをイベントに渡すにはAppServiceProviderなどから渡す必要がありました。

User::creating(イベントクラスや無名関数);

バージョン5.4からはこれをEloquentのオブジェクトへ定義出来るようになりました。

class User extends Model
{
    protected $events = [
        'saved' => UserSaved::class,
        'deleted' => UserDeleted::class,
    ];
}

キューJobのリトライ&タイムアウト機能

キュージョブにリトライ機能とタイムアウト機能が追加されました。

class ProcessPodcast implements ShouldQueue
{
    /**
     * The number of times the job may be attempted.
     *
     * @var int
     */
    public $tries = 5;

    /**
     * The number of seconds the job can run before timing out.
     *
     * @var int
     */
    public $timeout = 120;
}

リクエストをサニタイズするミドルウェアが追加

デフォルトのmiddlewareにTrimStringsConvertEmptyStringsToNullが追加されました。
名前の通り、TrimStringsはtrimメソッドを実行するもので、ConvertEmptyStringsToNullは文字が空ならNullに変換するミドルウェアです。

リアルタイムFacade

これまでFacadeはサービスコンテナへの登録、app.phpへの登録などの作業がありました。
リアルタイムFacadeはそれを非常にシンプルにしたものです。

<?php 

namespace App\Services;

class Sample
{
    //
}

上記のようなサービスがあり、これをFacade経由で呼び出したいとします。
リアルタイムFacadeではuse文を利用するときにFacades\を前に付けるだけでリアルタイムFacadeになります。

use App\Services\Sample;
↓
use Facades\App\Services\Sample;

上記のようにすることで、自動的にFacadeになります。

カスタムPivotテーブルモデル

今まで中間テーブルにアクセスするには提供されているPivotモデルインスタンスが自動的に使われていました。
5.4からはPivotモデルを自分で定義できるようになりました。

class Role extends Model
{
    /**
     * The users that belong to the role.
     */
    public function users()
    {
        // App\Userは多対多で、App\UserRoleカスタムPivotモデルを利用して取得
        return $this->belongsToMany('App\User')->using('App\UserRole');
    }
}

改善されたRedis Clusterをサポート

よくわからないです。。。

マイグレーション時のデフォルトの文字列長が変更に

Laravel5.4は標準でutf8mb4文字セットを利用します。これは絵文字までをサポートした文字セットです。
デフォルトの文字長は191文字に変更になりました。

Laravel5.5

次期リリースのバージョンで、LTSリリースとなります。
PHP7以上が必要で、リリース自体は2017年7月以降になります。

migrate:freshコマンドの追加

migrate:freshコマンドはmigrate:refreshコマンドの短縮版と言っていいでしょう。
migrate:refreshと異なる点として、freshコマンドは一度全テーブルをdropした後にmigrateするということです。
データベースの中にLaravelアプリケーションと関係ないテーブルが含まれる場合はfreshコマンドを使ってしまうと大惨事ですね。

Pocket

 Posted by at 11:18 PM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*