(2022/4/3)Laravel 16日目 -- データ削除、ページネーション、検索 --
スレッド削除でエラーになっていたところ。
■ルーティング情報修正
エラーの原因はこれかー、先走りというか後を読んでなかった。
web.php
-Route::redirect('/', '/bbs');
+Route::redirect('/', '/thread');
- Route::resource('bbs', 'App\Http\Controllers\ThreadConroller');
+Route::resource('thread', 'App\Http\Controllers\ThreadConroller');
index.blade.php
-<form action="{{route('bbs.store')}}" method="POST">
+<form action="{{route('thread.store')}}" method="POST">
ここまでで返信ができることは確認。
URLは localhost:8000/bbs から localhost:8000/thread に変更
■ページネーション
スレッド件数が多くなってくると全部表示するのは現実的でないので、
1画面に一度に表示する件数を絞る。ページネーションと呼ぶんですね。
ThreadController.php
public function index()
-$threads = Thread::orderBy('created_at', 'desc')->get();
+$threads = Thread::orderBy('created_at', 'desc')->paginate(3);
上記なら3件
ページ移動で固定で記述していた部分を修正
index.blade.php
-<p class="justify-center text-blue-300 link-hover cursor-pointer">prev 1 2 3 4 next</p>
+<p class="ms-5">{{ $threads->links() }}</p>
Controllerにlinks関数があってこれを呼び出すといい具合にページングしてくれるみたい。
で、表示してみたら
どーん。なんじゃこりゃ
Laravelでpaginateした時の矢印がやたら大きくなる原因 | TURNING POINT
ググったらそのまんまの記事があった。
レイアウトが崩れる原因はLaravelのページネーションがデフォルトでTailwind互換になっているからです。
なんと。Tailwindが基準になってるのか。
bootstrapを使用しますよという記述を追加。
app\Providers\AppServiceProvider.php
public function boot()
{
Paginator::useBootstrap();
}
先頭に 下記が必要。
use Illuminate\Pagination\Paginator;
Laravel8 でPaginationを簡単に美しく実装する方法【Bootstrap利用】 | 40代からプログラミング!
なんでも、Laravel7まではBootstrapが標準だったが、Laravel8からはTailwindが標準になったんだとか。
Bootstrapはjqueryベースなので動作が重いのが不評の原因だったが、
Bootstrap5からはjqueryを使わなくなった。
Laravelとしては動作が重いBootstrapを見限った流れだったのだろうが、改善してきたので肩透かしみたいな感もあるのだろうか。
雑感は置いといて、修正後の表示
できました。
こんなに簡単に実装できちゃっていいんでしょうか、というぐらいコードが少なくて済むんだなぁ
■削除は?
で、結局スレッド削除はできたのか。
削除された。web.phpの調整が足りてないのが大きかったようです。
■検索
検索処理も実装していく。
index.blade.php
-<form action="/" method="post">
+<form action="{{route('thread.search')}}" method="post">
-<input class="border rounded px-2 flex-auto" type="text" name="serch_message">
+<input class="border rounded px-2 flex-auto" type="text" name="serch_message" required>
web.php
+Route::post('/thread/search', [ThreadController::class, 'search'])->name('thread.search');
ThreadController.php
検索フォームに文字列を入力して検索ボタンを押下すると、
Target class [App\Http\Controllers\ThreadController] does not exist.
のエラー。
web.php
Route::post('/thread/search', [ThreadController::class, 'search'])->name('thread.search');
の書き方が違うっぽい。
ごちゃごちゃやったあげく、ThreadControllerのクラス名をスペルミスしてたことに気付く。じゃあ直したらどうなるのとファイル内のクラス名を直接修正したら、今度は掲示板の画面そのものが表示されなくなってしまう。
LaravelでControllerの名前を変更する方法 - Qiita
ファイル内を修正するのはかまわんけど、下記コマンドを実行しましょうと。
$composer dump-autoload
generateが始まってから終わらないんだが・・・
PHPフレームワーク「composer dump-autoload」の重要性について - Qiita
composerが使えるまでは、ファイルの依存関係をrequireで記述してたけど、
使えるようになってからはコマンド1つで再構成できる大事なコマンドであると。
分かったから終わってくれいー(10分経過)
やっとコマンドが終了したがコマンドの警告?
Class xxx located in "ファイルパス" does not comply with psr-4 云々
Laravelのクラス読み込みエラーを解決する|fumi|note
!!! クラス名と同じくファイル名も間違っているではないか。
ファイル名とクラス名をあわせたら今度はすんなり通った。
起動してページを読み込んでみると通った。
肝心の検索は・・・?
エラーは出ないけど、検索もできない。
検索文言入れても入れなくても変わらず。
あと一歩という所なのだが・・・時間切れ
続く!