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

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

# 前提
・Laravelはインストール済み

# 前書き
laravelをインストールしたものの、ページを追加する方法すら分からなかったのでメモ。
前回 → [Carbonを使ってみる - Qiita](https://qiita.com/yuu_1st/items/779bb3f64b4423f20e84)

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

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

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

```php
<h1>あああああああ</h1>
```

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

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

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

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

# 現在時刻を表示する

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

## 前提
時刻取得について：php標準のdate関数を使ってもいいのだが、せっかくlaravel(というよりcomposer)を使っているので、Carbonを使う。インストールは→[Carbonを使ってみる - Qiita](https://qiita.com/yuu_1st/items/779bb3f64b4423f20e84)

## コントローラーの作成

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

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

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

```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関数は

```php
$time = Carbon::now();
$a = compact('time');
$b = ['time' => $time];
```
と記述した場合、\$aと\$bは同じになる。[PHP: compact - Manual](https://www.php.net/manual/ja/function.compact.php)

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

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

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

## 画面に表示する

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

```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](https://qiita.com/norichintnk/items/34a04cd17bfe4014313a)

## アクセスしてみる

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

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


# 参考サイト

[Laravel でベーシックなWEBサイトを作る](https://qiita.com/Takahisa1984/items/fe86e5a231d7890234c1)
[Laravel controllerからViewへ値（変数）を渡す](https://noumenon-th.net/programming/2019/12/25/laravel-compact/)
[[laravel] controllerからviewへの変数の受け渡しとその展開方法 - Qiita](https://qiita.com/ryo2132/items/63ced19601b3fa30e6de)