2022年11月25日
だいたいある程度初期データに書いてある内容がわかってきたような気がするので、トップページをなんとなく作っていこうと思います。
前回の記事で作った雑なページ構成に従い、トップページをhomeのbladeファイルに転送するようにして、ログインしている場合は日報の一覧、ログインしていない場合はログインもしくは新規ユーザー登録に誘導するような表示にします。
とりあえずweb.php
の内容でwelcomeページに飛ぶようになっているのをhome.php
に変更します。
トップページにアクセスするとこのようなページに飛びます。
現状ログインしていない状態なのにログイン中と表示される上にログインのメニューが表示されるという不思議な感じになるのでそれを修正します。
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
{{ __('You are logged in!') }}
</div>
現在ログイン中と表示されている部分です。{{ __('You are logged in!') }}
が裸で表示される状態になっているので、この部分をログインしている状態なら{{ __('You are logged in!') }}
を表示、されていない状態なら(とりあえず)何も表示しないようにします。
app.blade.phpのファイルを参考に、
@guest
@else
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
{{ __('You are logged in!') }}
@endguest
@guest〜@else
の間にログインしていない場合の処理、@else〜@endguest
の間にログインしてる場合の処理を表記します。すると、
それっぽい感じになりました。ifなんたらかんたらとphpを書くより断然早くて便利ですね。
ついでにログインしていない場合はログイン画面に飛ばすようにリンクを表示するようにしときます。
[article_ad]
ざっくり設計にしたがって、ログインしたトップ画面には日報の一覧とユーザーの一覧を表示したい。日報登録などまだ作ってないので取り急ぎユーザー一覧を表示させてみます。
こちらのページを見ながら順番にやってみます。まずはartisanでコントローラーを作成するとのことなのですが、homeのコントローラーはもうあるので作らなくてもいいかな?コントローラーの内容が若干違うのですが気にせずやってみましょう。
public function index()
の内容に追記すればいけるでしょうか。追加したほうがいいんだろうか。
public function index()
{
return view('home');
}
homeにアクセスしたらhomeのviewファイル(bladeファイル)を表示すると現状なっています。ここに、
public function index()
{
return view('home');
$members = DB::select('select * from members');
$data = ['title' => 'メンバーリスト', 'members' => $members];
return view('members.index', $data);
}
3行追加。sqlっぽいのを実行して$membersという変数に結果を配列で格納している?次の行で$dataとう変数にキー付きの配列を入れてますね。membersという配列に$membersの配列を格納してるけどどうなっちゃってるんだ…?
実行してみるとエラー吐きまくりだったのでいろいろ検証してました。最悪…。全然違ったので修正。
まず根本的にパラメーター無しのトップページにアクセスするとhomeのviewファイルを読み込むようにweb.phpに書いてました。
Route::get('/', function () {
return view('home')->with('status', '例');
});
この部分。そうするとその下に書いていた、
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
この部分が死にます。HomeContorollerで書いた関数が永遠に使われないのでそもそもsql文書いても無駄にという事態でした。というかそもそもなんでこんな書き方してるんだろ??とりあえずこれを修正、そしてより簡潔に書き直しました。
Route::get('/', 'App\Http\Controllers\HomeController@index');
パラメーターなしの場合HomeControllerの関数を使用するというように変更しました。すると上で書いた関数を使用してくれました。
次にhomeのviewファイルに
<h1>{{ $title }}</h1>
<ul>
@foreach ($members as $member)
<li>{{ $member->name }}</li>
@endforeach
</ul>
を追記すると、関数内で呼び出したユーザーデータと、冒頭にtitleというキーで指定した「メンバーリスト」という言葉を表示してくれるはずでした。エラーが多すぎてキャプチャーとってなかったのですが、まずデータベースを使用するヘルパーみたいなのがないとのエラーが出てデータベースにアクセスできませんでした。ログインできるのになんでやねんって話なのですが、これは参考にさせていただいているサイトの、
use Illuminate\Support\Facades\DB;
この部分をコピペすることで解決しました。ログイン関係のコントローラーのソース見てもないからなくてもデータベース接続はできそうなんだけど…
すると次は$titleがないとエラーが出ました。ここで関数が使われていないと思ってルーターの修正に至ったのですが、次は$membersがないとエラーが出ました。ここは全てコピペで終わらせようと横着したのが完全に失敗でした…
public function index()
{
return view('home');
$members = DB::select('select * from members');
$data = ['title' => 'メンバーリスト', 'members' => $members];
return view('members.index', $data);
}
先ほど書いたこれですが、そもそもreturn view
は結果を返す構文で、最後にreturn view('members.index', $data);
があるので不要ですね。
次にsqlの部分なのですが、Laravelのユーザーテーブルはusers
なのでmembers
は間違いでした。
ここを直せば次の$dataの行は問題なし。
次のreturn view('members.index', $data);
ですが、参考にしているサイトはmembersのviewファイルを作っているのでmembersとなっていますが、今回はhomeのviewファイルに結果を出力するのでhomeに変更します。indexって必要なのか…?
直した関数はこちら。
public function index()
{
$members = DB::select('select * from users');
$data = ['title' => 'メンバーリスト', 'members' => $members];
return view('home', $data);
}
次にbladeファイルに
<h1>{{ $title }}</h1>
<ul>
@foreach ($members as $member)
<li>{{ $member->name }}</li>
@endforeach
</ul>
先ほどもあったこれをペースト。場所はどこでもいいですが、@else〜@endguest
の間に入れればログインした時だけ見えるようにできます。
すると、
ちゃんとできました…。ログアウトして別ユーザーとして登録してログインしてみると、
ちゃんと増えてました。ユーザー登録したときにRoute::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
をコメントアウトしていたためにpage not foundになってしまいました。もう一度表示にしたら上記画面になったので残しておくか、リダイレクト先を変えたほうがいいですね(探したけど見つからなかったです…)
今回はデータベースに接続して内容を画面に出力するということをやってみました。
もっと練習が必要ですね。sqlも簡潔で配列を使えば出力もすごく簡単でした。次回は表の形での出力か、データベースへの登録画面の作成をやっていきたいと思います。
お仕事のご依頼やご相談、弊社サービス内容に関してなど、お気軽にご相談ください。