これは何?
この記事は実務でLaravelを使う時にそういえばあんな機能あったなというHookにすることを目的としています
内容を詳細に解説するものではありません
- O'reilly から出ている Laravelの解説書 Laravel Up & Runningの箇条書き抜粋
- https://www.amazon.co.jp/Laravel-Running-Framework-Building-Modern-dp-109815326X/dp/109815326X/ref=dp_ob_title_bk
- Laravelは便利な機能がたくさんあり、いろいろな複雑な処理を宣言的に書けるようになっている。
- 一方そういった便利機能の存在を知らないと手続き的に車輪の再発明ロジックを書いてしまいコードが冗長になってしまうことが多い
- 現状邦訳がないため、そのような便利機能を備忘録的にまとめた
- 備忘録を兼ねた箇条書き抜粋でしかないので、詳細は原書や他の解説書・解説記事を参照してください
- 問題がありましたら修正または非公開にしますのでご連絡ください
- 未完成、随時追記していきます
- 各章に設けられた「テスト」の節は省略しています
- Laravel 10.x 前提
第2章 Setting Up a Laravel Development Enviroment
Laravelの開発環境を設定する
全てのLaravel Applicationの核となる設定はconfigフォルダに存在する。configフォルダの各ファイルはPHPの配列を返し、ドットで区切られる、ファイル名と後に続くキーを含むconfig keyで値にアクセス可能。
Laravelのいくつかの機能(キャッシュと最適化を含む)はenvヘルパ関数をconfigフォルダ外で使用すると機能しない。
.envファイル
いくつかの重要な設定
APP_KEY string
APP_DEBUG boolean
debug
レベルのログを出力するか
第3章 Routing and Controllers
ルーティングとコントローラ
- 複数method Route::match['get', 'post']
- 全てのmethod Route::any
Laravelの Controller/Methodを参照する構文
- tuple syntax
- string stntax
ルートパラメータの指定方法
- セグメントパラメータ
- optionalなセグメントパラメータ
- 正規表現
- constraint helpers
whereNumber
whereAlpha
ルートのマッチ順
- 記載順にマッチする
ルートパラメタとハンドラメソッド引数の関係
- ルートパラメタの出現順にハンドラメソッド引数に代入される
-
{appId}/{userId}/login
というルートのハンドラにfunction($userId,$appId){...}
逆の値が代入される。習慣上名前を揃えたほうがいいが、代入される値と変数名に関係はない(Laravelは順番しか見ない)
ルート名とヘルパ
- urlヘルパ => pathを渡すとフルのurlを返してくれる
- 名前付きルート
name
ヘルパで定義できる -
route
ヘルパで呼び出す -
ルートとviewの名前はリソース名の複数形.メソッド(action)
という名前をつけるのが一般的な習慣 - (users.get photos.destroy)など
-
route
ヘルパにパスパラメータおよびクエリパラメータを引き渡す方法はいくつかある(連想配列または配列)
ルートグループ
ルートグループは共通の機能(prefix
, namespace
, middleware
, etc)を持った複数のルートをまとめる
Route::group
ミドルウェアの適用
- コントローラ単位でのミドルウェアの適用
- コントローラのコンストラクタでmiddlewareメソッドを呼ぶことで、コントローラ特有のミドルウェアを適用できる
-
middleware
メソッドにonly
かexcept
をチェインすることでmiddlewareが適用されるメソッドを制限できる
サブドメインルーティング
Route::domain
メソッド
名前付きルートグループ
Route::name
にgroup
メソッドをチェーンさせると、グループ内のルート名の接頭語(プレフィックス)になる
Route::name('users.')->prefix('users')->group(function(){
Route::get('/{id}', function(){
//...
})->name('show');
});
users.show
が名前付きルートの名前になる
ルートグループコントローラ
以下のようにルートグループ単位で共通のコントローラを設定できる
Route::controller('HogeClass::class')->group(fucntion(){
Route::get('/', 'index');
//...
}
署名付きルート
正確なURLを知っている人だけがアクセスできる一種の認証/認可機能
時限付き署名付きルートも作れる
- 初めに、なんらかの処理を行うルートを設定する
- 次に
URL::signedRoute
やURL::temporarySignedRoute
メソッドを使い署名付きルートのURLを生成しユーザに送る - 署名していないアクセスを防止するには 元々のルートに
signed
middleware を使うか$request->hasValidSignature
メソッドで判定して処理する
ビュー
-
Route::view
メソッド
route定義上でviewを返すRouteを定義できる
コントローラ
- リソースコントローラ
php artisan make:controller AbcController --resource
で標準的なリソース操作メソッドを備えたコントローラのテンプレートを生成してくれる。
Route::resource
で全てのメソッドをrouteにバインドできる - APIリソースコントローラ
php artisan make:controller AbcController --api
Route::apiResource
でバインド - ルートとバインドされたメソッド一覧の表示
php artisan route:list
--exclude-vendor
オプションでライブラリから内部的に利用されているルートを除外 - シングルアクションコントローラ
1コントローラ1routeにしたい場合に マジックメソッド__invoke
に処理内容を記載し、Route::xxx
でクラスにバインドできる
ルートモデルバインディング
- ルートモデルバインディングとは、パスパラメータからモデルを呼び出しコントローラに注入する機能
- 簡単なやり方(パラメータ名とモデル名を一致させる)
/conferences/{id}
というルートで自動バインディングさせるには
パラメータ名をモデルに一致させる(id
->conference
)
/conferences/{conference}
あとは、コントローラメソッドで型ヒントを行なうと自動で対象のモデルが注入される
({conference}に相当するセグメントがidとして解釈される)
他にも色々オプションがある(割愛)function (Conference $conference) { //... }
- 簡単なやり方(パラメータ名とモデル名を一致させる)
ルートキャッシュ(route caching)
- クロージャで定義されたルートがあるとキャッシュできない
-
php artisan route:cache
でキャッシュ -
php artisan route:clear
でクリア
フォームメソッドスプーフィング
- HTML FORMから
GET
POST
以外のメソッドを使いたい時に使用する - bladeのformタグ内で
@method('PATCH')
などと使用する
CSRFプロテクション
リダイレクト
- redirect() ヘルパ
- redirect()
- redirect()->to()
- redirect()->route()
- redirect()->back()
-
Redirect
ファサード
- その他のメソッド
- refresh()
- away()
- secure()
- guest()
- intended()
- 引数の受け渡し
- with()メソッド
- withErrors()メソッド
- バリデータインスタンスをそのまま渡せる
- old()ヘルパ
リクエストの中止(Abort)
- abort()
- abort_if()
- abort_unless()
カスタムレスポンス
- response()
- response()->make()
- response()->json() ,jsonp()
- response()->download(), file(), streamDownload()
- streamDonwload()はクロージャechoでストリームデータを吐き出す関数を引数に取る
第4章 Blade Templating
ブレードテンプレート
- bladeは.netのRazorエンジンにインスパイアされている
- 基本構文
- @ + directive
- { echoする内容 }
データのecho
- {{ $variable }}
<?=htmlentities($variable)?>
と同じ
- {!! $variable !!}
HTMLエスケープをしないで内容を出力する - フロントエンドフレームワークの構文で
{{ hoge }}
が必要な場合
blade上では@{{ hoge }}
と書けばいい
制御構文
-
@if
@else
@elseif
@endif
-
@unless
@endunless
-
@for
@foreach
@while
-
@forelse
@empty
@endforelse
テンプレートの承継
-
@section
@endsection
@yield
@show
@extends
@parent
@include