5.1から5.2.0へのアップグレード
アップデートにかかる時間の見積もり:1時間以下
注意: フレームワークに影響が起きるだろう変更を包括的にリストしました。皆さんのアプリケーションの大半では、変更する必要がないものも多いでしょう。
依存パッケージの更新
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/master/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へアップグレードした時点で、既存のセッションは無効になります。
データベースセッションドライバ
ユーザ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アプリケーションへこれらの新しい機能を組み込むのも簡単です。
注目: これらのアップグレードは任意です。行わなくてもアプリケーションの実行に影響は与えません。
ポリシーディレクトリの作成
まずアプリケーションへ空の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ファイルシステムドライバを使用している場合は、コンポーザにより対応するファイルシステムパッケージを更新する必要があります。
- 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
(他のチームメンバーに参考にしてもらう値)にコピーします。
環境設定の詳細は、ドキュメントを読んでください。
注意: 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.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.
データベースマイグレーションと初期値設定
データベースに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',
キャッシュマネージャー
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をコントロールするために使用されます。
注意: Laravel4.2では、最も安全な暗号化であると考えられる、
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は、今までと変わりありません。
注意:
SoftDeletingTrait
は、ベースモデルで使用してはいけません。実際のモデルクラスで使用します。
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';
}
注意: この変更により、現在使用中の"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へアップグレード
コンポーザ依存パッケージのアップグレード
アプリケーションを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()
を使用してください。