0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelでの検索機能の実装で検索ボタンを押すとログイン画面に遷移して困っていた時に解決した方法

Posted at

この記事の背景

Twitterのクローンアプリを作っていました。
その時に投稿の検索をする機能を作っていました。その時のことです。

苦労した点

前提として検索機能は未ログインユーザーでも検索できるようにする必要があります。
検索機能は動くようになりましたが、ログインしていない状態で検索ボタンを押すとログイン画面に遷移してしまいました。投稿の検索はログインしていなくもできるようにしなくてはいけません。そしてついに原因がわかりました。

解決のヒントになったChatGpt

まずは「Laravelで検索機能を作っていて検索ボタンを押すとログイン画面に行くのはなぜ?」
と聞きました。

ChatGptの回答
検索ボタンを押したときにログイン画面に遷移する原因は、検索フォームのアクションがログインが必要なページに設定されていることが考えられます。まず、ログインが必要なページであるかどうかを確認してください。もし、ログインが必要である場合は、検索フォームのアクションをログイン画面に遷移するように設定されている可能性があります。その場合、検索フォームのアクションを検索結果が表示されるページに変更することで、問題を解決することができます。また、検索処理を実行するコントローラーのアクションでログイン認証が必要である場合は、ログイン認証が行われていないとリダイレクトされる仕組みになっているため、ログイン認証が必要である旨を表示するメッセージを表示するか、ログインが必要である旨を示すエラーページにリダイレクトすることで、問題を解決することができます。

welcome.blade.php
<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はリクエストを認証されていないと見なし、ログインが必要であると判断します。この問題を解決するには、検索フォームのルートを、ログインが必要なルートではなく、誰でもアクセス可能なルートに変更する必要があります。または、認証されていない場合にリダイレクトせず、検索結果を取得することもできます。

解決した方法

問題はルーティングでした。下のコードは認証機能で、検索機能に関係するルーティングを認証の
グループの中に書いてありました。これだと検索ボタンを押すとログインしていないと検索ができない状態になっています。

web.php
// ログイン後
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']のグループの外に移動したら
ログインしなくても検索できるようになりました。

web.php
 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 () {
    #省略
  });

まとめ

環境は人それぞれ違うので参考程度でお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?