2016-05-23 4 views
1

は、私は、特に私がController method not found.Laravel 5.2コントローラのメソッドが見つからないが、職人のルートに表示されます。</p> <pre><code>Route::get('guest/shop/{product}', '[email protected]')->name('guest.shop.show'); </code></pre> <p>:リスト

ルートのエラーを取得し、私のLaravel 5.2ルート/コントローラのいずれかの問題を持っていますコントローラおよび方法:デバッグ時、私はすでにやった

class GuestShopController extends ShopController { 
    public function __construct() { 
     $this->middleware('guest'); 
    } 
} 

abstract class ShopController extends Controller { 
    protected function singularProductData($product) { 
     $thumbnails = $product->thumbnails(); 

     return [ 
      'product'  => $product, 
      'thumbnails'  => $thumbnails, 
      'main_thumbnail' => head($thumbnails), 
     ]; 
    } 

    protected function getProducts() { 
     return Cache::remember(
      'products', 
      3600, 
      function() { 
       return Product::active()->get(); 
      } 
     ); 
    } 

    /** 
    * Display a listing of the resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index() { 
     return view('pages.shop.index')->with(
      [ 
       'products'  => $this->getProducts(), 
       'organisation' => request()->attributes->get('organisation'), 
      ] 
     ); 
    } 

    /** 
    * Display the specified product. 
    * 
    * @param string $slug 
    * @param null $product 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function show($slug, $product = null) { 
     if(! is_a($product, Product::class)) { 
      $product = Product::active()->where('slug', $slug)->firstOrFail(); 
     } 

     return view('pages.shop.product')->with($this->singularProductData($product)); 
    } 

    /** 
    * Display the specified product modal. 
    * 
    * @param int $id 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function modal($id) { 
     $product = Product::active()->findOrFail($id); 

     if(request()->ajax()) { 
      return view('_partials.shop.modal-content')->with($this->singularProductData($product)); 
     } 

     return $this->show($product->slug, $product); 
    } 
} 

もの:

  • php artisan route:listを実行し、経路制御やミドルウェアを確認し、すべてのマッチアップ php artisan route:list
  • はGuestShopControllerに抽象ShopControllerの
  • routes.phpの
  • 移動方法の上部へのルートを移動composer dumpautoload
  • を実行し、変更にGuestShopControllerに延びLaravelのデフォルトコントローラ

答えて

0

@ chikurubhiの回答はほぼ正しいです。 URL構造を変更し、コントローラのメソッドを少し修正しました。

Route::get('guest/shop/modal/{productId}', '[email protected]')->name('guest.shop.modal'); 
Route::get('guest/shop/{slug}', '[email protected]')->name('guest.shop.show'); 

と抽象ShopController上:

/** 
* Display the specified product. 
* 
* @param string $slug 
* @param null $product 
* 
* @return \Illuminate\Http\Response 
*/ 
public function show($slug) { 
    $product = Product::active()->where('slug', $slug)->firstOrFail(); 

    return view('pages.shop.product')->with($this->singularProductData($product)); 
} 

/** 
* Display the specified product modal. 
* 
* @param int $id 
* 
* @return \Illuminate\Http\Response 
*/ 
public function modal($productId) { 
    $product = Product::active()->findOrFail($productId); 

    if(request()->ajax()) { 
     return view('_partials.shop.modal-content')->with($this->singularProductData($product)); 
    } 

    return redirect()->action("{$this}@show", [ $product->slug ]); 
} 

私は今、ルートパラメータとして{slug}にこれを変更しました。最近5.1から5.2にアップグレードした後、これは私が気づいていなかったフレームワークの変更、コントローラーのメソッドとルートのパラメーター名が一致する必要がありますか?とにかく、今や幸せになった。

同じパスを使用してモーダルを追加したモーダルのルートがあるため、これも変更してLaravelが混乱することはありません。モーダルルートは今や/guest/shop/modal/{productId}です。モーダルコントローラメソッドは、$productIdパラメータを介して製品を検索するだけであり、リクエストがajaxを経由しないと、redirect()->action()ヘルパー経由でshowメソッドにリダイレクトされます。

モーダルとショールートの類似した構造のため、私は私が最初にモーダルルートを置い確保しているため、それ以外の場合は、常に私が行く404

2

ブラウザに正確なURLを入力していますか?あなたは

Route::get('guest/shop/{product}', '[email protected]')->name('guest.shop.show'); 

を持っていますが、ルートが

Route::get('guest/shop/{slug}/{product?}', '[email protected]')->name('guest.shop.show'); 

する必要がありますので、showメソッドは、2つのパラメータの$スラグとオプションの$製品を期待していそうでなければ、あなたが唯一の製品を必要とする場合の方法とルートは以下のようにする必要があります:

Route::get('guest/shop/{product?}', '[email protected]')->name('guest.shop.show'); 

public function show($product = null) 
{ 

} 
+0

ルート相対URLは '/ゲスト/ショップ/で返しますqui-eius-et-amet-ut-et-tempora」と呼ばれる。ラテンの部分はスラグで、フェイカーを介して播種されます。 – Ben

+0

また、私はUserControllerを使用していません。 – Ben

+0

ええ私はGuestShopControllerではなくUserController – tnash

関連する問題

 関連する問題