アップグレードガイド
- Upgrading To 5.4.0 From 5.3
- 5.2から5.3.0へのアップグレード
- 5.1から5.2.0へのアップグレード
- 5.1.11へのアップグレード
- 5.1.0へのアップグレード
- 5.0.16へのアップグレード
- 4.2から5.0へのアップグレード
- 4.1から4.2へのアップグレード
- 4.1.x以下から4.1.29へのアップグレード
- 4.1.25以下から、4.1.26へのアップグレード
- 4.0から4.1へアップグレード
Upgrading To 5.4.0 From 5.3
Estimated Upgrade Time: 10 Minutes
認証
Policy Class Determination
Policies may now be bound to an interface or parent class. When determining which policy to use for a given object, a policy bound to the object's exact
- Each class has its own policy, as policies bound to exactly the given class will be found before looking for subtypes
- Or, bind your policy to the root of the inheritance tree
The getPolicyFor
Method
Previous, when calling the Gate::getPolicyFor($class)
method, an exception was thrown if no policy could be found. Now, the
method will return null
if no policy is found for the given
class. If you call this method directly, make sure you refactor your
try / catch
to a check for null
:
$policy = Gate::getPolicyFor($class);
if ($policy) {
// code that was previously in the try block
} else {
// code that was previously in the catch block
}
5.2から5.3.0へのアップグレード
アップデート見積もり時間:2時間から3時間
Note: 私達は互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかはフレームワークの明確ではない部分で行われているため、こうした変更の一部分が実際にアプリケーションに影響を与える可能性があります。
PHPとHHVM
Laravel 5.3 requires PHP 5.6.4 or higher. HHVM is no longer officially supported as it does not contain the same language features as PHP 5.6+.
非推奨
Laravel 5.2アップグレードガイドにリストされていた非推奨の機能はすべて、フレームワークから取り除かれました。このリストを見直し、これらの非推奨機能を既に使用していないことを確認してください。
アプリケーションサービスプロバイダ
EventServiceProvider
、RouteServiceProvider
、RouteServiceProvider
クラスのboot
メソッドから引数を取り除いてください。渡された引数の呼び出しは、同じ機能のfacadeを代わりに置き換えて、使用してください。たとえば、$dispatcher
引数のメソッドを呼び出す代わりに、Event
ファサードをシンプルに呼び出してください。同様に、$router
引数のメソッド呼び出しの代わりに、Route
ファサードを呼び出してください。$gate
引数を呼び出す代わりに、Gate
ファサードを呼び出してください。
Note: メソッド呼び出しをファサードへ書き換える際は、サービスプロバイダでそのファサードを確実にインポートしてください。
配列
キー/値順序変更
Arr
クラスのfirst
、last
、where
メソッドに渡すクロージャの、最初の引数として「値」が渡されます。例をご覧ください。
Arr::first($array, function ($value, $key) {
return ! is_null($value);
});
以前のバージョンのLaravelでは、$key
が最初に渡されていました。ほとんどのユースケースでは、$value
だけに関心がありますので、最初に渡るようになりました。アプリケーション「全体を検索」して、これらのメソッドを見つけ、クロージャの最初の引数として$value
を受け取ることを確認してください。
Artisan
make:console
コマンド
make:console
コマンドは、make:command
へ名前が変更になりました。
認証
認証 Scaffolding
フレームワークが提供する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
メソッドをクロージャと一緒に呼び出す時、$this
はCacheManager
インスタンスと結合されていますので、クロージャの中からメソッドを呼び出すことができます。
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と互換性のある内部メソッドをいくつかアップグレードしていますが、互換性を崩す変更はありません。
コレクション
キー/値順序変更
first
、last
、contains
コレクションメソッドでは、指定されたコールバッククロージャの第1引数に「値」が渡されます。例をご覧ください。
$collection->first(function ($value, $key) {
return ! is_null($value);
});
以前のバージョンのLaravelでは、$key
が最初に渡されていました。ほとんどのユースケースでは、$value
だけに関心がありますので、最初に渡るようになりました。アプリケーション「全体を検索」して、これらのメソッドを見つけ、クロージャの最初の引数として$value
を受け取ることを確認してください。
コレクションwhere
はデフォルトで「緩い」比較方法へ
コレクションのwhere
メソッドのデフォルト比較方法が、厳格な比較から、「緩い」比較になりました。厳格な比較をしたい場合は、whereStrict
メソッドを使ってください。
さらに、where
メソッドは「厳格さ」を表す第3パラメータを取らなくアンリました。アプリケーションの必要性に応じて、where
かwhereStrict
を明確に呼び出してください。
コントローラ
コンストラクタ中のセッション
以前のバージョンの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
インスタンスにしたくない場合は、クエリビルダのget
やpluck
メソッドにall
メソッドをチェーンしてください。これにより、結果としてプレーンな配列が返され、後方互換生が保てます。
$users = DB::table('users')->get()->all();
$usersIds = DB::table('users')->pluck('id')->all();
Eloquentの$morphClass
プロパティ
Eloquentモデルで定義されていた、「morphマップ」を定義するための$morphClass
プロパティーは削除されました。以前サポートされていたmorphマップの定義は、Eagerローディングをサポートし、ポリモーフィックリレーションの余計なバグを解決するために提供されていました。以前の$morphClass
プロパティを使用していたばあい、以下の記法によりmorphMap
へ切り替える必要があります。
Relation::morphMap([
'YourCustomMorphName' => YourModel::class,
]);
たとえば、もしこれまで次のような$morphClass
を定義をしていたら:
class User extends Model
{
protected $morphClass = 'user'
}
AppServiceProvider
のboot
メソッドで、以下のようにmorphMap
を定義する必要があります。
use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
'user' => User::class,
]);
Eloquentのsave
メソッド
Eloquentのsave
メソッドは、最後に取得、もしくは保存してから変更がない場合に、false
を返すようになりました。
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
イベントデータの変更
JobProcessing
やJobProcessed
のような多くのキュージョブイベントでは、$data
プロパティを含まなくなりました。同じ情報を取得するために、$event->job->payload()
を呼び出すように、アプリケーションを更新してください。
データベース Driver Changes
キュー済みのジョブの保存にdatabase
ドライバを使用している場合、jobs_queue_reserved_reserved_at_index
インデックスをドロップし、それからjobs
テーブルのreserved
カラムをドロップしてください。このカラムはdatabase
ドライバを使用時に、必要なくなりました。この変更を完了したら、queue
とreserved_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');
});
}
プロセスコントロール拡張
アプリケーションで、--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
を補足するように変更してください。
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"
を追加してください。
認証
設定 File
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\UnauthorizedException
はIlluminate\Auth\Access\AuthorizationException
へリネームされました。この例外を自分で補足していない限り、アプリケーションに影響は通常ありません。
コレクション
Eloquentベースコレクション
Eloquentコレクションインスタンスのpluck
、keys
、zip
、collapse
、flatten
、flip
メソッドは、ベースコレクション(Illuminate\Support\Collection
)を返すようになりました。
キーの保存
slice
、chunk
、reverse
メソッドは、コレクションにキーを残すようになりました。これらのメソッドでキーを保存したくない場合は、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
プロパティにdate
やdatetime
として追加した属性が、文字列に変換されるようになりました。これにより、日付キャスト変換が$dates
配列で指定された日付と一貫性が取れるようになりました。
グローバルスコープ
グローバルスコープの実装が、とても使いやすくなるように実装しなおしました。グローバルスコープにはremove
メソッドは必要なくなりました。そのため、既に書かれたグローバルスコープから削除してください。
裏で動作しているクエリビルダインスタンスへアクセスするため、EloquentクエリビルダのgetQuery
を呼び出しているなら、toBase
を呼び出すようにしてください。
何らかの理由により、remove
メソッドを直接呼び出している場合、代わりに$eloquentBuilder->withoutGlobalScope($scope)
のように呼び出してください。
新しくwithoutGlobalScope
とwithoutGlobalScopes
メソッドを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キュードライバーはそれ自身のパッケージから削除されたため、コアフレームワークには含まれなくなりました。
http://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のリリースで削除されます。
Illuminate\Contracts\Bus\SelfHandling
契約。ジョブから削除してください。- コレクション、クエリビルダ、Eloquentクエリビルダオブジェクトの
lists
メソッドはpluck
ヘリネームされました。メソッドの使い方は同じです。 Route::controller
を使う暗黙のコントローラルート定義は非推奨になりました。ルートファイルで明確に定義してください。これはパッケージから削除されます。get
、post
やその他のルート定義ヘルパ関数は削除されます。代わりにRoute
ファサードを使ってください。- 5.1の
database
セッションドライバーはlegacy-database
ヘリネームされ、削除予定です。前述の「データベースセッションドライバ」をお読みください。 - PHPが持っている
random_bytes
関数がより好ましいため、Str::randomBytes
関数は非推奨になりました。 - PHPが持っている
hash_equals
関数がより好ましいため、Str::equals
関数は非推奨になりました。 Illuminate\Support\HtmlString
がより好ましいため、Illuminate\View\Expression
は非推奨になりました。WincacheStore
キャッシュドライバーは削除されました。
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.php
、routes.php
、config.php
、services.json
など一時的な最適化のためのファイルをフレームワークが保存するために使用します。
BroadcastServiceProvider
プロバイダ追加
config/app.php
設定ファイルのproviders
配列にIlluminate\Broadcasting\BroadcastServiceProvider
を追加します。
認証
AuthenticatesAndRegistersUsers
トレイトを使用しているAuthController
を使用している場合は、新しいユーザのバリデーションと生成方法に多少変更が必要です。
最初に、Guard
とRegistrar
をベースのコンストラクターに渡す必要は無くなりました。コントローラーのコンストラクターから、これらの依存指定を削除できます。
次に、Laravel5.0で使用していたApp/Services/Registrar
クラスは必要ありません。このクラスからvalidator
とcreate
メソッドをそのまま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:command
とhandler:command
Artisanコマンドも続けて使用できます。
同様に、app/Handlers
ディレクトリはapp/Listeners
に名前が変更され、イベントリスナだけが含まれるようになりました。しかし、既に存在するコマンドとイベントハンドラを移動したり、名前を変えたりする必要はありません。handler:event
コマンドもイベントハンドラを生成するために続けて使用できます。
Laravel5.0フォルダー構造との後方互換性を提供しているので、アプリケーションをLaravel5.1へアップグレードし、都合の良い時にイベントとコマンドを新しい場所へゆっくりアップグレードしてください。
Blade
BladeコンパイラーからcreateMatcher
、createOpenMatcher
、createPlainMatcher
メソッドが削除されました。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により対応するファイルシステムパッケージを更新する必要があります。
- Amazon S3:
league/flysystem-aws-s3-v3 ~1.0
非推奨
以下の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_ENV
やAPP_KEY
(暗号化キー)、データベース接続情報、キャッシュやセッションのドライバのような値を適切に設置してください。
さらに、古い.env.php
ファイル中で変更した値を.env
(ローカル環境で本当に使用される値)と.env.example
(他のチームメンバーに参考にしてもらう値)にコピーします。
環境設定の詳細は、ドキュメントを読んでください。
Note: Laravel5アプリケーションを本番サーバーへデプロイする前に、適切な値を設置した
.env
ファイルを用意しておく必要があります。
設定 Files
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.php
のboot()
メソッドの中へコピーします。app/Providers/RouteServiceProvider.php
にuse Illuminate\Support\Facades\Route;
の1行を追加し、Route
ファサードを使い続けられるようにします。
auth
とcsrf
のような、Laravel4デフォルトフィルターは移動しないでください。ミドルウェアとしてLaravel5に用意されています。ルートやコントローラーで、古いデフォルトフィルターの使用箇所(例えば、['before' => 'auth']
)を新しいミドルウェアを使用するように書き換えてください。(例えば、['middleware' => 'auth']
)
フィルターはLaravel5でも廃止されていません。カスタムフィルターを定義して、before
とafter
を使用し指定できます。
グローバルCSRF
デフォルトで、CSRF保護が、全ルートで有効になりました。これを無効にするか、特定のルートだけに手動で有効にしたいのでしたら、以下の行をApp\Http\Kernel
ファイル中のmiddleware
配列から削除してください。
'App\Http\Middleware\VerifyCsrfToken',
続いて、次の1行を$routeMiddleware
に追加します。
'csrf' => 'App\Http\Middleware\VerifyCsrfToken',
これで、個別のルート/コントローラーに対し、['middleware' => 'csrf']
を指定することで、ミドルウェアを追加できるようになります。ミドルウェアの詳細は、ドキュメントを参照してください。
Eloquentモデル
Eloquentモデルを設置するために、app/Models
ディレクトリを作成することもできます。その場合、このディレクトリをcomposer.json
のclassmap
ディレクティブへ追加してください。
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\RemindableTrait
とIlluminate\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
を追加します。
Then, copy your list of Artisan commands from
start/artisan.php
into the commands
array of
the app/Console/Kernel.php
file.
データベース Migrations & Seeds
データベースに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.yml
、bower.json
、その他の似たようなツールの設定ファイルなどです。
SassやLess、CoffeeScriptをお好きな場所へ移動しましょう。resources/assets
ディレクトリがデフォルトの場所として最適でしょう。
FormとHTMLヘルパ
FormかHTMLヘルパを使用している場合、class 'Form' not found
かclass 'Html' not found
のエラーになります。FormとHTMLヘルパはLaravel5.0には含まれなくなりました。しかし、Laravel
Collectiveによりメンテナンスされているコミュニティー主体の代替パッケージが存在しています。
例えば、"laravelcollective/html": "~5.0"
をcomposer.json
のrequire
セクションへ追加してください。
それから、FormとHTMLファサードとサービスプロバイダを追加する必要があります。config/app.php
を編集し、providers
配列に以下の行を追加します。
'Collective\Html\HtmlServiceProvider',
次に、aliases
配列へ以下を追加します。
'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',
キャッシュManager
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以上が必要です。
暗号化 Defaults
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\Factory
とIlluminate\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
設定ファイル中のaliases
とproviders
配列を更新します。変更する内容はこのファイルで確認して下さい。自分で追加したサービスプロバーダーとエイリアスを書き戻すのを忘れないで下さい。
新規に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()
を使用してください。