- 投稿日:2022-03-23T19:19:25+09:00
Laravel ブラウザからログイン済みのユーザーが実行できるAPIの作成と確認
概要 Laravelのアプリケーションにてブラウザからログインしているユーザーが実行できるAPIを作成する方法をまとめる。 ご注意 本知見は同じチームで働くエンジニアさんにご教授いただいた内容です。 筆者がかなり詰まっていたときにお力添えいただきました!改めてお礼申し上げます! 今回、詰まりそうな作業を極力少なくするためにAPIで実行されるルーティングをweb.phpに記載します。 本来、APIのルーティングはapi.phpに記載することが望ましいです。 今回web.phpで定義している処理はあくまで「ROOT GET OK」の文字列を返すだけのものですが、応用すればいろいろな処理が可能です。 作成 Laravelの新規アプリケーションを作成する。 下記の方法でLaravel Breezeを用いた認証処理を作成する。 https://readouble.com/laravel/9.x/ja/starter-kits.html DBにテーブル作成、.envの記載とアプリケーションの起動、composer install、などを行い、ブラウザから「Register」ページにアクセスして任意のユーザーを登録する。 登録したユーザーでブラウザからログインできる事を確認する。 下記の記載をweb.phpに記載する。 web.php Route::get('/get_test', function(){ return 'ROOT GET OK'; })->middleware('auth'); 体験 用意するもの PostmanやThunder Clientなどのリクエストを送るツール VScode Thunder Client の導入方法 リクエストを送るツールで下記のようなリクエストを作成 項目 情報 備考 リクエスト名 get_test 皆さんの任意のものでOK HTTPメソッド GET リクエスト送信URL 任意のホスト名/get_test dockerの方はhttp://localhost:ポート番号/get_testphp artisan serveでローカルサーバー立てている方はhttp://127.0.0.1/get_testとかになるはずです。php artisan serveの方のURLが若干自信無いので間違えているかも。。すみません ヘッダー情報 空 一回authミドルウエアが実行されているか知りたいのでまずは空で Auth情報 特に入力しない ヘッダー情報が空(未認証)でどんな挙動をするか確認 /get_testに対してGETのリクエストを投げてみる。 web.phpにAPIのルーティングを記載しちゃっているためおそらくログイン画面のhtmlが返される。 これはブラウザ側で認証していないと開けないURL領域に未認証状態でアクセスした場合と同じ挙動。ブラウザで見ているかリクエストを送るツールで返されたhtmlのコードを見ているかの差。 認証をパスした状態で「ROOT GET OK」の文字が返って来てほしいので次の方法で確かめてみる。 ブラウザでログイン、ヘッダーにCookieを追加してどんな挙動をするか確認 作成での中で行った作業と同じ様にブラウザからログインを行う。 ログインした画面(おそらくダッシュボード画面)にてChromeの開発者ツールを起動する。 「Network」タブをクリックする。 一度画面をリロードする。 「Name」の部分に「login」や「home」などがあると思うのでクリックする。 「Request Headers」の「Cookie」を全選択してコピーする。(Cookie:の部分も含めてすべてコピーする。) リクエストを送るツールの当該のリクエストのヘッダーにコピーしたCookieをそのまま貼り付ける。 Thunder Clientの場合 リクエストの詳細の「Headers」をクリックする。 「Raw」のチェックボックスにチェックをつける。 コピーした内容を貼り付け。 ちなみに筆者のThunder Clientはhttp://localhost:8000を変数「host」に割り当てている。 Postmanの場合(今回は未検証、昔に試した方法を思い出して記載しているので若干違うかも、すみません。) リクエストの詳細の「Cookies」をクリックする。 任意のドメイン名(おそらく)を入力して「Add」をクリックする。 「Add Cookie」をクリックする。 コピーした内容を貼り付けて「Save」をクリックする。 /get_testに向けてリクエストを送信する。 ブラウザから認証を突破したCookieをそのままヘッダーに入れてリクエストを投げているので、認証を突破し、「ROOT GET OK」の値が帰ってきた。 上記を実施しても「ROOT GET OK」の値が帰ってこない場合 作成での中で行った作業と同じ様にブラウザからログインを行う。 ログインした画面(おそらくダッシュボード画面)にてChromeの開発者ツールを起動する。 「Network」タブをクリックする。 一度画面をリロードする。 「Name」の部分に「login」や「home」などがあると思うのでクリックする。 「Request Headers」に記載されている内容をキーと値すべて範囲選択してコピーする。 リクエストを送るツールの当該のリクエストのヘッダーにコピーしたRequestHeadersをそのまま貼り付ける。 Thunder Clientの場合 リクエストの詳細の「Headers」をクリックする。 「Raw」のチェックボックスにチェックをつける。 コピーした内容を貼り付け。 ポイント Cookieの値はすべてまるまるリクエストで投げてあげること。 XSRF-TOKENのセッションIDだけとかを「Cookie」の名前で送信してもだめ! とにかくログインしたあとの画面のリクエストヘッダーのCookieの「Cookie:」も全て含めてコピーしてリクエストを送るツールで送ってあげないと認証されているとアプリ側が認識してくれない。
- 投稿日:2022-03-23T17:26:05+09:00
Laravelのバリデーションの基本【個人的なお勉強アウトプット】
参考図書 バリデーションルールの設定 ValidateRequestsというコントローラクラスにあるメソッドを利用する。 app/Http/Controllers/HelloController.php public function post(Request $request){ $validate_rule = [ 'name' => 'required', 'mail' => 'email', 'age' => 'numeric|between:0,150', ]; $this->validate($request, $validate_rule); } validateアクションメソッドは配列の形で、項目名、検証ルールをセットする。 検証ルールが複数ある場合は|でつなぐ。 ルートの設定 routes/web.php Route::post('hello', 'App\Http\Controllers\HelloController@post'); ビューでエラーメッセージの表示 resources/views/hello/index.blade.php @section('content') <p>{{$msg}}</p> @if(count($errors) > 0) <p>入力に問題があります。再入力してください。</p> @endif <form action="/hello" method="post"> <table> @csrf //hasはエラーが発生しているかをチェックするメソッド @if($errors->has('name')) //firstというメソッドは指定した項目の最初のエラーメッセージを取得するもの <tr><th>ERROR</th><td>{{$errors->first('name')}}</td></tr> @endif //oldメソッドで引数に指定した入力項目の前回送信した値を返す <tr><th>name: </th><td><input type="text" name="name" value="{{old('name')}}"></td></tr> @if($errors->has('mail')) <tr><th>ERROR</th><td>{{$errors->first('mail')}}</td></tr> @endif <tr><th>mail: </th><td><input type="text" name="mail" value="{{old('mail')}}"></td></tr> @if($errors->has('age')) <tr><th>ERROR</th><td>{{$errors->first('age')}}</td></tr> @endif <tr><th>age: </th><td><input type="text" name="age" value="{{old('age')}}"></td></tr> <tr><th></th><td><input type="submit" value="send"></td></tr> </table> </form> @endsection $errorsはバリデーションで発生したエラーメッセージをまとめて管理するオブジェクト。バリデーション機能によって勝手に組み込まれる。 エラーメッセージを取得するメソッド メソッド 内容 all すべてのエラーメッセージを配列で取得 first 指定した項目の最初のエラーメッセージを文字列で取得 get 指定した項目の最初のエラーメッセージすべてを配列で取得 getの使い方はfirstと同じで$変数 = $errors->get('項目名');
- 投稿日:2022-03-23T16:39:35+09:00
グローバルミドルウェアとミドルウェアのグループ登録【個人的なお勉強アウトプット】
参考図書 グローバルミドルウェア すべてのアクセスで自動的にミドルウェアが実行されるようにしたい場合、グローバルミドルウェアに登録する app/Http/kanel.php protected $middleware = [ ... ... \App\Http\Middleware\HelloMiddleware::class, ]; ミドルウェアのグループ登録 複数のミドルウェアをまとめて扱える。 app/Http/kanel.php 'web' => [ ...ミドルウェアクラス ], 'api'=> [ ...ミドルウェアクラス ], 'helo' => [ \App\Http\Middleware\HelloMiddleware::class, ]. ルートにグループミドルウェアを登録 /routeeb.php Route::get('hello', 'App\Http\Controllers\HelloController@index')->middleware('helo');
- 投稿日:2022-03-23T16:07:42+09:00
Laravelでニコニコ動画 『スナップショット検索API v2』を利用してみた
はじめに Laravelを学び始めたばかりの筆者が、自身のアプリにニコニコ動画のコンテンツ検索機能を実装した際のメモです。Qiitaの記事は初めて書きました。何かミスを含んでいる可能性は十分ありますので、あらかじめご了承ください。 『スナップショット検索API v2』について ニコニコ動画のコンテンツを検索/取得できる公式APIです。 使い方は公式ドキュメントにわかりやすく説明してありますので、大半の方はこの記事で無く公式ドキュメントを読んだ方が速いと思います。 ControllerでcURLを使って情報を取得 Controller内で必要なパラメータを指定しcURLでGETを行います。今回は、ユーザから検索対象文字の"q"と何ページ目を取得するかを示す"page"を受け取り、APIのパラメータを指定する際に用いています。 MyPageController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MyPageController extends Controller { public function search(Request $request){ $query = $request->get('q'); $page = $request->get('page'); $App_name = '#アプリ名を記述'; $url = 'https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search?q='.urlencode($query).'&targets=title,description,tags&fields=contentId,title,userId,thumbnailUrl&filters[tags][0]=VOCALOID&filters[tags][1]=UTAU&filters[tags][2]=CeViO&filters[tags][3]=VOICELOID&_sort=-viewCounter&_offset='.strval(($page-1)*20).'&_limit=20&_context='.$App_name; $curl = curl_init($url); //cURLセッションを初期化 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); //GETで取得 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//サーバー証明書の検証を行わない curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//戻り値を文字列で $curl_response = curl_exec($curl);//実行 curl_close($curl); //APIからのレスポンスを配列に変換し、検索結果をviewへ渡す。 $result = json_decode($curl_response, true); $response = response()->view('search', ['result' => $result]); return $response; } } 各種パラメータについて 下記のAPIエンドポイントに対して、必要なクエリパラメータを付与します。 APIエンドポイント https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search 最低限必要なパラメータ パラメータ名 型 説明 q string 検索キーワード targets string 検索対象のフィールド。キーワード検索の場合はtitle,description,tags。タグ検索の場合はtagsExact。 _sort string ソート順の指定。今回は再生数降順で-viewCounterとしてます。 _context string 利用者のサービス名・アプリケーション名。 その他のパラメータ パラメータ名 型 説明 fields string 取得したいコンテンツ情報。contentId,title,description,tagsなど様々な情報を指定できる。今回取得したのは contentId, title, userId, thumbnailUrlである。 filters string 検索結果を絞るための条件を指定できます。先ほどの例では、filters[tags][0]=VOCALOIDとして、VOCALOIDタグの動画に絞っています。 jsonFilter string 複雑なフィルター条件を指定する際に使用します _offset integer コンテンツの取得オフセットです。先ほどの例では、1ページあたりのコンテンツ数を20とし、pageで指定されたページ位置に該当するコンテンツを取得するため、_offsetをstrval(($page-1)*20)としています。 _limit integer 返ってくるコンテンツの最大数を指定。先ほどの例では20としています。 例えば、page=1, query=初音ミク とした場合のレスポンスは以下の通りです。 json {"data":[{"contentId":"sm1097445","title":"【初音ミク】みくみくにしてあげる♪【してやんよ】","userId":70391,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/1097445/1097445"},{"contentId":"sm15630734","title":"『初音ミク』千本桜『オリジナル曲PV』","userId":449061,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/15630734/15630734.34480305"},{"contentId":"sm1715919","title":"初音ミク が オリジナル曲を歌ってくれたよ「メルト」","userId":317063,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/1715919/1715919"},{"contentId":"sm11809611","title":"【オリジナル曲PV】マト リョシカ【初音ミク・GUMI】","userId":380847,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/11809611/11809611"},{"contentId":"sm10759623","title":"初音ミク・巡音ルカ オリジナル曲 「ワールズエンド・ダンスホール」","userId":11912389,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/10759623/10759623"},{"contentId":"sm27965309","title":"DECO*27 - ゴーストルール feat. 初音ミク","userId":811012,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/27965309/27965309"},{"contentId":"sm2937784","title":"初音ミクオリジナル曲 「初音ミクの消失(LONG VERSION)」","userId":1091989,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/2937784/2937784"},{"contentId":"sm31606995","title":"ハチ MV「砂の惑星 feat.初音ミク」","userId":380847,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/31606995/31606995"},{"contentId":"sm3504435","title":"初音ミク が オリジナル曲を歌ってくれたよ「ワールドイズマイン」","userId":317063,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/3504435/3504435"},{"contentId":"sm19133907","title":"【初音ミク&GUMI】脳漿炸裂ガール【オリジナル】","userId":2591026,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/19133907/19133907"},{"contentId":"sm9714351","title":"初音ミク オリジナル曲 「ローリンガール」","userId":11912389,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/9714351/9714351"},{"contentId":"sm8082467","title":"初音ミク オリジナル曲 「裏表ラバーズ」","userId":11912389,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/8082467/8082467"},{"contentId":"sm6666016","title":"「ロミオとシンデレラ」 オリジナル曲 vo.初音ミク","userId":655340,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/6666016/6666016.67600511"},{"contentId":"sm31791630","title":"wowaka『アンノウン・マザーグース』feat. 初音ミク","userId":11912389,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/31791630/31791630"},{"contentId":"sm22960446","title":"【初音ミク】 ウミユリ海底譚 【オリジナル曲】","userId":26225387,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/22960446/22960446"},{"contentId":"sm15751190","title":"【初音ミク】カゲロウデ イズ【オリジナルPV】","userId":15872264,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/15751190/15751190"},{"contentId":"sm28576299","title":"エイリアンエイリアン / 初音ミク","userId":49716308,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/28576299/28576299.67529574"},{"contentId":"sm30177801","title":"ダンスロボットダンス / 初音ミク","userId":49716308,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/30177801/30177801.97461989"},{"contentId":"sm3645817","title":"初音ミクがオリジナルを歌ってくれたよ「ブラック★ロックシューター」","userId":317063,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/3645817/3645817"},{"contentId":"sm31685272","title":"DECO*27 - ヒバナ feat. 初音ミク","userId":811012,"thumbnailUrl":"https://nicovideo.cdn.nimg.jp/thumbnails/31685272/31685272"}],"meta":{"id":"f04f124a-049a-4fb7-b712-7b64c57a3ad4","totalCount":267280,"status":200}} これをjson_decodeで配列に変換後、blade内でresult["data"]に対してforeachします。 search.blade.php //・・・ @foreach($result["data"] as $content) <div> <h3>{{ $content['title'] }}</h3> <img src="{{ $content['thumbnailUrl'] }}"> <a href="https://nico.ms/{{ $content['contentId'] }}">動画URL</a> <p>{{ $content['userId'] }}</p> </div> @endforeach //・・・ imgタグでthumbnailUrlからサムネイル画像を取り出したり、contentIdから動画のURLを生成したりできます。
- 投稿日:2022-03-23T15:15:30+09:00
VSCode 備忘録
VSCodeの設定等を備忘録的に記載していきます。 cmd+pで検索した時、Laravleのvender配下のファイルも検索対象にしたい デフォルト設定では"search.useIgnoreFiles": trueになっているはずなので、"search.useIgnoreFiles": falseに変更する。 settings.json "search.useIgnoreFiles": false 参考にさせていただきました
- 投稿日:2022-03-23T15:00:45+09:00
Laravelのミドルウェア【個人的なお勉強アウトプット】
参考図書 WEBの基本は、アクセスしてリクエストを受け取り、結果をレスポンスを返す。 その基本となる部分を補完する様々な機能がLaravelには用意されている。 ミドルウェアとは コントローラとは別に、「指定のアドレスにリクエストが送られてきたら、自動的に何らかの処理を行う」という仕組み。 リクエストに対して共通する処理はコントローラに置くと重複するし、重くなる。そのような処理はミドルウェアで処理させる。 ミドルウェアはリクエストがコントローラのアクションに届く前(または後)に配置されるレイヤー層のプログラム。 ミドルウェアの設定はルート情報を記述する際に指定する。 コントローラとは完全に分離されているため、コントローラの処理には左右されない。 リクエスト、レスポンスの流れにミドルウェアがどう絡むか ①リクエストが送られる ②ミドルウェアのhandleが呼び出される。 ③ミドルウェアで$nextを実行する。複数ミドルウェアがある場合は次のミドルウェアのhandleが呼び出される ④他にミドルウェアがない場合はコントローラのアクションが呼び出される。 ⑤アクションメソッドが終わるとレンダリングされ、レスポンスが生成される。生成されたレスポンスが$nextの戻り値としてミドルウェアに返される。 ⑥ミドルウェアで返送されたレスポンスがreturnとして返され、これがクライアントへ返送される。 上記の流れがあるのでミドルウェアはコントローラーのアクションの前と後で処理をはさみこめる。 ミドルウェアの作成 php artisan make:middleware HelloMiddleware app/Http/Middlewareにミドルウェアファイルが作成される 上述のHelloMiddlewareがファイル名。 ミドルウェアファイル app/Http/Middleware/helloMiddleware.php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class HelloMiddleware { public function handle(Request $request, Closure $next) { return $next($request); } } 第一引数の$requestは、リクエストの情報を管理するRequestインスタンスが渡される。 $nextはCloosureクラスのインスタンス。無名クラスを表すためのクラス。$nextを呼び出し実行することで、ミドルウェアからアプリケーションを送るリクエスト(Requestインスタンス)を作成している。 前処理 app/Http/Middleware/hogeMiddleware.php public function handle($request, Closure $next){ //処理を実行する return $next($request) } $nextは上述の通り、無名関数のインスタンスが入った変数。 returnすることで、処理結果をコントローラに渡す。 後処理 app/Http/Middleware/hogeMiddleware.php public function handle($request, Closure $next){ $response = $next($request) //処理を実行する return $response; } $response = $next($request)でコントローラーでの処理結果(処理してなくても)を受け取っている。 前処理の実例 app/Http/Middleware/helloMiddleware.php class HelloMiddleware{ public function handle($request, Closure $next){ $data = [ ['name'=>'taro', 'mail'=>'taro@web'], ['name'=>'hanako', 'mail'=>'hanako@web'], ['name'=>'sachiko', 'mail'=> 'sachiko@web'], ]; $request->merge(['data'=>$data]); return $next($request); } } mergeはフォームの送信で送られるinputの値に新たな値を追加するもの。 これによりdataという項目で$dataの内容が追加される。 コントローラ側では$request->dataでこの値を取り出せる。 ミドルウェアの実行 ルーティングでミドルウェアを呼び出す処理を記述する。 routes/web.php use App\Http\Middleware\HelloMiddleware; Route::get('hello', 'App\Http\Controllers\HelloController@index')->middleware(HelloMiddleware::class); Route::getの後にメソッドチェーンをつかってmiddlewareメドッドを追加する。 複数のミドルウェアを利用したい場合はRoute::get(...)->middleware(...)->middleware(...) と記述。 コントローラーでリクエストした値をビューに渡す app/Http/Controllers/HelloController.php public function index(Request $request){ return view('hello.index', ['data'=>$request->data]) } $requestをdataに置き換える。連想配列のdataというキー名にすることでビューに渡している。 ビューではdataという変数名で値を表示できる。 後処理の実例 app/Http/Middleware/helloMiddleware.php public function handle(Request $request, Closure $next) { //最初に$nextを実行し、結果を$responseに代入 //コントローラのアクションが実行され、結果のレスポンスが$responseに代入される。 $response = $next($request); //$responseのcontentメソッドで、レスポンスに設定されているHTMLのソースコードのテキストを取り出せる。 $content = $response->content(); $content = '代入テキスト'; //レスポンスへのコンテンツの設定 $response->setContent($content); return $response; } }
- 投稿日:2022-03-23T11:46:42+09:00
Laravelのビューコンポーザ【個人的なお勉強アウトプット】
参考図書 ビューコンポーザとは LaravelはMVCアーキテクチャ。 ビューで処理をした内容を表示したい場合、ビューのテンプレートBladeで@phpディレクティブを使うやり方や、コントローラーで処理をして値を渡す方法はある。しかし、表示するだけの役割のビューテンプレートで処理をするのは避けたほうがよく、コントローラーで処理をするのも何か違う気がする。という問題がMVCにはあった。 その問題を解決するのがビューコンポーザ。 指定のビューに常に同じ処理をして表示するものがある場合、ビューコンポーザを利用したほうが良い。 サービスとサービスプロバイダ ビューコンポーザはLaraveの「サービス」、「サービスプロバイダ」を使う。 サービスはLaravelの機能強化の仕組み。 サービスを登録するために用意するのが「サービスプロバイダ」。 サービスプロバイダにビューコンポーザというサービスを登録しておくと、自動的に実行されるようになる。 サービスプロバイダのつくりかた php artisan make:provider HelloServiceProvider app/provider/の中にファイルが作成される サービスプロバイダの基本形 app/provider/HelloServiceProvider.php use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class プロバイダクラス extends ServiceProvider{ public function register(){ //コンポーザの設定 } public function boot(){ //コンポーザの設定 } } サービスプロバイダはServiceProviderというクラスを継承して作成される。 registerメソッドはサービスプロバイダの登録処理を行う。 bootメソッドはアプリケーションサービスへのブートストラップ処理(アプリケーションが起動する際に割り込んで実行される処理)。 ここにコンポーザを設定する処理を用意することで、設定したビューをレンダリングする際に自動的にコンポーザが呼び出されるようになる。 サービスプロバイダの登録 HelloServiceProviderクラスをプロバイダとしてアプリケーションに登録 config/app.php 'providers' => [ ... ... App\Providers\HelloServiceProvider::Class ], ビューコンポーザの使い方 ビューコンポーザには二通りの使い方がある boot内に無名クラスでビューコンポーザの処理を読み込む ビューコンポーザのクラスを定義して、bootで設定する 本格的に使うときは「ビューコンポーザのクラスを定義して、bootで設定する」。 boot内に無名クラスでビューコンポーザの処理を読み込む app/Providers/HelloServiceProvider.php use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class プロバイダクラス extends ServiceProvider{ public function register(){ //コンポーザの設定 } public function boot(){ View::composer( 'hello.index', function($view){ $view->with('view_message','composer message!'); } ); } } 引数の$viewはIlluminate\View名前空間にあるViewクラスのインスタンス。ここにあるメソッドなどを利用してビューを操作することができる。 withメソッドはビューに変数などを追加することができる。 $view->with('変数名','値'); ビューコンポーザを利用 resources/views/hello/index.blade.php @section('content') <p>ViewComposer value:{{$view_message}}</p> @endsection ビューコンポーザのクラスを定義して、bootで設定する ビューコンポーザのクラスは特に配置する場所は用意されていない。Httpフォルダ内であればどこでも利用可能。 app/Http/Composers/HelloComposer.php namespace App\Http\Composers; use Illuminate\View\View; class HelloComposer{ public function compose(View $view){ $view->with('view_message' $view->getname()); } } コンポーザクラスで必要になるのはcomposeメソッド。インスタンスを引数として持っていて、サービスプロバイダのbootからView::composerが実行された際に呼び出される。 上記のHelloComposerをビューコンポーザとして利用するため、HelloServiceProviderに記述。 app/Providers/HelloServiceProvider.php public funtion boot(){ View::composer( 'hello.index', 'App\Http\Composers\HelloComposer' ); } 第2引数に呼び出すクラス名を指定。
- 投稿日:2022-03-23T08:50:00+09:00
【Laravel】初期設定について
この記事に書いてあること Laravelプロジェクトを立ち上げた直後の初期設定について、最低限必要なものを紹介します。 プロジェクトに応じて、他にも必要があれば設定してください。 タイムゾーン、言語設定 タイムゾーンと言語設定を日本にします。 config/app.phpを以下のように変更。 config/app.php // 'timezone' => 'UTC', 'timezone' => 'Asia/Tokyo', //中略 // 'locale' => 'en', 'locale' => 'ja', デバッグバー クエリ実行ログ、ルーティング、ビュー、セッション等の様々な情報をデバッグバーとして出力してくれます。 githubはこちら 以下のコマンドでインストール。 vagrantにssh接続して、仮想環境上で実行します。 composer require barryvdh/laravel-debugbar デバッグバーは本番環境で表示するべきではないので、リリース時は.envで必ずオフにすること .env APP_NAME=Laravel APP_ENV=local APP_KEY=base64:ygBp5fppgXX+myRzs27tgQfBxRYd6db2/PJnPTJtpa0= APP_DEBUG=false //ここをfalseに変更 APP_URL=http://localhost また.envの変更が改善されない場合はキャッシュの可能性もあるので、下記コマンドでキャッシュクリアを試してみてください。 php artisan cache:clear php artisan config:clear データベース設定 データベースの設定は.envで行います。 下記の箇所を環境に合わせて変更してください。 homesteadで環境構築した場合のユーザーネームとパスワードのデフォルトはhomestead / secretです。 .env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=study-app DB_USERNAME=homestead DB_PASSWORD=secret データベースに接続できるか確認します。 Laravelにはコマンドラインからデータベースのバージョン管理ができるマイグレーションという仕組みが備わっているので、それを利用してみます。 vagrant sshでログインしている仮想環境上で下記を実行 php artisan migrate データベースに自動でテーブルが作られているはず。 phpMyAdminで確認しましょう。 これで必要最低限の準備ができました。
- 投稿日:2022-03-23T08:49:08+09:00
composerについて ~なぜ、サーバーでパッケージを追加してはダメなのか
はじめに composer installとcomposer requireの違いから、なぜ、サーバーでパッケージを追加してはダメかについてまとめました。(自分の理解のために言語化したものです。ご指摘ありましたらコメント等で教えていただけますと幸いです) 環境 Laravel8 参考にした記事 composer.jsonとcomposer.lockの役割について分かりやすくまとめてみた composerのrequire/update/installの違い。開発環境と本番環境へのデプロイで使うコマンド [PHP]パッケージ管理ツールComposerを図で理解する :Qiita Composerとは Composerとは、PHPのパッケージ・ライブラリ管理ツールです。 composer.lockファイルとは 実際にダウンロードされたパッケージの情報が記録されるファイルです。バージョン名を記録されています。 composer.jsonファイルとは プロジェクトの依存関係を記述したファイルで、導入したパッケージ等が記述されています。 composer installについて 最初にcomposer installをしたとき、composer.jsonファイルを参照してパッケージやライブラリがvendorディレクトリ配下にまとめてインストールされます。 この時、同時にcomposer.lockファイルが生成されます。composer install時に参照したパッケージやパッケージのバージョン情報がcomposer.lockに書き込まれます。 そして、二回目以降はcomposer installをしたときには、composer.lockファイルを参照します。 つまり、composer.lockファイルがある場合は、composer installしても、パッケージの追加やバージョン情報とかが書き換わることがないのです。 チーム開発するときは、composer.lockファイルをGit管理してチーム間で共有すれば、チームでバージョン等を統一した状態で必要なパッケージをアプリにインストールすることができます。 (逆に、composer update(composer.jsonに記録されているパッケージを最新バージョンにアップデート、composer.lockファイルも更新)やcomposer require(パッケージを追加)をチームメンバーが各自で行ってしまうとチーム内でバージョンが異なってしまい、不具合が発生する元となります、、、!) なぜサーバーでパッケージを追加してはダメなのか 上記にて説明した通り、サーバーでcomposer requireやcomposer updateを行い、パッケージの追加・アップデートを行ってしまうとローカル環境とパッケージのバージョンが変わってしまう場合があります。不具合が発生してしまいますね、、、 おわりに composer installとcomposer requireの違いが分からず、サーバーでパッケージを追加しようとしたり、各メンバーにcomposer requireをするよう促したりしてしまっていました(恐ろしい、、、)自分が何をやっているのかを理解して実行することが大切だと痛感しました。 おまけ npmも同様な考え方とのことです!
- 投稿日:2022-03-23T04:34:52+09:00
【Laravel】array型で送信されたリクエストにバリデーションを適用する
概要 複数の要素を送信するフォームがある場合にname属性 url[] についてのバリデーション方法をまとめる index.blade.php @if($user->id) <input type="hidden" name="user_id" value="{{$user->id}}"> @endif <label class="col-md-2 col-form-label text-md-right"> URL </label> <div class="col-md-12 mb-4 domain_area"> <input type="url" name="url[]" class="form-control" value="" placeholder="https://example.com/"> </div> <div class="col-md-2"> <input type="button" value="+" class="add btn btn-secondary"> <input type="button" value="-" class="del btn btn-secondary"> </div> リクエストクラスを定義 name属性名.*とすることでarray型の要素に対してバリデーションを適用できます return [ 'url' => ['required', 'array'], 'url.*' => ['required', 'url', 'max:255', 'distinct', $uniqueUrlValidate], ]; <?php namespace App\Http\Requests; class StoreUsersRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * バリデーションエラーのカスタム属性の取得 * * @return array */ public function attributes() { return [ 'domain' => 'ドメイン', 'domain.*' => 'ドメイン', ]; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules(Request $request) { // 更新時は挿入先に自分自身を除いて重複チェックする $userId = $request->input('user_id'); $uniqueUrlValidate = Rule::unique('users', 'url'); !is_null($userId) ? $uniqueUrlValidate->whereNot('id', $userId) : $uniqueUrlValidate; return [ 'url' => ['required', 'array'], 'url.*' => ['required', 'url', 'max:255', 'distinct', $uniqueUrlValidate], ]; } }