laravel8 とりあえずページを作成してみる


初書:2020/10/30
PC:macOS 10.15.7
php 7.4.10
laravel 8.11.2

前提

・Laravelはインストール済み

前書き

laravelをインストールしたものの、ページを追加する方法すら分からなかったのでメモ。
前回 → Carbonを使ってみる - Qiita

表示するページを用意する

新しくページを作成する場合、
resources/views/下に新しくファイルを作成することで実装できる。
ちなみに拡張子は.blade.php
今回は、resources/views/test.blade.phpを作成する

ファイルを作成したら、とりあえず中身をなんでもいいので記述する(表示確認のため)

<h1>あああああああ</h1>

ページをlaravelに認識してもらう

このままだと/testにアクセスしても404を返すだけなので、laravelに認識してもらう。
route/web.phpを開く
その中にトップへアクセスした場合の記述があるので、真似して/testを追加する

Route::get('/', function () { // ここの3行は
    return view('welcome');   // デフォルトで
});                           // 記述されているはず。
Route::get('/test', function () {
    return view('test');
});

記述したら/testにアクセスしてみる。無事に表示されたら表示確認は完了。

現在時刻を表示する

単純に表示するだけならこれで終わりだが、まぁ動的ページは必要になるだろうということで、とりあえず現在時刻を表示してみる。

前提

時刻取得について:php標準のdate関数を使ってもいいのだが、せっかくlaravel(というよりcomposer)を使っているので、Carbonを使う。インストールは→Carbonを使ってみる - Qiita

コントローラーの作成

blade.phpとは別で、phpを実行する場所を作成する必要がある。
正直これが正しいのか分かっていないのだが、恐らくコントローラーを使ってphpの処理を記述するので、まずはコントローラーを作成する。

% php artisan make:controller TimeShowController
Controller created successfully.

TimeShowControllerは任意に変えてよし。ここがクラス名になるので、衝突しない名前にする事。
Controller created successfully.と表示されると、
app/Http/Controllers/TimeShowController.phpが作成されているはず。

その中に、実行したい関数を追加していく。

TimeShowController.php
/**
 * 現在時刻を表示するページ
 *
 * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
 */
public function timeshow()
{
    $time = Carbon::now();
    return view('timeshow', compact('time'));
//  return view('timeshow')->with(['time' => $time]); 
}

表示ページの方に引数を渡すには、上記の2つの記述方法がある。どちらでもいい。
ちなみにcompact関数は

$time = Carbon::now();
$a = compact('time');
$b = ['time' => $time];

と記述した場合、\$aと\$bは同じになる。PHP: compact - Manual

viewを作成する

次に表示する画面を作成する。
ファイル作成方法は「表示するページを用意する」と同じ
ファイル名は、先ほどのviewの第一引数timeshow.blade.php
今回はテストなので内容は簡潔に記述する。

timeshow.blade.php
現在時刻{{ $time }}

受け取った引数を表示するには、{{ }}で囲って変数を記述する

画面に表示する

せっかく作っても、laravelが認識しないなら意味がない
なので、laravelに認識してもらう。
再度route/web.phpを開く

use App\Http\Controllers\TimeShowController;
()
Route::get('/time', [TimeShowController::class,"timeshow"]);

最初に認識してもらう時には関数を直接記述していたが、今回はコントローラーを呼び出す必要があるので、第二引数に[クラス名::class,"関数名"]という記述をする。また、単純にnamespaceのためにuseも記述する。

[注意]
Laravel7以下で解説されているページを見ると、クラス名@関数名という表記を見かけますが、Laravel8では使えないようです。(クラス名を絶対パスでかけば可能な様子)
Laravelで`Target class [〇〇Controller] does not exist.`と言われたときに検討してみたい原因 - Qiita

アクセスしてみる

http://127.0.0.1:8000/timeにアクセスし、現在時刻:2020-10-30 15:19:34(時間は刻変更)と表示されれば作成完了です。
ちなみに9時間ずれる人はconfig/app.phpを見直して。

まとめ

laravelをインストールしたらとりあえずページを作る。。。とはならないのだろうか?連続して説明しているページを見つけれなかった。
こういう時は書籍を買ってとりあえず一通り理解していった方がいいのか、皆さんの学習方法が気になるところ。

参考サイト

Laravel でベーシックなWEBサイトを作る
Laravel controllerからViewへ値(変数)を渡す
[laravel] controllerからviewへの変数の受け渡しとその展開方法 - Qiita