質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

PHPでページネーション付きの検索をするには

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 558

score 7

前提・実現したいこと

PHP(Laravel)で登録したレシピの検索機能を作っています。
「レシピ名(recipe_name)」で検索する機能を実装中に、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

navbarに実装した入力フォームから検索ボタンを押すと、indexに検索結果が表示される処理を実装したいです。
また、未入力であれば全検索を行います。

現状「検索ボタン」を押すと、下記のエラーが発生します。

どの箇所を修正したらよいかご教授いただきたいです、よろしくお願いします。

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message

該当のソースコード

web.php

<?php

//トップページ
Route::get('/', 'RecipesController@index');

//検索機能
Route::get('recipes', 'RecipesController@getSearch')->name('search.get');


RecipesController.php

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Recipe;//追加

class RecipesController extends Controller
{
     //getでrecipes/にアクセスされた場合の「一覧表示処理」
    public function index()
    {

    //レシピのインスタンス作成
    $recipes = Recipe::paginate(5);

        return view('recipes.index', [
            'recipes' => $recipes,   
        ]);
    }

  //検索機能
    public function getSearch(Request $request)
    {
        //入力フォーム"keywords"に入力された内容を取得
        $query = $request->input('keywords');

            //検索フォームに入力があれば
            if($request->has('keywords')){
                //レシピ名で検索した結果をインスタンスに格納
                $recipes = Recipe::where('recipe_name', 'LIKE', '%' .$request->get('keywords').'%')->paginate(5);
            }else{
                //検索フォーム未入力であれば、全検索の結果を格納
                $recipes = Recipe::paginate(5);
            }

    //トップページ(index.blade.php)に返す
        return view('recipes.index', [
            'recipes' => $recipes,
            'keywords' => $request->input('keywords'),
        ]);

    }


resources\views\commons\navbar.blade.php

<header>
             <div class="search">
                //「検索する」を押すと、RecipesController.phpのgetSearch()に処理を渡す
                {!! Form::open(['route' => 'search.get']) !!}
                        {!! Form::text('keywords', null,['class' => 'form-control']) !!}
                        {!! Form::submit('検索する',['class' => 'btn btn-primary btn-block']) !!}
                {!! Form::close() !!}
             </div>
</header>


resources\views\layouts\app.blade.php

    <body>
        @include('commons.navbar')
        <div class="container">            
            @yield('content')
        </div>
    </body>


resources\views\recipes\index.blade.php

@extends('layouts.app')

@section('content')
        <div class="wrapper">
                <!--レシピ一覧の表示--> 
                <div>
                    @foreach($recipes as $recipe)
                        @if(count($recipes) > 0)
                          <p>{{ $recipe->recipe_name}}</p>
                        @endif
                    @endforeach
                </div>
        </div>
    {{ $recipes->appends(['keywords' => Request::get('keywords')])->links('pagination::bootstrap-4') }}
@endsection

試したこと

ページネーションの箇所は
https://readouble.com/laravel/5.3/ja/pagination.html
のappendsを参照しました。

補足情報(FW/ツールのバージョンなど)

PHP 7.2.22
Laravel 5.5
BootStrap4

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

MethodNotAllowedHttpException

許可されていないメソッド

以下の2パターン(DELETE/PUT etc 他はあるが)

  1. POST しか許可されてないところに GET でアクセス
  2. GET  しか許可されてないところに POST でアクセス

ルーティング設定を見直してください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/02 11:57

    >asahina1979さん
    ご回答いただきありがとうございました。
    Route::post('recipes', 'RecipesController@getSearch')->name('search.get');
    に修正したところ、無事動作しました。

    生成されたHTMLを確認したらPOSTになっていました。
    貴重な気づきをありがとうございます。

    キャンセル

+2

{!! Form::open

デフォルトはPOSTではないでしょうか。
生成されたhtmlをご確認ください。

もしPOSTならルーティングにGETしか用意してないのが原因と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/02 11:59

    >m.ts10806さん
    ご回答いただきありがとうございます。

    ご指摘の通り、生成されたHTMLを確認したらPOSTになっていました。

    Route::post('recipes', 'RecipesController@getSearch')->name('search.get');
    に修正したところ、無事動作しました。
    getにしてしまったのが原因でしたので、今後はルーティング設定に気を付けたいと思います。

    ご指摘ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る