目次
はじめに
自分のために更なるスキルアップを目指して書いてみました。
同じく簡易的なポートフォリオサイトを作れるくらいの方々の参考になれば幸いです。
※以下、私のレベル感。
現状
・基礎的なRESTfulサービスは作れる。(index,createstore,show,edit,update,destroyまで実装)
・ユーザー認証機能は実装できる。
・Eloquentの基本は理解している。
学ぶべきこと
①ミドルウェア
②リクエスト
③依存性の注入
④認可機能(ポリシー)
①ミドルウェア
未ログインユーザーが投稿などできないようにするために必要。
以下はindex、show以外にアクセスしようとするとログイン画面へリダイレクトされるようにしている。
//web.php
<?php
Auth::routes(); //認証機能のひな形作成
Route::get('/', 'ArticleController@index')->name('articles.index');
Route::resource('/articles', 'ArticleController')->except(['index', 'show'])->middleware('auth');
Route::resource('/articles', 'ArticleController')->only(['show']);
※app/Http/MiddlewareディレクトリのAuthenticate.phpファイル記載のroute(‘login’)の部分を編集すればリダイレクト先を変更できる。
また、上記のようにルーティングにもいろいろ使えるメソッドが存在する。
・nameメソッド(別名:名前付きルート)
URLを生成したり、リダイレクトしたりできる。
・onlyメソッド
resourceメソッドにそのアクションのみを指定できる。
・exceptメソッド
resourceメソッドからそのアクションを除外できる。
②リクエスト
リクエスト作成。主にフォーム周りで送信された値のバリデーションを行う。
$ php artisan make:request ArticleRequest
(コントローラーでバリデーションを行わせることもできるが、一般的にコントローラーにはあまり多くの処理を持たせないようにすることが望ましい。)
・authorizeメソッド
リクエストの対象となるリソース(ここでは記事)をユーザーが更新して良いかどうかを判定する。
・rulesメソッド
バリデーションのルールを定義する。
・attributesメソッド
バリデーションエラーメッセージに表示される項目名をカスタマイズできる。
③依存性の注入 , DI(Dependency Injection)
コントローラーにおいて、アクションメソッドの引数で型宣言を行うと、そのクラスのインスタンスが自動で生成されてメソッド内で使えるようになる。
(外で生成されたクラスのインスタンスをメソッドの引数として受け取る流れのことをDIという。)
//〇〇Controller
public function edit(Article $article)
{
return view('articles.edit', ['article' => $article]);
}
最初はチュートリアルをやっていると、よくこのタイプの引数を見かけて、毎度意味が分からず頭を抱えていた。
例えば、URLがarticles/1/editだとすると、idが1であるArticleモデルのインスタンスが代入される形になる。
また、ビューには’article’というキー名で、変数$articleの値(Articleモデルのインスタンス)を渡している。
④認可機能(ポリシー)
①のミドルウェアでログイン有無によるアクセスの制限はできる。
しかし、ログイン後に考慮すべき投稿コンテンツの更新・削除・編集に関してはミドルウェアだけでは制限できない。
他人の投稿を編集などできないようにするのに必要になるのが認可機能の1つであるポリシー。
ポリシーの作成
$ php artisan make:policy ArticlePolicy --model=Article
–modelをつけることでモデルに対応したポリシーになる。
付けなかった場合は、AuthServiceProviderでポリシーとモデルを紐づけるに必要あり。
以下が参考になります。(いろいろな実装方法があるので、こんがらがるの注意!!)
入門Laravelチュートリアル (10) エラーハンドリング
https://www.hypertextcandy.com/laravel-tutorial-error-handling/
ポリシーのメソッドとコントローラーのアクションメソッド対応表
ポリシーのメソッド | コントローラーのアクションメソッド |
viewAny | index |
view | show |
create | create,store |
update | edit,update |
destroy | destroy |
ポリシーでfalse
を返す場合、対応するアクションメソッドは処理されず、ステータスコード403
のHTTPレスポンスがクライアントに返さる。
public function view(?User $user, Article $article) //?を付けることで引数がnullでも許容される。(未ログインでも可)
{
return true; //誰でも詳細画面は見れることにする。
}
public function delete(User $user, Article $article)
{
return $user->id === $article->user_id; //投稿したユーザーしか削除できないようにする。
}
コントローラーに加えることでポリシーを適用。
public function __construct() { $this->authorizeResource(Article::class, 'article'); }
・__constructメソッド
クラスのインスタンスが生成された時に初期処理として呼び出さなくても必ず実行される。
・authorizeResourceメソッド
第1引数にモデルのクラス名(App/Articleでも可)、第2引数にルーティングのパラメータ名。($ php artisan route:listで出力されるURIの{}内の部分)
知っておくと便利だなと思ったもの
Null合体演算子(??)
式1 ?? 式2
という形式で記述。式1がnull
でない場合は式1、式1がnull
である場合は、式2が結果となる。
ルーティングの確認
$ php artisan route:list
最初のころは無視してチュートリアル進めていたけれどもこれみるとミドルウェアがどのアクションメソッドに適用されているか確認できたりする。
RESTfulに関して
ほぼほぼ以下のような規則になっているので、知っているとなにかと良い。
メソッドアクション | ルート情報 | 引数 | メソッド |
index | /コントローラ | GET|HEAD | |
create | /コントローラ/create | GET|HEAD | |
store | /コントローラ | Request $request | POST |
show | /コントローラ/{id} | $id | GET|HEAD |
edit | /コントローラ/{id}/edit | $id | GET|HEAD |
update | /コントローラ/{id} | Request $request, $id | PUT|PATCH |
delete | /コントローラ/{id} | $id | DELETE |
更なる高みを目指して
まずはこれらの機能をポートフォリオに実装してみます。
今後はProviderやフロントエンドフレームワーク(Vue.js)との連携を目指します。
読んでいただきありがとうございました。
おしまい。
追記:
最初に作ったポートフォリオのアレンジを少し試みたところ、少し変えると大量のエラーが出てくるといったメンテナンス性の低さ、効率性の悪さが半端ない。。。泣
とりあえず適当に簡易的なWebアプリを作って試せばいいやと思ったものの、そもそもCRUD全て実装されているチュートリアルも少ない。しかもデプロイしているのは最初に作ったポートフォリオのみなので、これの改修が自分にとって勉強になると判断。
頑張ろう。。。
コメントを残す