質問: Laravel(Laravel5.7)を用いた作業中です。 現在カレンダーを作成していて、日付をクリックすると違うページに飛ぶというプログラミングです。 (引き継ぎ作業なく)引き継いだ作業なので、前任者が書いたコードの解読ができません。 以下、とある ``` {{ link_to(route('xxx.yyy', ['date' => $date->date->format('ymd')]), $date->date->format('m/d')) }} ``` ・分かっていること ymdはyear,month,dateを示しているのは分かった $dateがカレンダー表示に関するインスタンスである旨もあった ・質問 1. `route('xxx.yyy', ['date' => $date->date->format('ymd')])`の`'xxx.yyy'`はルーティングで設定されているファイルのありか? 2. `['date' => $date->date->format('ymd')]`の`'date' => $date`はコントローラで渡されたメッセージだと思う(laravel本参照していた同じ形のコードがあったため)が、それ以下の`->date->format('ymd')`は? 3. 最後の`$date->date->format('m/d'))`はブラウザ上で見た感じだと、実際他のページに飛ぶ際のクリックする場所だと思うのですが、その認識で合っているのか 以下参考にしましたが、変数が何を示しているのか分からず、つんでます。 link_to テンプレート どれか一つでもいいので助言ください。
回答: まず: 質問の際にLaravelのバージョンを(マイナーまでは)明記してください。わからなければ `composer.json` をみるか、`artisan --version`で確認できるかと思います。また、ドキュメント参照される際もバージョン間の差異がそこそこあるので**使用しているバージョンと一致しているか**を確認するようにしてください。(怠ってると私もたまにハマります。) ところでドキュメント参照されている `link_to` のようなHTMLヘルパですが、これはLaravel5.0でコアから削除されLaravelCollectiveに移管されています。 まず、今回の件で参照されるべきドキュメントはルーティングのページです。 おそらく標準的な方法でコーディングがなされているのであれば、 `routes/web.php`に(古いものであれば`app/Http/routes.php`に)ルーティングの定義ファイルが用意されているかと思います。 このなかの定義のうち、一部または全てに`Route::get(...)**->name('xxx.yyy')**`のように**name**が指定されているものがないでしょうか。これは「名前付きルート(named route)」であり、`route($name, $parameters = [], $absolute = true)`でURLに解決できます。 次に > > `$date`はコントローラで渡されたメッセージだと思う / `->date->format('ymd')`は? > > > 肝心の `$date` がコントローラーでなにを渡しているのかわからないのでなんともいえないのですが、Laravelではdatetimeを持つオブジェクトとしてCarbonを使用しています。これはPHPのDateTimeを拡張しているものなので、`DateTime::format`同様に日時を任意のフォーマットに整形できます。 3つめについては`link_to`の実際の内部のコードをみたほうが早いでしょうか。リンクタグ内部に入るテキストですね。 ということでまとめると 1. ルート定義ファイルで定義されてるルートの名前 2. (Carbonで)日時の文字列フォーマット 3. そのとおり となります。 (追記:コメントの内容について) `$parameters` URLに含むパラメーターです。連想配列で指定します。。単にパラメーターといっても ``` Route::get('user/{id}', ...)->name('user-show') ``` のようなパラメーターを含むルートの場合、パラメーター内の`id`はそのURLの一部となります。またこのidは省略できません。またパラメーターに含まれないキーに対する値はgetクエリとしてURLに含まれます。 上記のルートについて ``` route('user-show', ['id'=>1, 'foo'=>'bar'], false) ``` のようにした場合、 ``` /user/1?foo=bar ``` といったURLが得られます。 (このようなルート定義は/user/1, /user/2... のようにユーザーごとにIDでURLを割り当てたりするのに頻繁に使われるルーティングです。) 任意パラメーターやそもそもルートにパラメーターが含まれず、クエリを渡す必要もない場合はからの配列を渡したりそもそも省略することが可能です。(第三引数を使用しない場合) `$absolute` cubickさんのコメントの通り、URLに`http(s)://example.com`、つまり**オリジン部を含めるかどうか**です。`true`にした場合(デフォルト)は `http://example.com/user/1` 、`false`にした場合は`/user/1` のようなURLが得られます。(ヘルパのドキュメントには「相対URL」「絶対URL」と表記されていますが(コード上もそうですが)わかりにくいですね)