この記事の背景
Twitterのクローンアプリを作っていました。
その時に投稿の検索をする機能を作っていました。その時のことです。
苦労した点
前提として検索機能は未ログインユーザーでも検索できるようにする必要があります。
検索機能は動くようになりましたが、ログインしていない状態で検索ボタンを押すとログイン画面に遷移してしまいました。投稿の検索はログインしていなくもできるようにしなくてはいけません。そしてついに原因がわかりました。
解決のヒントになったChatGpt
まずは「Laravelで検索機能を作っていて検索ボタンを押すとログイン画面に行くのはなぜ?」
と聞きました。
ChatGptの回答
検索ボタンを押したときにログイン画面に遷移する原因は、検索フォームのアクションがログインが必要なページに設定されていることが考えられます。まず、ログインが必要なページであるかどうかを確認してください。もし、ログインが必要である場合は、検索フォームのアクションをログイン画面に遷移するように設定されている可能性があります。その場合、検索フォームのアクションを検索結果が表示されるページに変更することで、問題を解決することができます。また、検索処理を実行するコントローラーのアクションでログイン認証が必要である場合は、ログイン認証が行われていないとリダイレクトされる仕組みになっているため、ログイン認証が必要である旨を表示するメッセージを表示するか、ログインが必要である旨を示すエラーページにリダイレクトすることで、問題を解決することができます。
<h5 class="description text-center">何か投稿してください</h5>
<div class="text-center mb-3">
<form method="get" action="{{ route('post.index') }}" class="d-inline-block w-75">
<div class="form-group ">
<div class="input-group">
<input type="text" name="keyword" class="form-control" placeholder="検索" autocomplete="off">
<div class="input-group-append">
<button type="submit" class="btn btn-success">検索</button>
</div>
</div>
</div>
</form>
</div>
ChatGptの回答 このコードからは、ユーザーがログインしていない場合に、検索フォームを送信すると、ログイン画面にリダイレクトされるようになっています。これは、アプリケーションに認証機能が実装されている場合に起こります。検索フォームが送信されたとき、Laravelはリクエストを認証されていないと見なし、ログインが必要であると判断します。この問題を解決するには、検索フォームのルートを、ログインが必要なルートではなく、誰でもアクセス可能なルートに変更する必要があります。または、認証されていない場合にリダイレクトせず、検索結果を取得することもできます。
解決した方法
問題はルーティングでした。下のコードは認証機能で、検索機能に関係するルーティングを認証の
グループの中に書いてありました。これだと検索ボタンを押すとログインしていないと検索ができない状態になっています。
// ログイン後
Route::group(['middleware' => 'auth'], function () {
// 投稿
Route::prefix('post')->group(function () {
Route::get('','PostController@index')->name('post.index');
Route::post('/search', 'PostController@search')->name('post.search');
#省略
});
検索機能のルーティングをRoute::group(['middleware' => 'auth']のグループの外に移動したら
ログインしなくても検索できるようになりました。
Route::get('','PostController@index')->name('post.index');
Route::post('/search', 'PostController@search')->name('post.search');
// ログイン後
Route::group(['middleware' => 'auth'], function () {
// 投稿
Route::prefix('post')->group(function () {
#省略
});
まとめ
環境は人それぞれ違うので参考程度でお願いします。