Laravel 5.3 アップグレードガイド

5.2から5.3.0へのアップグレード

アップデート見積もり時間:2時間から3時間

Note: 私達は互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかはフレームワークの明確ではない部分で行われているため、こうした変更の一部分が実際にアプリケーションに影響を与える可能性があります。

依存パッケージのアップデート

composer.jsonファイルのlaravel/framework依存パッケージを5.3.*へアップデートしてください。

さらに、composer.jsonファイルのrequire-devセクションにある、symfony/css-selectorsymfony/dom-crawlerの依存を3.1.*にアップグレードしてください。

PHPとHHVM

Laravel5.3はPHP5.6.4以上が必要です。HHVMは公式にサポートされなくなりました。PHP5.6以降と同じ言語機能を含んでいないためです。

非推奨

Laravel 5.2アップグレードガイドにリストされていた非推奨の機能はすべて、フレームワークから取り除かれました。このリストを見直し、これらの非推奨機能を既に使用していないことを確認してください。

アプリケーションサービスプロバイダ

EventServiceProviderRouteServiceProviderRouteServiceProviderクラスのbootメソッドから引数を取り除いてください。渡された引数の呼び出しは、同じ機能のfacadeを代わりに置き換えて、使用してください。たとえば、$dispatcher引数のメソッドを呼び出す代わりに、Eventファサードをシンプルに呼び出してください。同様に、$router引数のメソッド呼び出しの代わりに、Routeファサードを呼び出してください。$gate引数を呼び出す代わりに、Gateファサードを呼び出してください。

Note: メソッド呼び出しをファサードへ書き換える際は、サービスプロバイダでそのファサードを確実にインポートしてください。

配列

キー/値順序変更

Arrクラスのfirstlastwhereメソッドに渡すクロージャの、最初の引数として「値」が渡されます。例をご覧ください。

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

以前のバージョンのLaravelでは、$keyが最初に渡されていました。ほとんどのユースケースでは、$valueだけに関心がありますので、最初に渡るようになりました。アプリケーション「全体を検索」して、これらのメソッドを見つけ、クロージャの最初の引数として$valueを受け取ることを確認してください。

Artisan

make:consoleコマンド

make:consoleコマンドは、make:commandへ名前が変更になりました。

認証

認証スカフォールド

フレームワークが提供する2つの認証コントローラは、4つの小さなコントローラへと分割されました。この変更によりデフォルトでも、きれいで、役割に集中したコントローラになりました。アプリケーションを新しいコントローラへアップグレードする一番簡単な方法は、GitHubから真新しい各コントローラをコピーし、アプリケーションに設置してください。

さらに、routes/web.phpファイルの中で、Auth::routes()メソッドを確実に呼び出してください。このメソッドは、新しい認証コントローラのルートを確実に登録します。

アプリケーションに新しいコントローラを設置できたら、もとのコントローラに対して行ったカスタマイズを再実装する必要があります。たとえば、認証に使用する認証ガードをカスタマイズしていたら、コントローラのguardメソッドをオーバーライドする必要があります。どのメソッドをオーバーライドすればよいのかを決めるため、認証コントローラのトレイトの内容を調べてください。

Tip!! 認証コントローラをカスタマイズしていない場合は、GitHubから新しいコントローラをコピー、設置し、routes/web.phpファイルでAuth::routesメソッドを呼び出すだけです。

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

パスワードリセットはLaravelの新しい通知機能を使っています。パスワードリセットリンクを送る時に、通知を送るようにカスタマイズしたい場合は、Illuminate\Auth\Passwords\CanResetPasswordトレイトのsendPasswordResetNotificationメソッドをオーバーライドしてください。

パスワードリセットリンクメールを送るために、Userモデルで新しいIlluminate\Notifications\Notifiableトレイトをuseする必要があります

<?php

namespace App;

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

class User extends Authenticatable
{
    use Notifiable;
}

Note: config/app.php設定ファイルの、providers配列へ、Illuminate\Notifications\NotificationServiceProviderを登録し忘れないでください。

ログアウトのためのPOST

Auth::routesメソッドは/logoutのルートをGETの代わりにPOSTとして登録するようになりました。これにより、他のWebアプリケーションが皆さんのアプリケーションからユーザをログアウトするのを防ぎます。アップグレードするには、ログアウトリクエストでPOST動詞を使用するように変更するか、自身の/logout URIに対するGETルートを登録してください。

Route::get('/logout', 'Auth\LoginController@logout');

認証

ポリシーメソッドの呼び出し時のクラス名

いくつかのポリシーメソッドでは、現在認証済みユーザを受け取りますが、認可するモデルのインスタンスを必要としません。この状況はcreateアクションの認証時が一番顕著に起きます。たとえば、あなたがブログを作成している場合、どんなポストでも作成できる認可を持つユーザであるかをチェックしたいと思うことでしょう。

モデルインスタンスを受け取らない、createメソッドのようなポリシーメソッドを定義する時に、メソッドの第2引数としてクラス名は渡されなくなりました。メソッドは認証ユーザインスタンスだけを受け取るようにしなくてはなりません。

/**
 * 指定されたユーザがポストを作成できるか判断する
 *
 * @param  \App\User  $user
 * @return bool
 */
public function create(User $user)
{
    //
}

AuthorizesResourcesトレイト

AuthorizesResourcesトレイトは、AuthorizesRequestsトレイトにマージされました。app/Http/Controllers/Controller.phpファイルから、AuthorizesResourcesトレイトを削除してください。

Blade

カスタムDirectives

以前のバージョンのLaravelでは、directiveメソッドを使い、カスタムBladeディレクティブを登録したとき、一番外側のカッコの内容を含む$expressionがディレクティブのコールバックに渡されていました。Laravel5.3では、ディレクティブのコールバックに、一番外側のカッコは渡されません。Blade拡張のドキュメントを確認し、皆さんのカスタムBlaseディレクティブが確実に動作するかを確認してください。

ブロードキャスト

サービスプロバイダ

Laravel5.3のイベントブロードキャストは大きな進歩をしました。 ファイル内容をGitHubで確認しapp/Providersディレクトリに新しいBroadcastServiceProviderを追加してください。新しいサービスプロバイダが定義できたら、config/app.php設定ファイルのproviders配列へ追加してください。

キャッシュ

拡張のクロージャ結合と$this

Cache::extendメソッドをクロージャと一緒に呼び出す時、$thisCacheManagerインスタンスと結合されていますので、クロージャの中からメソッドを呼び出すことができます。

Cache::extend('memcached', function ($app, $config) {
    try {
        return $this->createMemcachedDriver($config);
    } catch (Exception $e) {
        return $this->createNullDriver($config);
    }
});

Cashier

Cashierを使っている場合は、laravel/cashierパッケージを~7.0のリリースにアップグレードしてください。このCashierのリリースでは、Laravel5.3と互換性のある内部メソッドをいくつかアップグレードしていますが、互換性を崩す変更はありません。

コレクション

キー/値順の変更

firstlastcontainsコレクションメソッドでは、指定されたコールバッククロージャの第1引数に「値」が渡されます。例をご覧ください。

$collection->first(function ($value, $key) {
    return ! is_null($value);
});

以前のLaravelでは$keyが最初に渡されていました。ほとんどのケースでは$valueにのみ関心がありますので、今回から最初に渡しています。これらのメソッドをアプリケーション「全体に対し検索」し、クロージャの第1引数に$valueが渡されるように修正してください。

コレクションwhereはデフォルトで「緩い」比較方法へ

コレクションのwhereメソッドのデフォルト比較方法が、厳格な比較から、「緩い」比較になりました。厳格な比較をしたい場合は、whereStrictメソッドを使ってください。

さらに、whereメソッドは「厳格さ」を表す第3パラメータを取らなくアンリました。アプリケーションの必要性に応じて、wherewhereStrictを明確に呼び出してください。

設定

アプリケーション名

config/app.php設定ファイルの中に、以下の設定オプションを追加してください。

'name' => 'アプリケーション名',

コントローラ

コンストラクタ中のセッション

以前のバージョンのLaravelでは、コントローラのコンストラクタでセッション変数や認証族ユーザにアクセスできました。これはフレームワークの機能として、明確に意図したものではありません。Laravel5.3では、セッションや認証済みユーザにコントローラのコンストラクタではアクセスできません。なぜなら、ミドルウェアがまだ実行されていないからです。

代わりに、クロージャベースのミドルウェアをコントローラのコンストラクタで直接で意義できます。この機能を使用する前に、アプリケーションがLaravel5.3.4以上で実行されていることを確認してください。

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class ProjectController extends Controller
{
    /**
     * 現在のユーザの全プロジェクト
     */
    protected $projects;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}

もちろん、コントローラアクションで、Illuminate\Http\Requestクラスをタイプヒントで指定することで、リクエストセッションデータや認証済みユーザへアクセスすることもできます。

/**
 * 現在のユーザの全プロジェクトを表示
 *
 * @param  \Illuminate\Http\Request  $request
 * @return Response
 */
public function index(Request $request)
{
    $projects = $request->user()->projects;

    $value = $request->session()->get('key');

    //
}

データベース

コレクション

Fluentなクエリビルダが普通の配列の代わりに、Illuminate\Support\Collectionインスタンスを返すようになりました。これに予知、クエリビルダとEloquentにより返されるタイプに一貫性がもたらされました。

もし、クエリビルダの結果をCollectionインスタンスにしたくない場合は、クエリビルダのgetpluckメソッドにallメソッドをチェーンしてください。これにより、結果としてプレーンな配列が返され、後方互換生が保てます。

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

$usersIds = DB::table('users')->pluck('id')->all();

Eloquent のgetRelationメソッド

EloquentのgetRelationメソッドは、リレーションをロードできない場合にBadMethodCallExceptionを投げなくなりました。代わりにIlluminate\Database\Eloquent\RelationNotFoundExceptionが投げられるようになりました。この変更は、BadMethodCallExceptionをあなたのソースコード中でキャッチしている場合のみ、影響があります。

Eloquentの$morphClassプロパティ

Eloquentモデルで定義されていた、「morphマップ」を定義するための$morphClassプロパティーは削除されました。以前サポートされていたmorphマップの定義は、Eagerローディングをサポートし、ポリモーフィックリレーションの余計なバグを解決するために提供されていました。以前の$morphClassプロパティを使用していたばあい、以下の記法によりmorphMapへ切り替える必要があります。

Relation::morphMap([
    'YourCustomMorphName' => YourModel::class,
]);

たとえば、もしこれまで次のような$morphClassを定義をしていたら:

class User extends Model
{
    protected $morphClass = 'user'
}

AppServiceProviderbootメソッドで、以下のようにmorphMapを定義する必要があります。

use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
    'user' => User::class,
]);

EloquentのScopes

Eloquentのスコープでは、先頭の論理型スコープ制約を尊重するようになりました。たとえば、スコープをorWhere制約で始めたとしても、通常のwhereへ変更されなくなります。この機能を使用していた場合(たとえば、ループの中で複数のorWhereをついかするなど)、論理型ロジックの問題を引き起こさないように、最初の条件は通常のwhereで始めるようにしてください。

where制約でスコープを始めている場合、変更はありません。クエリのtoSqlメソッドを使えば、クエリのSQLを確認できることを思い出してください。

User::where('foo', 'bar')->toSql();

Join節

JoinClauseクラスはクエリビルだと記法を統一するために書き直されました。on節のオプション$whereパラメータは削除されました。クエリビルダで行うように、"where"条件を追加したい場合は、明確に一つのwhereメソッドを使用してください。

$query->join('table', function ($join) {
    $join->on('foo', 'bar')->where('bar', 'baz');
});

on節のオペレータはバリデートされるようになり、不正な値を含めなくなりました。もしこの機能たとえば、$join->on('foo', 'in', DB::raw('("bar")')))に頼っている場合は、正しいWHERE節を使用し、条件を書き直してください。

$join->whereIn('foo', ['bar']);

$bindingプロパティも削除されました。JOIN結合操作には、直接addBindingメソッドを使用してください。

$query->join(DB::raw('('.$subquery->toSql().') table'), function ($join) use ($subquery) {
    $join->addBinding($subquery->getBindings(), 'join');
});

暗号化

Mcrypt暗号化クラスの削除

Mcrypt暗号化クラスは2015年6月にリリースされたLaravel5.1.0から非推奨になっていました。Laravel5.1.0以降の全リリースでデフォルト暗号化スキームとなっている、OpenSSLに基づいたより新しい暗号化実装が導入されているため、この暗号化クラスは5.3.0リリースで完全に削除されました。

Mcryptベースのcipherをまだ使用している場合は、config/app.php設定ファイルで、cipherをAES-256-CBCに更新し、php artisan key:generateで生成できるセキュアな32バイトのランダム文字列をキーとして設定してください。

Mcryptの暗号化クラスを使用し、暗号化したデータをデータベースへ保存している場合は、レガシーなMcrypt暗号化クラスの実装を含んでいる、laravel/legacy-encrypter packageをインストールしてください。このパッケージで暗号化されたデータを複合し、新しいOpenSSL暗号化クラスを使って再度暗号化してください。たとえば、次のようなカスタムArtisanコマンドで実行できます。

$legacy = new McryptEncrypter($encryptionKey);

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

    $record->save();
}

例外ハンドラ

コンストラクタ

ベース例外ハンドラクラスは、Illuminate\Container\Containerインスタンスをコンストラクタで受け取ります。この変更はアプリケーションでカスタム__constructメソッドをapp/Exceptions/Handler.phpファイル中で定義している場合のみ、影響を与えます。これを定義しているばあい、コンテナインスタンスをparent::__constructメソッドに渡す必要があります。

parent::__construct(app());

Unauthenticatedメソッド

App\Exceptions\Handlerクラスへ、unauthenticatedメソッドを追加してください。このメソッドは、認証の例外をHTTPレスポンスへ変換します。

/**
 * 認証例外を非認証レスポンスへ変換する
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Auth\AuthenticationException  $exception
 * @return \Illuminate\Http\Response
 */
protected function unauthenticated($request, AuthenticationException $exception
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest('login');
}

ミドルウェア

canミドルウェア名前空間変更

HTTPカーネルの$routeMiddlewareプロパティにリストされている、canミドルウェアは以下のクラスへアップデートしてください。

'can' => \Illuminate\Auth\Middleware\Authorize::class,

canミドルウェア認証例外

canミドルウェアは、ユーザが認証されていない場合に、Illuminate\Auth\AuthenticationExceptionのインスタンスを投げるようになりました。もし、自分で異なった例外タイプを補足している場合は、アプリケーションでこの例外をキャッチするように変更してください。ほとんどの場合は、これはアプリケーションに影響を与えません。

モデル結合ミドルウェア

Routeモデル結合はミドルウェアで実行されるようになりました。全アプリケーションで、app/Http/Kernel.phpファイルのwebミドルウェアグループに、Illuminate\Routing\Middleware\SubstituteBindingsを追加する必要があります。

\Illuminate\Routing\Middleware\SubstituteBindings::class,

さらに、モデル結合のルートミドルウェアをHTTPカーネルの$routeMiddlewareプロパティで登録する必要があります。

'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,

このミドルウェアが登録できたら、apiミドルウェアグループを追加してください。

'api' => [
    'throttle:60,1',
    'bindings',
],

通知

インストール

Laravel5.3には新しい、ドライバベースの通知システムが用意されました。config/app.php設定ファイルのProviders配列に、Illuminate\Notifications\NotificationServiceProviderを登録してください。

さらに、config/app.php設定ファイルのaliases配列へIlluminate\Support\Facades\Notificationファサードを追加します。

最後に、Illuminate\Notifications\NotifiableトレイトをUserモデルや他の通知を受け取りたいモデルでuseしてください。

ペジネーション

カスタマイズ

Laravel5.3でのペジネータが生成するHTMLのカスタマイズは、以前のLaravel5.xリリースに比べ、より簡単になっています。"Presenter"クラスを定義する代わりに、シンブルなBladeテンプレートを定義するだけです。ペジネーションビューをカスタマイズする簡単な方法は、vendor:publishコマンドを使い、resources/views/vendorディレクトリにビューを作成することです。

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

このコマンドにより、ビューがresources/views/vendor/paginationディレクトリに用意されます。このディレクトリのdefault.blade.phpファイルが、デフォルトペジネーションビューへ対応しています。ペジネーションHTMLを変更するには、このファイルを編集するだけです。

ペジネーションのドキュメントで完全な情報を確認してください。

キュー

設定

キュー設定の中の、全expire設定アイテムは、retry_afterヘリネームしてください。同様に、Beanstalk設定のttrアイテムも、retry_afterへリネームします。この名前変更により、この設定オプションの目的がよりクリアになります。

クロージャ

クロージャのキュー投入はサポートされなくなりました。アプリケーションでクロージャをキューイングしたい場合は、クロージャをクラスへ変換し、そのクラスのインスタンスをキューしてください。

dispatch(new ProcessPodcast($podcast));

コレクションのサニタライズ

Illuminate\Queue\SerializesModelsトレイトが、正しくIlluminate\Database\Eloquent\Collectionのインスタンスをシリアライズするようになりました。これにより、アプリケーションの大多数で、互換性を崩すような変更は起きていないと思われます。しかしながら、キュー済みのジョブがデータベースから再取得しないコレクションに依存している場合は、この変更がアプリケーションへ悪影響を起こさないことを確認してください。

デーモンワーカ

queue:work Artisanコマンドを呼び出す時に、--daemonオプションの指定は必要なくなりました。php artisan queue:workコマンドが自動的にデーモンモードでワーカを実行したがっていると仮定します。ジョブを一つ処理したい場合は、--onceオプションをコマンドにつけてください。

// デーモンキューワーカの起動
php artisan queue:work

// ジョブを一つ処理する
php artisan queue:work --once

データベースドライバ変更

キュー済みのジョブの保存にdatabaseドライバを使用している場合、jobs_queue_reserved_reserved_at_indexインデックスをドロップし、それからjobsテーブルのreservedカラムをドロップしてください。このカラムはdatabaseドライバを使用時に、必要なくなりました。この変更を完了したら、queuereserved_atカラムの新しい複合インデックスを追加してください。

以下は、必要な変更を実行するために使用できる、マイグレーションの例です。

public function up()
{
    Schema::table('jobs', function (Blueprint $table) {
        $table->dropIndex('jobs_queue_reserved_reserved_at_index');
        $table->dropColumn('reserved');
        $table->index(['queue', 'reserved_at']);
    });

    Schema::table('failed_jobs', function (Blueprint $table) {
        $table->longText('exception')->after('payload');
    });
}

public function down()
{
    Schema::table('jobs', function (Blueprint $table) {
        $table->tinyInteger('reserved')->unsigned();
        $table->index(['queue', 'reserved', 'reserved_at']);
        $table->dropIndex('jobs_queue_reserved_at_index');
    });

    Schema::table('failed_jobs', function (Blueprint $table) {
        $table->dropColumn('exception');
    });
}

イベントデータの変更

JobProcessingJobProcessedのような多くのジョブは、$dataプロパティを含まなくなりました。同じデータを取得するには、$event->job->payload()を呼び出すようにアプリケーションを変更してください。

失敗したジョブのイベント

AppServiceProviderの中で、Queue::failingメソッドを呼び出している場合、メソッド呼び出しを以下のように変更してください。

use Illuminate\Queue\Events\JobFailed;

Queue::failing(function (JobFailed $event) {
    // $event->connectionName
    // $event->job
    // $event->exception
});

プロセスコントロール拡張

アプリケーションでキューワーカの--timeoutオプションを使用している場合、pcntl拡張がインストールされているか確認する必要があります。

レガシースタイルのキュージョブ上のモデルシリアライズ

Laravelのジョブは、そのジョブのインスタンスをQueue::pushメソッドに渡すことによりキューされるのが典型的です。しかし、アプリケーションによっては以下のようなレガシー記法で、ジョブをキューしているかもしれません。

Queue::push('ClassName@method');

この記法を使い、ジョブをキューしていると、Eloquentモデルは自動的にシリアライズされなくなり、キューにより再取得されます。Eloquentモデルをキューで自動的にシリアライズしたい場合は、ジョブクラスでIlluminate\Queue\SerializesModelsトレイトをuseし、新しいpush記法を使用してジョブをキューしてください。

Queue::push(new ClassName);

ルーティング

リソースパラメータはデフォルトで単数形に

以前のバージョンのLaravelでは、ルートパラメータは単数形ではないRoute::resourceを使い登録していました。これはモデル結合の登録で、予期しない振る舞いを引き起こしました。例として、以下のRoute::resource呼び出しを見てみましょう。

Route::resource('photos', 'PhotoController');

showへのURIは以下のように定義されるでしょう。

/photos/{photos}

Laravel5.3では、全リソースルートのパラメータは、デフォルトで単数形です。そのため、同じRoute::resourceの呼び出しは、以下のようなURIを登録します。

/photos/{photo}

自動的に単数形のリソースルートパラメータを使うのではなく、以前の振る舞いを続けたい場合は以下のように、AppServiceProviderの中で、singularResourceParametersを呼び出してください。

use Illuminate\Support\Facades\Route;

Route::singularResourceParameters(false);

リソースルート名はプリフィックスの影響を受けない

URLプリフィックスはRoute::resource使用時に、ルートに割り付けるルート名に影響を与えなくなりました。この振る舞いは当初のルート名使用の目的全体を台無しにしてしまいました。

もしアプリケーション中に、prefixオプションを指定したRoute::group呼び出しの中で、Route::resourceを使用しているならば、全routeヘルパとUrlGenerator::route呼び出しでルート名にURIプレフィックスを付けていないことを確認してください。

この変更により、2つのるーとがおなじ名前を持つようになった場合は、2つの選択肢があります。一つは、nameオプションをRoute::resource呼び出しで指定し、カスタム名をルートへ指定する方法です。詳細は、リソースルートドキュメントを参照してください。もう一つの方法は、グループにasオプションを追加する方法です。

Route::group(['as' => 'admin.', 'prefix' => 'admin'], function () {
    //
});

バリデーション

Formリクエスト例外

フォームリクエストのバリデーションに失敗すると、LaravelはHttpExceptionインスタンスの代わりに、Illuminate\Validation\ValidationExceptionインスタンスを投げるようになりました。フォームリクエストが投げるHttpExceptionを自分で補足している場合は、catchブロックで、代わりにValidationExceptionを補足するように変更してください。

Message Bag

Illuminate\Support\MessageBagインスタンスにメッセージが含まれているかを判定するために、hasメソッドを使用している場合、countメソッドを代わりに使用してください。hasメソッドは、Message bagに特定のキーが存在しているかを判定するを判定するのみになり、引数が必要になりました。

Nullableプリミティブ

配列、論理型、整数、数値、文字列をバリデートする場合、新しいnullableルールを指定していない限り、有効な数値として判断されなくなりました。

Validate::make($request->all(), [
    'field' => 'nullable|max:5',
]);

5.1から5.2.0へのアップグレード

アップデートにかかる時間の見積もり:1時間以下

Note: フレームワークに影響が起きるだろう変更を包括的にリストしました。しかしながら、皆さんのアプリケーションの大半では、変更する必要がないものも多いでしょう。

依存パッケージの更新

composer.jsonファイルの内容をlaravel/framework 5.2.*へ更新してください。

composer.jsonファイルのrequire-devセクションへ、"symfony/dom-crawler": "~3.0""symfony/css-selector": "~3.0"を追加してください。

認証

設定ファイル

https://github.com/laravel/laravel/blob/5.2/config/auth.phpへ、config/auth.php設定ファイルを更新してください。

新しいバージョンの内容に更新したら、古い設定ファイルの内容を元に、認証設定オプションを指定してください。Laravel5.1で使用できるEloquentベースの認証サービスが一般的には使われていますが、ほとんどの値はそのまま使用できるでしょう。

新しいauth.php設定ファイルのpasswords.users.email設定オプションへ特に注意を払ってください。デフォルトではLaravel5.2で変更になったらビューへのパスになっていますので、これがアプリケーションの実際のビューパスと一致しているか確認してください。新しい設定ファイルのデフォルト値が実際のビューと一致していない場合は、設定オプションをそれに合わせて変更してください。

契約

Illuminate\Contracts\Auth\Authenticatable契約を実装しているが、Authenticatableトレイトを使っていない場合は、新しいgetAuthIdentifierNameメソッドをその契約の実装に追加してください。通常、このメソッドはauthenticatableエンティティの「主キー」のカラム名を返します。たとえば、idです。

このインターフェイスを自分で実装していない限り、アプリケーションに影響することはまずないでしょう。

カスタイムドライバ

ユーザを取得するカスタムメソッドを定義するAuth::extendメソッドを使っている場合、カスタムユーザプロバイダを定義するためのAuth::providerを使ってください。カスタムプロバイダを定義したら、新しいauth.php設定ファイルのproviders配列の中でそれを設定してください。

カスタム認証プロバイダについての詳細は、認証の完全なドキュメントで調べてください。

リダイレクト

Illuminate\Foundation\Auth\AuthenticatesUsersからloginPath()メソッドが削除されました。そのため、AuthController$loginPath変数を設定しておく必要が無くなりました。デフォルトで、認証エラーがあった場合、トレイトがデフォルトで以前の場所へ毎回リダイレクトします。

認証

Illuminate\Auth\Access\UnauthorizedExceptionIlluminate\Auth\Access\AuthorizationExceptionへリネームされました。この例外を自分で補足していない限り、アプリケーションに影響は通常ありません。

コレクション

Eloquentベースコレクション

Eloquentコレクションインスタンスのpluckkeyszipcollapseflattenflipメソッドは、ベースコレクション(Illuminate\Support\Collection)を返すようになりました。

キーの保存

slicechunkreverseメソッドは、コレクションにキーを残すようになりました。これらのメソッドでキーを保存したくない場合は、Collectionインスタンスのvaluesメソッドを使ってください。

Composerクラス

Illuminate\Foundation\ComposerクラスはIlluminate\Support\Composerクラスへ移動しました。このクラスを直接使っていない限り、アプリケーションに通常影響しないでしょう。

コマンドバスとハンドラ

自己処理コマンドバス

ジョブやコマンドのSelfHandling契約を実装する必要は、もうありません。全ジョブは現在デフォルトで、自己処理型になりました。そのためクラスから、このインターフェイスは取り除いてください。

コマンドバスとハンドラの分離

Laravel5.2コマンドバスは自己処理コマンドのみのサポートとなったため、コマンドとハンドラーの分離はもうサポートされません。

続けてコマンドとハンドラを分けて使いたい場合は、後方コンパチブルをサポートしているLaravel Collectiveパッケージをインストールしてください。(https://github.com/LaravelCollective/bus

設定

環境値

app.php設定ファイルのenvオプションにデフォルト値が追加され、以下のようになりました。

'env' => env('APP_ENV', 'production'),

キャッシュとenv

config:cacheコマンドを開発中に使っている場合、設定ファイル中からのみenv関数を呼び出しており、アプリケーションの他の場所では使用していないことを確実に確かめるべきです。

アプリケーション内部でenvを呼び出しているなら、envの呼び出しをconfigへ変換できるように、設定ファイルには実際の設定値を追加し、代わりにその場所からenvを呼び出す方法を強く推奨します。

コンパイル済みクラス

config/compile.phpの中のfiles配列に、以下の2行があれば削除してください。

realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'),

上記のサービスプロバイダーが存在していないと、php artisan optimizeを実行時にエラーがでます。

CSRFバリデーション

CSRFバリデーションはユニットテスト時に自動的に実行されなくなりました。アプリケーションには影響はないでしょう。

データベース

MySQLの日付

MySQL5.7以降では、strictモードがデフォルトで有効になったため、0000-00-00 00:00:00が有効な日付として取り扱われなくなりました。全タイムスタンプカラムは、データベースにレコードを挿入する時に、有効なデフォルト値を指定する必要があります。現時点のタイムスタンプをタイムスタンプカラムのデフォルト値にするため、マイグレーションでuseCurrentメソッドを使うか、null値を許可するためにnullableメソッドを指定してください。

$table->timestamp('foo')->nullable();

$table->timestamp('foo')->useCurrent();

$table->nullableTimestamps();

MySQL JSONカラムタイプ

jsonカラムはMySQLドライバにより、実際のJSONカラムが生成されるようになりました。MySQL5.7位上を使用していない場合、このカラムタイプは使用できません。代わりにtextカラムをマイグレーションで使用してください。

シーディング

データベースシーディング(初期値設定)を実行時、全Eloquentモデルは保護されなく(unguard)なりました。以前はModel::unguard()の呼び出しが必要でした。シーディング中にモデルの保護が必要であれば、DatabaseSeederクラスのトップでModel::reguard()を呼び出してください。

Eloquent

日付キャスト

モデルやモデルのコレクションでtoArrayを呼び出した時に、$castsプロパティにdatedatetimeとして追加した属性が、文字列に変換されるようになりました。これにより、日付キャスト変換が$dates配列で指定された日付と一貫性が取れるようになりました。

グローバルスコープ

グローバルスコープの実装が、とても使いやすくなるように実装しなおしました。グローバルスコープにはremoveメソッドは必要なくなりました。そのため、既に書かれたグローバルスコープから削除してください。

裏で動作しているクエリビルダインスタンスへアクセスするため、EloquentクエリビルダのgetQueryを呼び出しているなら、toBaseを呼び出すようにしてください。

何らかの理由により、removeメソッドを直接呼び出している場合、代わりに$eloquentBuilder->withoutGlobalScope($scope)のように呼び出してください。

新しくwithoutGlobalScopewithoutGlobalScopesメソッドをEloquentクエリビルダへ追加しました。$model->removeGlobalScopes($builder)の呼び出しは、$builder->withoutGlobalScopes()へ変更してください。

主キー

デフォルトでEloquentは主キーが整数と仮定しており、整数へ自動的にキャストしています。整数ではない主キーを使用している場合、Eloquentモデルの$incrementingプロパティをオーバーライドし、falseにしてください。

/**
 * IDが自動増分
 *
 * @var bool
 */
public $incrementing = true;

イベント

コアイベントオブジェクト

Laravelが発行するコアイベントのいくつかが、文字列と動的パラメータの代わりに、イベントオブジェクトを使うようになりました。以下のリストは、旧イベント名とオブジェクトベースの対応するイベントクラスです。

旧イベント名 新イベントクラス
artisan.start Illuminate\Console\Events\ArtisanStarting
auth.attempting Illuminate\Auth\Events\Attempting
auth.login Illuminate\Auth\Events\Login
auth.logout Illuminate\Auth\Events\Logout
cache.missed Illuminate\Cache\Events\CacheMissed
cache.hit Illuminate\Cache\Events\CacheHit
cache.write Illuminate\Cache\Events\KeyWritten
cache.delete Illuminate\Cache\Events\KeyForgotten
connection.{name}.beginTransaction Illuminate\Database\Events\TransactionBeginning
connection.{name}.committed Illuminate\Database\Events\TransactionCommitted
connection.{name}.rollingBack Illuminate\Database\Events\TransactionRolledBack
illuminate.query Illuminate\Database\Events\QueryExecuted
illuminate.queue.before Illuminate\Queue\Events\JobProcessing
illuminate.queue.after Illuminate\Queue\Events\JobProcessed
illuminate.queue.failed Illuminate\Queue\Events\JobFailed
illuminate.queue.stopping Illuminate\Queue\Events\WorkerStopping
mailer.sending Illuminate\Mail\Events\MessageSending
router.matched Illuminate\Routing\Events\RouteMatched

各イベントオブジェクトはLaravel5.1のイベントハンドラへ渡されていたものと、完全に同じパラメータを含んでいます。たとえば、5.1.*のDB::listenを使用していたなら、5.2では次のように更新します。

DB::listen(function ($event) {
    dump($event->sql);
    dump($event->bindings);
});

新しいオブジェクトクラスを調べ、publicプロパティを確認してください。

例外ハンドラ

App\Exceptions\Handlerクラスの$dontReportプロパティは以下の例外タイプの最低1つを含むように更新してください。

use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;

/**
 * レポートしたくない例外のリスト
 *
 * @var array
 */
protected $dontReport = [
    AuthorizationException::class,
    HttpException::class,
    ModelNotFoundException::class,
    ValidationException::class,
];

ヘルパ関数

url()ヘルパ関数が、引数のパスの指定がない場合にIlluminate\Routing\UrlGeneratorを返すようになりました。

暗黙のモデル結合

Laravel5.2は「暗黙のモデル結合」を導入しました。URIに現れる識別子を元にルートとコントローラへモデルインスタンスを自動的に依存注入する新しい機能です。しかし、これによりモデルインスタンスをタイプヒントしたルートとコントローラの振る舞いがかわりました。

ルートやコントローラでモデルインスタンスをタイプヒントし、空のモデルインスタンスが注入されることを期待している場合、タイプヒントを削除し、ルートかコントローラ内で直接空のモデルを生成してください。そうしなければ、LaravelはルートURIにあるIDを元にデータベースから既存のモデルインスタンスを取得しようとします。

IronMQ

IronMQキュードライバーはそれ自身のパッケージから削除されたため、コアフレームワークには含まれなくなりました。

https://github.com/LaravelCollective/iron-queue

ジョブ/キュー

php artisan make:jobコマンドは、デフォルトで「キュー投入(queued)」ジョブクラスを定義するようになりました。「同期(sync)」ジョブを生成したい場合は、コマンド実行時に--syncオプションを付けてください。

メール

pretendメール設定オプションは削除されました。代わりにlogメールドライバを使ってください。pretendと同じ機能で、メールメッセージについてより情報がログされます。

ペジネーション

フレームワークが生成する他のURLとの一貫性を保つため、ペジネーションURLは最後のスラッシュを含まないようになりました。これがアプリケーションに影響を与えることはないでしょう。

サービスプロバイダ

app.php設定ファイルのサービスプロバイダリストから、Illuminate\Foundation\Providers\ArtisanServiceProviderを削除してください。

app.php設定ファイルのサービスプロバイダリストから、Illuminate\Routing\ControllerServiceProviderを削除してください。

セッション

認証システムの変更により、Laravel5.2へアップグレードした時点で、既存のセッションは無効になります。

データベース Session Driver

ユーザID、IPアドレス、ユーザエージェントのような情報をより含む、新しいdatabaseセッションドライバが書かれました。古いドライバーを使い続けたい場合は、session.php設定ファイルへlegacy-databaseドライバを指定してください。

新しいドライバーを使用する場合、セッションのデータベーステーブルへ、user_id (NULL値を許す整数)ip_address (NULL値を許す整数)user_agent (テキスト)カラムを追加してください。

Stringy

"Stringy"ライブラリはフレームワーク含まれなくなりました。アプリケーションで使用したい場合は、Composerを使いインストールしてください。

バリデーション

例外タイプ

ValidatesRequestsトレイトはIlluminate\Http\Exception\HttpResponseExceptionインスタンスの代わりに、Illuminate\Foundation\Validation\ValidationExceptionインスタンスを投げるようになりました。自分でこの例外を補足していなければ、アプリケーションに影響はないでしょう。

非推奨

以下の機能は5.2で非推奨になり、2016年6月の5.3のリリースで削除されます。

5.1.11へのアップグレード

Laravel5.1.11は認可ポリシーをサポートします。既存のLaravel5.1アプリケーションへこれらの新しい機能を組み込むのも簡単です。

Note: これらのアップグレードは任意です。行わなくてもアプリケーションの実行に影響は与えません。

ポリシーディレクトリの作成

まずアプリケーションへ空のapp/Policiesディレクトリを作成してください。

AuthServiceProviderとGateファサードの作成と登録

app/ProvidersディレクトリにAuthServiceProviderを作成します。 GitHubからデフォルトプロバイダの内容をコピーしてください。もしアプリケーションでカスタム名前空間を使用している場合はプロバイダの名前空間を変更してください。プロバイダを作成したら、app.php設定ファイルのproviders配列へ確実に登録してください。

さらに、Gateファサードをapp.phpファイルのaliases配列へ登録する必要もあります。

'Gate' => Illuminate\Support\Facades\Gate::class,

Userモデルの更新

手順の2つ目は、App\UserモデルへIlluminate\Foundation\Auth\Access\Authorizableトレイトのuseと、Illuminate\Contracts\Auth\Access\Authorizable契約を追加します。

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract,
                                    AuthorizableContract,
                                    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword;
}

ベースコントローラーの更新

続いて、App\Http\Controllers\ControllerベースコントローラーでIlluminate\Foundation\Auth\Access\AuthorizesRequestsトレイトをuseするように更新します。

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

5.1.0へのアップグレード

アップデートにかかる時間の見積もり:1時間以下

bootstrap/autoload.phpの更新

bootstrap/autoload.phpの中の$compiledPath変数を次のように変更してください。

$compiledPath = __DIR__.'/cache/compiled.php';

bootstrap/cacheディレクトリ作成

bootstrapディレクトリの中に、cacheディレクトリ(bootstrap/cache)を作成してください。.gitignoreファイルをこのディレクトリに以下の内容で作成してください。

*
!.gitignore

compiled.phproutes.phpconfig.phpservices.jsonなど一時的な最適化のためのファイルをフレームワークが保存するために使用します。

BroadcastServiceProviderプロバイダ追加

config/app.php設定ファイルのproviders配列にIlluminate\Broadcasting\BroadcastServiceProviderを追加します。

認証

AuthenticatesAndRegistersUsersトレイトを使用しているAuthControllerを使用している場合は、新しいユーザのバリデーションと生成方法に多少変更が必要です。

最初に、GuardRegistrarをベースのコンストラクターに渡す必要は無くなりました。コントローラーのコンストラクターから、これらの依存指定を削除できます。

次に、Laravel5.0で使用していたApp/Services/Registrarクラスは必要ありません。このクラスからvalidatorcreateメソッドをそのままAuthControllerにコピー&ペーストしてください。これ以上の変更は必要ありませんが、AuthControllerの最初でValidatorファサードとUserモデルをインポートする必要はあるでしょう。

Passwordコントローラー

Laravelに含まれているPasswordControllerは、依存をコンストラクターで要求する必要が無くなりました。5.0以下で必要であった依存は両方共取り除いてください。

バリデーション

もしベースコントローラクラスのformatValidationErrorsメソッドをオーバーライドしているなら、Illuminate\Validation\Validator具象クラスの代わりにIlluminate\Contracts\Validation\Validator契約をタイプヒントで指定する必要があります。

同様に、ベースコントローラークラスのformatErrorsメソッドをオーバーライドしているなら、Illuminate\Validation\Validator具象クラスの代わりにIlluminate\Contracts\Validation\Validator契約をタイプヒントで指定する必要があります。

マイグレーション

SQLiteデータベースのカラム名を変更したり、カラムをドロップするマイグレーションが存在する場合、composer.jsonファイルにdoctrine/dbal依存パッケージを追加し、このライブラリをインストールするために、端末でcomposer updateコマンドを実行する必要があります。

Eloquent

createメソッド

Eloquentのcreateメソッドが引数無しで呼び出せるようになりました。もしモデルのcreateメソッドをオーバーライドしている場合は、$attributes引数にデフォルト値として配列を指定してください。

public static function create(array $attributes = [])
{
    // カスタム実装…
}

findメソッド

モデルでfindメソッドをオーバーライドし、そのカスタムメソッド中でparent::find()を呼んでいるなら、Eloquentクエリビルダのfindメソッドを呼び出すように変更してください。

public static function find($id, $columns = ['*'])
{
    $model = static::query()->find($id, $columns);

    // ...

    return $model;
}

listsメソッド

Eloquentのクエリ―のlistsメソッドは通常の配列の代わりに「コレクション」インスタンスを返すようになりました。コレクションを通常の配列に変換したい場合は、allメソッドを使用してください。

User::lists('id')->all();

クエリビルダのlistsはそのまま配列を返すことに注意してください。

日付のフォーマット

これまでは保存されるEloquentの日付フィールドのフォーマットは、モデルのgetDateFormatメソッドをオーバーライドすることで変更できました。これはまだ有効ですが、メソッドをオーバーライドする代わりに、モデルインスタンスの$dateFormatプロパティーを指定するほうが簡単で便利でしょう。

日付フォーマットはモデルを配列やJSONにシリアライズするときにも適用されるようになりました。Laravelを5.0から5.1へアップグレードすると、JSONシリアライズされたデータフィールドのフォーマットは変わってしまいます。シリアライズされるモデルへ日付フォーマットを指定するには、モデルのserializeDate(DateTime $date)メソッドをオーバーライドしてください。このメソッドにより、保存されるフォーマットを変更せずに、シリアライズされるEloquentの日付フィールドのフォーマットを柔軟にコントロールできます。

コレクションクラス

sortメソッド

sortメソッドは既存のコレクションを変更する代わりに、新しいコレクションインスタンスを返すようになりました。

$collection = $collection->sort($callback);

sortByメソッド

sortByメソッドは既存のコレクションを更新する代わりに、新しいコレクションインスタンスを返すようになりました。

$collection = $collection->sortBy('name');

groupByメソッド

groupBeメソッドは親のCollectionの中の各アイテムごとにCollectionを返すようになりました。全アイテムをプレーンな配列に戻したい場合は、mapを適用してください。

$collection->groupBy('type')->map(function ($item)
{
    return $item->all();
});

listsメソッド

listsメソッドは通常の配列の代わりに「コレクション」インスタンスを返すようになりました。コレクションを通常の配列に変換したい場合は、allメソッドを使用してください。

$collection->lists('id')->all();

コマンドとハンドラ

app/Commandsディレクトリはapp/Jobsへ名前が変更されました。しかし、コマンドを全部新しい場所へ移動する必要はありませんし、make:commandhandler:command Artisanコマンドも続けて使用できます。

同様に、app/Handlersディレクトリはapp/Listenersに名前が変更され、イベントリスナだけが含まれるようになりました。しかし、既に存在するコマンドとイベントハンドラを移動したり、名前を変えたりする必要はありません。handler:eventコマンドもイベントハンドラを生成するために続けて使用できます。

Laravel5.0フォルダー構造との後方互換性を提供しているので、アプリケーションをLaravel5.1へアップグレードし、都合の良い時にイベントとコマンドを新しい場所へゆっくりアップグレードしてください。

Blade

BladeコンパイラーからcreateMatchercreateOpenMatchercreatePlainMatcherメソッドが削除されました。Laravel5.1のBladeでは新しいdirectiveメソッドでカスタムディレクティブを作成してください。Bladeの拡張のドキュメントで詳細を確認してください。

テスト

tests/TestCase.phpファイルにprotectedの$baseUrlプロパティーを追加してください。

protected $baseUrl = 'http://localhost';

言語ファイル

ベンダーパッケージの公開言語ファイルのデフォルトディレクトリが変更になりました。ベンダーパッケージ言語ファイルはresources/lang/パッケージ/{ローカル}/{名前空間}からresources/lang/ベンダー/{名前空間}/{ローカル}へ移動してください。たとえばAcme/Anvilパッケージのacme/anvil::foo名前空間、英語の言語ファイルはresources/lang/packages/en/acme/anvil/foo.phpからresources/lang/vendor/acme/anvil/en/foo.phpへ移動します。

Amazon WebサービスSDK

AWS SQSキュードライバかAWS SES メールドライバを使っている場合は、インストール済みのAWS PHP SDKをバージョン3.0へアップデートする必要があります。

Amazon S3ファイルシステムドライバを使用している場合は、Composerにより対応するファイルシステムパッケージを更新する必要があります。

非推奨

以下のLaravelの機能は非推奨になり、2015年12月にリリースされるLaravel 5.2で完全に削除されます。

  • より好ましいミドルウェアにより、ルートフィルターは非推奨となりました。
  • Illuminate\Contracts\Routing\Middleware契約は非推奨になりました。ミドルウェアには契約が必要ありません。さらに、TerminableMiddleware契約も非推奨になりました。インターフェイスの代わりに、ミドルウェアでterminateメソッドをシンプルに定義するだけです。
  • より好ましいIlluminate\Contracts\Queue\ShouldQueueにより、Illuminate\Contracts\Queue\ShouldBeQueued契約は非推奨となりました。
  • Iron.ioの「Pushキュー」は非推奨となり、通常のIron.ioキューとqueue listenersの使用が推奨されます。
  • Illuminate\Foundation\Bus\DispatchesCommandsトレイトは非推奨となりました。リネームされたIlluminate\Foundation\Bus\DispatchesJobsを使用してください。
  • Illuminate\Container\BindingResolutionExceptionは非推奨となり、代わりにIlluminate\Contracts\Container\BindingResolutionExceptionとなります。
  • サービスコンテナのbindSharedメソッドは非推奨となり、より好ましいsingletonメソッドが推奨されます。
  • Eloquentとクエリビルダのpluckメソッドは非推奨となり、valueへリネームされました。
  • コレクションのfetchメソッドは非推奨となり、pluckメソッドが推奨されます。
  • array_fetchヘルパは非推奨となり、より好ましいarray_pluckメソッドが推奨されます。

5.0.16へのアップグレード

bootstrap/autoload.phpファイル中の$compiledPath変数を変更してください。

$compiledPath = __DIR__.'/../vendor/compiled.php';

サービスプロバイダ

app.php設定ファイルのサービスプロバイダリストから、App\Providers\BusServiceProviderを削除してください。

app.php設定ファイルのサービスプロバイダリストから、App\Providers\ConfigServiceProviderを削除してください。

4.2から5.0へのアップグレード

新しくインストール、その後で移行

推奨するアップグレード方法は、新しくLaravel5.0をインストールし、それから4.2サイト独自のファイルを新しくインストールした環境へコピーすることです。コピーするファイルにはコントローラー、ルート、Eloquentモデル、Artisanコマンド、アセット、その他あなたのアプリケーション限定のコードを含みます。

まずローカル環境の新しいディレクトリへLaravel5.0アプリケーションをインストールしてください。5.0よりも新しいバージョンはインストールしないでください。最初に5.0へのマイグレーションを完了させる必要があります。各手順の詳細は、以降で紹介します。

Composerの依存とパッケージ

追加しているComposerの依存パッケージを5.0アプリケーションへコピーするのを忘れないでください。SDKのような、サードパーティのコードも忘れずに。

リリース後しばらく、Laravel限定のパッケージはLaravel5と互換性がないかも知れません。Laravel5向きの対応バージョンが用意されるか、メンテナーに確認しましょう。Composerの依存パッケージをアプリケーションに追加したら、composer updataを実行する必要があります。

名前空間

Laravel4のデフォルトでは、アプリケーションのコードに名前空間は使用されていません。そのため、例えば、全Eloquentモデルとコントローラーは、ただ「グローバル」な名前空間下に置かれています。手早く移行するには、Laravel5でも同様にグローバル名前空間下へ、それらのクラスを設置しましょう。

設定

環境変数の移行

新しい.env.exampleファイルを.envへコピーします。古いバージョンの.env.phpファイルに該当します。APP_ENVAPP_KEY(暗号化キー)、データベース接続情報、キャッシュやセッションのドライバのような値を適切に設置してください。

さらに、古い.env.phpファイル中で変更した値を.env(ローカル環境で本当に使用される値)と.env.example(他のチームメンバーに参考にしてもらう値)にコピーします。

環境設定の詳細は、ドキュメントを読んでください。

Note: Laravel5アプリケーションを本番サーバーへデプロイする前に、適切な値を設置した.envファイルを用意しておく必要があります。

設定ファイル

Laravel5.0では、特定の環境のために設定ファイルを指定する、app/config/{環境名}/ディレクトリ構造はもう使われません。代わりに、各環境に用意する.envへ設定値を移動します。それから、設定ファイル中でenv('キー', 'デフォルト値')を使用して、値にアクセスします。config/database.php設定ファイルに設定例があります。

configディレクトリ下の設定ファイルには、全環境に渡り変更しない値を直接設置するか、環境ごとに変化する値をロードするためenv()を使うか、どちらかで設定値を指定します。

.envファイルにキーを追加したら、同様に参考値を.env.exampleファイルへ追加するのを忘れないでください。これにより、あなたのチームメンバーが自分の.envファイルを作成しやすくなります。

ルート

古いroutes.phpを新しいapp/Http/routes.phpへ、コピー&貼付けしてください。

コントローラー

次に、全コントローラーをapp/Http/Controllersディレクトリへ移動します。このガイドでは名前空間を利用した以降を行わないため、composer.jsonファイルのclassmapディレクティブへ、app/Http/Controllersを追加してください。次に、app/Http/Controllers/Controller.php抽象ベースクラスから、名前空間を削除します。移行するコントローラーはこのベースクラスを拡張していることを確認してください。

app/Providers/RouteServiceProvider.phpファイルの中で、namespaceプロパティをnullに設定してください。

ルートフィルター

フィルターの定義をapp/filters.phpから、app/Providers/RouteServiceProvider.phpboot()メソッドの中へコピーします。app/Providers/RouteServiceProvider.phpuse Illuminate\Support\Facades\Route;の1行を追加し、Routeファサードを使い続けられるようにします。

authcsrfのような、Laravel4デフォルトフィルターは移動しないでください。ミドルウェアとしてLaravel5に用意されています。ルートやコントローラーで、古いデフォルトフィルターの使用箇所(例えば、['before' => 'auth'])を新しいミドルウェアを使用するように書き換えてください。(例えば、['middleware' => 'auth']

フィルターはLaravel5でも廃止されていません。カスタムフィルターを定義して、beforeafterを使用し指定できます。

グローバルCSRF

デフォルトで、CSRF保護が、全ルートで有効になりました。これを無効にするか、特定のルートだけに手動で有効にしたいのでしたら、以下の行をApp\Http\Kernelファイル中のmiddleware配列から削除してください。

'App\Http\Middleware\VerifyCsrfToken',

続いて、次の1行を$routeMiddlewareに追加します。

'csrf' => 'App\Http\Middleware\VerifyCsrfToken',

これで、個別のルート/コントローラーに対し、['middleware' => 'csrf']を指定することで、ミドルウェアを追加できるようになります。ミドルウェアの詳細は、ドキュメントを参照してください。

Eloquentモデル

Eloquentモデルを設置するために、app/Modelsディレクトリを作成することもできます。その場合、このディレクトリをcomposer.jsonclassmapディレクティブへ追加してください。

SoftDeletingTraitを使用しているモデルでは、Illuminate\Database\Eloquent\SoftDeletesを使うように変更します。

Eloquentキャッシュ

Eloquentは、クエリ結果をキャッシュするためのrememberメソッドを提供しなくなりました。Cache::remember機能を使用し、手動でクエリをキャッシュする必要があります。キャッシュの詳細は、ドキュメントに全て記載されています。

User認証モデル

UserモデルをLaravel5の認証システム向けにアップグレードするには、以下の指示に従ってください。

useブロックから、以下の行を削除する

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

useブロックに、以下の行を追加する

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

UserInterfaceとRemindableInterfaceインターフェイスを削除する

クラスで以下のインターフェイスを実装宣言する

implements AuthenticatableContract, CanResetPasswordContract

クラスの宣言で、以下のトレイトを取り込む

use Authenticatable, CanResetPassword;

この方法を取る場合、クラスのuse宣言ブロックから、Illuminate\Auth\Reminders\RemindableTraitIlluminate\Auth\UserTraitを取り除いてください。

Cashierの変更

Laravel Cashierで使用されていたトレイトとインターフェイスの名前が変更されました。BillableTraitの代わりに、Laravel\Cashier\Billableトレイトを使用してください。それとLarave\Cashier\BillableInterfaceの代わりに、Laravel\Cashier\Contracts\Billableインターフェイスを実装します。他の名前の変更はありません。

Artisanコマンド

古いapp/commandsディレクトリからコマンドクラスを全部、新しいapp/Console/Commandsディレクトリへ移動します。次に、composer.jsonファイルのclassmapディレクティブに、app/Console/Commandsを追加します。

次に、start/artisan.phpのArtisanコマンドリストをapp/Console/Kernel.phpファイルのcommand配列へコピーしてください。

データベースのマイグレーションとシーディング

データベースにusersテーブルが既に存在しているでしょうから、Laravel5.0に含まれている2つのマイグレーションを削除します。

app/database/migrationsディレクトリのマイグレートクラスを、新しいdatabase/migrationsへ移動します。初期値設定(seed)クラスをapp/database/seedsから、database/seedsへ移動します。

グローバルIoC結合

start/global.phpの中のIoC結合は全て、app/Providers/AppServiceProvider.phpファイルのregisterメソッドへ移動します。Appファサードをインポートする必要があります。

そうした結合定義をカテゴリー毎に別々のサービスプロバイダへ分割する選択肢もあります。

ビュー

app/views中のビューを新しいresources/viewsディレクトリへ移動します。

Bladeタグ変更

デフォルトでもセキュリティーを強化するために、Laravel5.0では{{ }}{{{ }}}の両Blade記法で出力がエスケープされます。新しい{!! !!}記法により、出力をエスケープせずにそのまま表示します。アプリケーションをアップデートする場合の一番安全な選択肢は、明らかにそのまま出力をしても安全なところでだけで、新しい{!! !!}記法を使うことでしょう。

しかし、古いBlade記法を使わなくてはならないのでしたら、AppServiceProvider@registerの最後に、以下の数行を追加してください。

\Blade::setRawTags('{{', '}}');
\Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}');

これは気軽に行うべきではありません。XSS攻撃に対しアプリケーションを脆弱にしてしまうかもしれません。また、{{--を使用したコメントは廃止されました。

言語ファイル

app/lang下の言語ファイルは、新しいresources/langディレクトリへ移動します。

Publicディレクトリ

4.2アプリケーションのpublicディレクトリから、公開しているアセットを新しいアプリケーションのpublicディレクトリへコピーします。5.0バージョンのindex.phpは変更しないように気をつけてください。

テスト

app/testsからテストを、新しいtestsディレクトリへ移動します。

その他のファイル

プロジェクトの他のファイルをコピーしましょう。例えば、.scrutinizer.ymlbower.json、その他の似たようなツールの設定ファイルなどです。

SassやLess、CoffeeScriptをお好きな場所へ移動しましょう。resources/assetsディレクトリがデフォルトの場所として最適でしょう。

FormとHTMLヘルパ

FormかHTMLヘルパを使用している場合、class 'Form' not foundclass 'Html' not foundのエラーになります。FormとHTMLヘルパはLaravel5.0には含まれなくなりました。しかし、Laravel Collectiveによりメンテナンスされているコミュニティー主体の代替パッケージが存在しています。

例えば、"laravelcollective/html": "~5.0"composer.jsonrequireセクションへ追加してください。

それから、FormとHTMLファサードとサービスプロバイダを追加する必要があります。config/app.phpを編集し、providers配列に以下の行を追加します。

'Collective\Html\HtmlServiceProvider',

次に、aliases配列へ以下を追加します。

'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',

キャッシュマネージャー

Laravelのキャッシュでファサードを使用せず、Illuminate\Cache\CacheManagerをコードで注入している場合、代わりにIlluminate\Contracts\Cache\Repositoryを注入してください。

ペジネーション

$paginator->links()の呼び出しを$paginator->render()へ変更してください。

$paginator->getFrom()$paginator->getTo()の呼び出しをそれぞれ$paginator->firstItem()$paginator->lastItem()へ置き換えてください。

$paginator->getPerPage()$paginator->getCurrentPage()$paginator->getLastPage()$paginator->getTotal()の呼び出しから、"get"プレフィックスを取り除いてください。(例:$paginator->perPage()

Beanstalkキュー

Laravel5.0では、"pda/pheanstalk": "~2.1"の代わりに、"pda/pheanstalk": "~3.0"が必要になります。

Remote

Remoteコンポーネントは廃止されました。

Workbench

Workbenchコンポーネントは廃止されました。

4.1から4.2へのアップグレード

PHP 5.4+

Laravel4.2を動作させるにはPHP 5.4.0以上が必要です。

暗号化のデフォルト

app/config/app.php設定ファイルに、新しいcipherオプションが追加されました。このオプションの値は、MCRYPT_RIJNDAEL_256にすべきでしょう。

'cipher' => MCRYPT_RIJNDAEL_256

この設定は、Laravelの暗号機能により使用される、デフォルトcipherをコントロールするために使用されます。

Note: Laravel4.2のデフォルトcipherは、最もセキュアなcipherと考えられているMCRYPT_RIJNDAEL_128 (AES)です。cipherをMCRYPT_RIJNDAEL_256へ戻すには、Laravel4.1以下で暗号化されたクッキー/値を解読する必要があります。

ソフトデリートは、トレイトを使用するようになりました

モデルのソフトデリートを使用している場合、softDeletesプロパティーは必要なくなりました。SoftDeletingTraitを次のように使用してください。

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class User extends Eloquent
{
    use SoftDeletingTrait;
}

それから、datesプロパティーにdeleted_atカラムを追記してください。

class User extends Eloquent
{
    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];
}

ソフトデリート操作のAPIは、今までと変わりありません。

Note: SoftDeletingTraitはベースモデルに適用できません。実際のモデルクラスでuseしてください。

View/PaginationのEnvironmentクラスの名前変更

もし、Illuminate\View\Environmentクラスか、Illuminate\Pagination\Environmentクラスを直接参照している場合、Illuminate\View\FactoryIlluminate\Pagination\Factoryを代わりに参照するように、コードを変更してください。この2つのクラスは、機能をより良く表すように名前が変更されました。

ペジネーションプレゼンテーターの引数追加

Illuminate\Pagination\Presenterクラスを拡張している場合、getPageLinkWrapper抽象メソッドに、rel引数を追加するように変更してください。

abstract public function getPageLinkWrapper($url, $page, $rel = null);

Iron.Ioキューの暗号化

Iron.ioキュードライバを使用している場合、新しいencryptオプションをキュー設定ファイルに追加する必要があります。

'encrypt' => true

4.1.x以下から4.1.29へのアップグレード

Laravel4.1.29では、全データベースドライバのカラムクオーティングが向上しました。Eloquentモデルにfillableを使用していない場合の、複数代入に関する脆弱性からアプリケーションを保護します。複数代入されるのを防ぐためにモデルにfillableプロパティを使用している場合には、アプリケーションに脆弱性はありません。しかし、guardedを使用し、ユーザがコントロールできる配列を"update"や"save”タイプの機能に渡しているのでしたら、複数代入のリスクにアプリケーションがさらされているため、4.1.29へすぐアップグレードすべきでしょう。

Laravel4.1.29へアップグレードするには、composer updateを実行するだけです。このリリースには、ソース修正が必要な変更は含まれていません。

4.1.25以下から、4.1.26へのアップグレード

Laravel 4.1.26では、"Remember me"クッキーへのセキュリティーが強化されました。このアップデート以前は、Remeberクッキーが悪意のあるユーザによりハイジャックされ、本当のユーザがアカウントのパスワードをリセットしたり、ログアウトしたりしても、クッキーが長期に渡り有効なままにされてしまいました。

今回の変更により、usersテーブル(もしくはユーザ管理を行うためのテーブル)へ、新しいremember_tokenカラムを追加する必要があります。この変更により、ユーザがアプリケーションにログインするたびに、真新しいトークンが割り当てられます。このトークンはユーザがアプリケーションからログアウトするたびに、再生成されます。この実装により、もしも"Remember me"クッキがーハイジャックされても、アプリケーションからログアウトすれば、そのクッキーは無効になります。

アップデート法

最初に、新しいremember_token(null値可能なVARCHAR(100)かTEXTなど)カラムをusersテーブルに追加してください。

次に、Eloquent認証ドライバを使用しているのであれば、Userクラスへ以下の3クラスを追加してください。

public function getRememberToken()
{
    return $this->remember_token;
}

public function setRememberToken($value)
{
    $this->remember_token = $value;
}

public function getRememberTokenName()
{
    return 'remember_token';
}

Note: この変更により、現在使用中の"Remember me"セッションは無効となるため、全ユーザはアプリケーションへの再認証を強制されます。

パッケージメンテナーの方へ

Illuminate\Auth\UserProviderInterfaceへ、新しいメソッドが2つ追加されました。実装のサンプルは、デフォルトドライバをご覧ください。

public function retrieveByToken($identifier, $token);

public function updateRememberToken(UserInterface $user, $token);

Illuminate\Auth\UserInterfaceにも、「アップデート法」で説明している、新しい3つのメソッドが追加されました。

4.0から4.1へアップグレード

Composer依存パッケージのアップグレード

アプリケーションをLaravel4.1へアップグレードするには、composer.jsonファイルの中のlaravel/frameworkのバージョンを4.1に変更します。

ファイルの置き換え

public/index.phpファイルをリポジトリーのこのファイルで置き換えてください。

artisanファイルをリポジトリーのこのファイルで置き換えてください。

設定ファイルとオプションの追加

app/config/app.php設定ファイル中のaliasesproviders配列を更新します。変更する内容はこのファイルで確認して下さい。自分で追加したサービスプロバーダーとエイリアスを書き戻すのを忘れないで下さい。

新規にapp/config/remote.phpファイルをこのリポジトリーから取得し、追加して下さい。

app/config/session.phpファイルへ新しいexpire_on_close設定オプションを追加して下さい。デフォルト値はfalseです。

app/config/queue.phpファイルへ新しいfailed設定セクションを追加して下さい。セクションのデフォルト値は以下の通りです。

'failed' => [
    'database' => 'mysql', 'table' => 'failed_jobs',
],

(オプション):app/config/view.phpファイル中のpagination設定オプションをpagination::slider-3に変更することもできます。

コントローラーの更新

もし、app/controllers/BaseController.phpが頭のところでuse文を使用していたら、use Illuminate\Routing\Controllers\Controller;use Illuminate\Routing\Controller;へ変更して下さい。

パスワードリマインダーの更新

パスワードリマインダーは自由度を増すために全体的に見なおされました。php artisan auth:reminders-controller Artisanコマンドを実行し、作成される新しいスタブコントローラーを調べてみて下さい。もしくは、更新されたドキュメントを読み、それに従ってアプリケーションを更新して下さい。

app/lang/en/reminders.php言語ファイルをこちらの更新済みファイルに合わせて変更して下さい。

環境決定の更新

セキュリティーの観点から、アプリケーションの環境を決定するためにURLのドメインはもう使用されなくなりました。これらの値は簡単に偽装でき、リクエストの環境を変更する攻撃が可能です。コンピューターのホスト名を利用するように、環境決定コードを変更して下さい。(hostnameコマンドがMac、Linux、Windowsで使用できます。)

ログファイルの単純化

今回よりLaravelは、app/storage/logs/laravel.logファイルのみを作成、使用するようになりました。しかし、この動作はapp/start/global.phpファイルで設定できるままになっています。

Trailing Slashリダイレクトの削除

bootstrap/start.phpファイルの中から、$app->redirectIfTrailingSlash()の呼び出しを削除して下さい。この機能はフレームワークに含まれている.htaccessファイルで処理されるようになったため、メソッドは必要なくなりました。

次に、Apacheの.htaccessファイルを最後のスラッシュを処理する新バージョンへ置き換えて下さい。

現在のルートへのアクセス

現在のルートへアクセスするには、Route::getCurrentRoute()の代わりに、Route::current()が使えるようになりました。

Composerの更新

以上の変更を行ったら、アプリケーションのコアファイルを更新するために、composer updateを実行して下さい!クラスのロードエラーになった場合は、updateコマンドを--no-scriptsオプションを付け、実行してみてください。ですから、composer update --no-scriptsと実行します。

ワイルドカードイベントリスナ

ワイルドカードイベントリスナは、ハンドラ関数の引数にイベントを渡さなくなりました。発行されたイベントを見つける必要がある場合は、Event::firing()を使用してください。

ドキュメント章別ページ

開発環境
ビューとテンプレート
Artisanコンソール
公式パッケージ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる