2016-05-23 46 views
1

我有一個問題,我的Laravel 5.2路由/控制器之一,特別是我得到Controller method not found.Laravel 5.2控制器的方法沒有找到,但出現在工匠路線:列表

路線的錯誤:

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

控制器和控制方法:

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
  • composer dumpautoload
  • 到routes.php文件的頂部移到路線
  • 移到抽象ShopController的方法分爲GuestShopController和改變GuestShopController延伸到Laravel默認控制器

回答

0

@ chikurubhi的回答大多是正確的。它讓我改變了網址結構並略微重新調整了控制器方法。

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

你在瀏覽器中準確地輸入了什麼網址?你有

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

但表演方法需要兩個參數$蛞蝓和一個可選的$產品所以路徑應該是

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

否則,如果你只需要在產品的方法和途徑應該是如下:

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

public function show($product = null) 
{ 

} 
+0

根相對URL我去的是'/客/店/魁eius-ET-阿梅特-UT-ET-tempora'。拉丁部分是通過faker播種的slu slu。 – Ben

+0

另外,我沒有使用UserController。 – Ben

+0

是的我的意思是GuestShopController不是UserController – tnash

相關問題