nanisore oishisou

プログラマ、ララ・ベル子さん改めArm4さんのゆるふわ奮闘記。

Laravel 4.2から5.0の変更点

おっす。オラ、ベル子。
みんな元気してたー?

この前、

Laravel 5.0から5.1の変更点

を書いてからだいぶ経ってしまいましたが、予告どおりLaravel 4.2から5.0の変更点まとめ記事をアップするよ。

と、その前に恒例の雑談を少々。

女子が無駄になんでも
「超かわいいー」
「マジかわいいねー」
「ウケるーかわいいー」
って言い合ってるのを誰でも一度は聞いたことがあると思います。

今日、Githubのタコ足の猫のステッカーを会社の人からお裾分けしてもらったんですが、
それが「超かわいいー」「マジかわいいねー」「ウケるーかわいいー」だったんですね。
だけど、そういう時に女の子がいないとどうなるかっていうと
一人かわいいのコールアンドレスポンスになってしまうわけです。

Say かわいい
かわいい!!
Say かわいい
かわいい!!

by 全部俺様

孤独を愛するベル子さんも、今日ばっかりはさすがに寂しかったです。
どんな挙動不審な子でも、リア充爆発しろを連呼してるような子でも、百歩譲って男の娘でもいいので、もう一人だけ女子(っぽい)プログラマーがいるといいなぁと思う今日このごろです。
真面目な話、うちの会社は女子も働きやすい職場だと思うので。
特にそう思う根拠は見つからないのですが、私が言うんだから間違いないです。

さて、では本題のLaravel 4.2から5.0への変更点まとめです。
最初のうちは4.2から5.0に以降する際につまづきやすいところを踏まえてまとめていたのですが、
最後のほうは、よく分からない機能もいっぱい出てくるので、単にドキュメントの翻訳になってしまいました。

そして、Laravelのドキュメントの日本語訳は、みなさんもご存知だと思いますがすでに訳されている方がいらっしゃいまして、その方の翻訳が素晴らしいので

いったい私は何をしたんだろう?(白目)

という気持ちになりましたが、英文を翻訳するという作業は、本当に内容を理解していないとできないことなので、そういう点で調べ物もいろいろすることになって、非常に勉強になるんですね。

ということで翻訳されてる方のページも貼っておきますので、私の翻訳と見比べて心の中で「俺は断然ベル子派だぜ!」と思っていただいても構いません。そちらを見ていただいても大体同じ内容です(´・ω・`)


★4.2から5.0での変更点
ーーーーーーーーーーーーーーーーーーーー
▼リリースノート

・フォルダ構造
app/modelsディレクトリが削除され、代わりにappフォルダ直下に入れられるようになった。
HTTPトランスポート層に関連するクラスを格納する /Controllers /Middleware /Requests(MiddlewareとRequestsは5.0で登場した新タイプのクラス群) が app/Http 配下に配置された。
app/filters.phpは廃止され、代わりに全てのMiddlewareクラスは個別ファイルに記述できるようになり、app/Http/Middleware 配下に格納するようになった。
app/start配下にあったファイル群はapp/Providersに個別のservice providerファイルとして格納するようになった。
langファイルとviewsファイルはresourcesディレクトリ配下に配置された。
その他に、アプリケーションのロジックと関係ないディレクトリ(/config /database /storage /tests )がapp配下から移動されルートに配置されるようになった。

名前空間の採用
5.0から名前空間指定が必須となった。

・契約
Laravelの主要なサービスがilluminate/contracts配下にインターフェースとしてまとめられた。

・ルートキャッシュ
php artisan route:cache
route:cache artisanコマンドを実行すると、app/Http/routes.phpの代わりにキャッシュされたルートが使用されるようになり、アプリケーションルート登録時間を劇的に短くすることができる。
新たにルートを追加した際は再度コマンドを実行する必要があり、キャッシュを削除したい場合は、route:clearコマンドを実行する必要がある。
php artisan route:clear

・ルートミドルウェア
Laravel 4ではフィルターと呼んでいた機能が、5.0ではHTTPミドルウェアになった。認証フィルターとCSRFフィルターはミドルウェアに置き換えられapp/Http/Middlewareに個別のファイルとして格納されている。

・コントローラメソッドインジェクション
Classのオブジェクトをコントローラーのコンストラクタだけじゃなくて、個別のメソッドにタイプヒントで注入できるようになった。
メソッドに他のパラメータが渡されていたとしても、サービスコンテナは自動的に判別して注入してくれる。

・認証スキャフォールド
ユーザー登録、認証、パスワードリセットコントローラーが初めから用意されていて、対応するビューやusersテーブルのmigrationもデフォルトで用意されている。

・イベントオブジェクト
イベントは文字列の代わりにオブジェクトとして定義できるようになった。
イベントハンドラーはデータのリストを受け取る代わりに、イベントオブジェクトを受け取る。

・コマンド/キュー
Laravel4でのキュージョブフォーマットに加え、5ではシンプルなコマンドオブジェクトとしてキュージョブを表現できるようになった。
格納場所はapp/Commandsディレクトリに配置する。

・データベースキュー
データベースキュードライバーが追加された。
データベースソフト以外の追加パッケージを必要としないシンプルなローカルキュードライバーである。

・Laravelスケジューラー
これまでエンジニアは、定期的に実行したいCUIコマンドがある場合、そのたびにCronエントリを作成してきた。
作成したCronエントリはソース上のどこからも見つけられず、追加するにはサーバーにSSH接続する必要まであり、エンジニアたちの悩みの種となっていた。
Laravelのコマンドスケジューラーを使って、コマンドのスケジュール管理をLaravel上でスムーズで分かりやすく定義できるようになった。

・Tinker/Psysh
php artisan tinkerコマンドには、より堅牢なPHP REPLであるJustin HilmanのPsyshを利用することにした。Laravel 4で使っていたBorisを気に入ったのであれば、きっとPsyshも気に入るだろう。より優れていると言っていい。なんとWindowsでも動く!

・DotEnv
分かりづらく深い階層を有したさまざまな環境設定ディレクトリの代わりに、Laravel 5ではVance LucasのDotEnvを利用することにした。
このライブラリは環境設定をスーパーシンプルな方法で管理でき、Laravel5の環境設定をスムーズに行えるようにする。

・Laravel Elixir
Jeffrey Wayが作ったLaravel Elixirは、各種メタ言語コンパイルや、ファイル結合をするための、スムーズで分かりやすいインターフェースを提供する。
もし、これまでGruntやGulpを学ぶことに怯えていたのなら、もう怖がることはない。Elixirを使えば、Gulpを使用してのLess、Sass、CoffeeScriptコンパイルを超絶簡単に始められる。さらにテストまで走らせられる!

・Laravel Socialite
Laravel SocialiteはLaravel 5.0+互換パッケージとして、超絶簡単なOAuth認証機構を提供する。
現在、SocialiteはFacebookTwitterGoogleGitHubをサポート。

・Flysystem統合
パワフルなファイルシステム抽象化ライブラリFlysystemをLaravelに導入。
Flysystemはローカル、Amazon S3、Rackspace cloud storageのすべてを1つに統合する統一されたエレガントなAPIである。
ファイルをAmazon S3に保存するのが、超簡単になった。

・フォームリクエス
Illuminate\Foundation\Http\FormRequestクラスをextendしたフォームリクエストクラスが追加になった。このリクエストオブジェクトはコントローラーメソッドインジェクションで注入され、定型的なバリデーション用の記述をすることなく、ユーザー入力のバリデーションが行える。
注入されたクラスがフォームリクエストのインスタンスであるとLaravelサービスコンテナに認識されると、リクエストは自動的にバリデーションにかけられる。
コントローラーのアクションが呼び出されると、HTTPリクエストのinputはフォームリクエストクラスで定義されたrulesに従い検証される。そしてリクエストが検証通過しない場合はリダイレクトされ(カスタム可能)、エラーメッセージが次のリクエストの間だけ、セッションに保存される(またはJSONに変換される)。

・シンプルなコントローラリクエストバリデーション
Laravel5のベースコントローラーにValidatesRequests traitが含まれた。
このtraitは入力リクエストを検証するシンプルなvalidateメソッドを提供する。
もしフォームリクエストがアプリケーションに対して大げさだと思う場合は、こちらも利用できる。
バリデーションが通らない場合は、例外が投げられ、自動的に適切なHTTPレスポンスがブラウザーに返される。さらに、バリデーションエラーが次のリクエストの間だけセッションに保存される。もしリクエストがAjaxだった場合、LaravelはJSON記法でバリデーションエラーを返却してくれる。

・新しいジェネレーター
新しいデフォルトアプリケーション構造を補完するため、新たにArtisanジェネレーターコマンドがフレームワークに追加された。
php artisan listを参照してほしい。

・設定のキャッシュ
config:cacheコマンドで、全ての設定を1つのファイルにキャッシュできるようになった。

Symfony VarDumper
変数のデバッグ情報を出力する人気のヘルパー関数ddが、Symfony VarDumper仕様にアップグレードされた。
出力は色分けされ、配列は折りたためるようになった。


▼アップグレードガイド

・環境設定
app/config/{environmentName}/での設定を.envに変更。.envの値にはenv('key', 'defalt value')でアクセス可能。
.envの書き方については.env.exampleを参照。

・ルート
routes.php → app/Http/routes.php

・コントローラ
app/Http/Controllers ディレクトリへ

・ルートフィルター
app/filters.phpは使用しなくなった。
代わりにauthやcsrf
 ['before' => 'auth']
ではなく
['middleware' => 'auth']
で参照できる。
しかし、Filtersは5で削除されたわけではないのでbeforeとafterを使いカスタムフィルターを作成することはできる。

・グローバルCSRF
デフォルトで全てのルートに対して、CSRFプロテクションが効いている仕様に変更された。
CSRFプロテクションを切りたいときや、特定のルートのみに効かせたい場合は、App\Http\Karnelを修正する。

・model格納用ディレクト
modelファイル格納用ディレクトリはなくなり、app直下に配置するような構造になった。
もしapp/Modelsディレクトリを作ってファイルを格納したい場合は、composer.jsonのclassmapディレクティブにディレクトリを追加するのを忘れないこと。

・Eloquentキャッシュ
Eloquentのクエリーをキャッシュするrememberメソッドが削除された。Cache::remember関数を使って各自でキャッシュすること。

・Laravelキャッシャー
使用するtraitとinterfaceの名称が変更になった。
メソッドの変更はない。

・Artisanコマンド
app/commands → app/Console/Commands
Artisanコマンドのリストは
start/artisan.php → app/Console/Kernel.php のcommand配列の中へ

app/database/migrations → database/migrations

・シード
app/database/seeds → database/seeds

・グローバルIoCバインディング
start/global.php → app/Providers/AppServiceProvider.php のregisterメソッドへ

・ビュー
app/views → resources/views

・Bladeタグの変更
セキュリティの強化のため、Laravel 5.0から{{ }}と{{{ }}}のどちらを使用した際の出力もエスケープ処理されるように変更。
新たに生データを出力するタグとして{!! !!}が追加された。
もし4.2のBladeシンタックスを使用しなければならない場合は、以下の場所に以下の3文を追記のこと。
AppServiceProvider@register
\Blade::setRawTags('{{', '}}');
\Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}’);
{{-- --}}のコメント用タグも廃止になった。

・言語用ファイル
app/lang → resources/lang

・Publicディレクト
4.2からアップデートする際は、index.phpは5.0用を使用すること。

・テスト
app/tests → tests

・各種ファイル
Sass、Less、CoffeeScriptなどのファイルは resources/assets 配下へ格納することを推奨。

・Form&HTMLヘルパー
Form&HTMLヘルパーはデフォルト状態では使用できなくなり、使用したい場合は Laravel Collectiveなどから 自分で追加する必要がある。

・CacheManager
Illuminate\Cache\CacheManager → Illuminate\Contracts\Cache\Repository

・ページネーション
$paginator->links() → $paginator->render()
$paginator->getFrom() → $paginator->firstItem()
$paginator->getTo() → $paginator->lastItem()

getプリフィックスの削除
$paginator->getPerPage() → $paginator->perPage()
$paginator->getCurrentPage() → $paginator->currentPage()
$paginator->getLastPage() → $paginator->lastPage()
$paginator->getTotal() → $paginator->total()

・Beanstalk キュー
"pda/pheanstalk": "~2.1" → "pda/pheanstalk": "~3.0”

・リモート
Remoteコンポーネントは使用不可に。

・ワークベンチ
Workbenchコンポーネントは使用不可に。
ーーーーーーーーーーーーーーーーーーーー

今回も、やたら長かったですね!

最後まで読んでくれたあなたには、きっと幸せが訪れます。

Love ya !!