参考
https://www.hypertextcandy.com/laravel-tutorial-introduction
環境設定
dockerで環境作成のサンプル
laravel_sample.zip(95)
基本(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を生成するときは
<a href="{{ route('tasks.edit', ['id' => $task->folder_id, 'task_id' => $task->id]) }}">編集</a>
みたいな感じ。
コントローラ
ルートの引数の順番で引数が渡される。
$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
<?php namespace App\Http\Requests; use App\Models\Task; use Illuminate\Validation\Rule; class EditTask extends CreateTask { public function rules() { $rule = parent::rules(); $status_rule = Rule::in(array_keys(Task::STATUS)); return $rule + [ 'status' => '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. ' のいずれかを指定してください。', ]; } }
ビュー
サンプル
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>ToDo App</title> @yield('styles') <link rel="stylesheet" href="/css/styles.css"> </head> <body> <header> <nav class="my-navbar"> <a class="my-navbar-brand" href="/">ToDo App</a> <div class="my-navbar-control"> @if (Auth::check()) <span class="my-navbar-item">ようこそ, {{ Auth::user()->name }}さん</span> | <a href="#" id="logout" class="my-navbar-item">ログアウト</a> <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> @csrf </form> @else <a class="my-navbar-item" href="{{ route('my-login') }}">ログイン</a> | <a class="my-navbar-item" href="{{ route('my-register') }}">会員登録</a> @endif </div> </nav> </header> <main> @yield('content') </main> @if (Auth::check()) <script> document.getElementById('logout').addEventListener('click', function(event) { event.preventDefault(); document.getElementById('logout-form').submit(); }); </script> @endif @yield('scripts') </body> </html>
ディレクティブ
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が実行される。
vite.config.js
vite serverのホスト名を変更する
vite serverを使って開発する場合、 public/host が自動的に生成され、記載されているvite serverのホスト名、ポートで通信が行われる。
もし、このホスト名を変更したい場合は以下のように vite.config.js を記載する
import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; export default defineConfig({ plugins: [ laravel({ input: [ 'resources/css/app.css', 'resources/js/app.js', ], refresh: true, }), ], server: { host: true, hmr: { host: 'hogehoge', <- ここに変更したいホスト名を指定する } }, });
[カテゴリ: プログラミング言語 > PHP]
[通知用URL]
Tweet
最終更新時間:2023年01月28日 11時54分24秒