!!!参考 https://www.hypertextcandy.com/laravel-tutorial-introduction !!!環境設定 dockerで環境作成のサンプル {{ref laravel_sample.zip}} !!!基本(Lavel9) !!ルーティング routesディレクトリ配下にファイルを置く。 URIと挙動を関連付ける。コントローラ以外にもビューや文字列をそのまま返すこともできる Route::get('/', 'App\Http\Controllers\HomeController@index') Route::post('login', [AuthenticatedSessionController::class, 'store']); Route::view('/hoge', 'dashboard'); Route::get('/hoge2', function () { return "hoge2"; }); URIからID等の引数を受け取るときは以下のようにかける Route::get('/folders/{id}/tasks/{task_id}/edit', 'App\Http\Controllers\TaskController@showEditForm'); またルートに名前をつけて、そのルートへのURIの生成を容易にすることができる。 Route::get('/folders/{id}/tasks/{task_id}/edit', 'App\Http\Controllers\TaskController@showEditForm')->name('tasks.edit'); ビューでURIを生成するときは 編集 みたいな感じ。 !!コントローラ ルートの引数の順番で引数が渡される。 $requestについては、どこに定義しても正しく渡される。 public function edit(int $id, int $task_id, EditTask $request) { $task = Task::find($task_id); $task->title = $request->title; $task->status = $request->status; $task->due_date = $request->due_date; $task->save(); return redirect()->route('tasks.index', [ 'id' => $task->folder_id, ]); } !Requests 入力チェックに関して、いくつか方法があり、以下のようにコントローラで直接バリデーションを指定できる $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'confirmed', Rules\Password::defaults()], ], [ 'required' => ':attribute は必須。メッセージ変更可能。', ],[ 'name' => 'ユーザー名', 'email' => 'メールアドレス', 'password' => 'パスワード', ]); また、Requestを作成しコントローラの引数として取得することもできる。 コントローラの引数 public function edit(int $id, int $task_id, EditTask $request) EditTask 'required|' . $status_rule, ]; } public function attributes() { $attributes = parent::attributes(); return $attributes + [ 'status' => '状態', ]; } public function messages() { $messages = parent::messages(); $status_labels = array_map(function ($item) { return $item['label']; }, Task::STATUS); $status_labels = implode('、', $status_labels); return $messages + [ 'status.in' => ':attribute には ' . $status_labels. ' のいずれかを指定してください。', ]; } } !!ビュー !サンプル ToDo App @yield('styles')
@yield('content')
@if (Auth::check()) @endif @yield('scripts') !ディレクティブ PHPの変数を表示したり、条件分岐したり、レイアウト定義したり、インポートしたり、必要なことはできる。 !!モデル !getXXXXXAttribute DBの日付をフォーマットして表示したい等でモデルの項目を編集して表示できる public function getFormattedDueDateAttribute() { return Carbon::createFromFormat('Y-m-d', $this->attributes['due_date']) ->format('Y/m/d'); } !リレーション class Folder extends Model { use HasFactory; public function tasks() { return $this->hasMany('App\Models\Task'); } } とすると関連するテーブルを取得できる。N+1問題に注意 !!ミドルウェア 認証済のユーザのみ表示とか、ログインしていないユーザのみ表示とか、リクエストの前後に任意の処理を入れることができる。 Kernel.php でミドルウェアの登録し、ルートを指定するときにミドルウェアを指定する。 Route::middleware('guest')->group(function () { Route::get('register', [RegisteredUserController::class, 'create']) ->name('register'); (省略) }); Route::middleware('auth')->group(function () { Route::get('verify-email', [EmailVerificationPromptController::class, '__invoke']) ->name('verification.notice'); (省略) }); ミドルウェアの指定方法はいくつか書き方がある。 !!イベント イベント発生させて、イベントリスナーにイベントを通知することで、処理のつながりを粗結合にする。 例えば、ユーザ登録したときにメールを送信する等。 イベントとリスナーを作成し、EventServiceProviderにイベントとリスナーを関連付ける。 protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, TestListener::class, ], ]; 以下のようにイベントを発生させると、上記の場合は SendEmailVerificationNotification::class TestListener::class にイベントが通知される。 !!!その他 !!ログ !出力先変更 .envのLOG_CHANNELで変更できる。 標準エラーに出力するには LOG_CHANNEL=stderr とする。 !!出力方法 $message = ['a' => 1, 'b' => 2, 'c' => 3]; logger($message); info($message); !!ルーティング !CakePHPのようなルーティング https://stackoverflow.com/questions/35624907/laravel-5-2-routing-like-cakephp CakePHPのようにURLとコントローラを命名規則で結びつける方法。 web.phpに追記 Route::any('{anyRoute}', function($anyRoute){ $call = ""; $parts = explode("/", $anyRoute); $size = sizeof($parts); if($size > 0){ $controller = ucfirst(strtolower(trim($parts[0]))); $action = trim(array_get($parts, 1)); $params = []; if(empty($controller)){ return view("welcome"); } else{ if(empty($action)){ $action = "index"; } } if($size > 2){ unset($parts[0], $parts[1]); $params = array_merge($params, $parts); } $object = app('App\\Http\\Controllers\\'.$controller.'Controller'); return call_user_func_array([$object, $action], $params); } })->where('anyRoute', '(.*)'); http://hgoehoge/test/index にアクセスすると TestControllerのindexが実行される。 {{category2 プログラミング言語,PHP}}