我的一个Laravel 5.2路由/控制器出了问题,特别是我收到错误Controller method not found.
路线:
Route::get( 'guest/shop/{product}', 'GuestShopController@show' )->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 );
}
}
我在调试时已经完成的事情:
答案 0 :(得分:2)
您准确地在浏览器中添加了什么网址?
this.router.subscribe(function(url){
if( typeof url !== "undefined" ) {
if( url.length > 0 ) {
console.log('Handle router changes /' + url);
}
}
}.bind(this));
但是show方法需要2个参数$ slug和一个可选的$ product,所以路由应该是
Route::get('guest/shop/{product}', 'GuestShopController@show')->name('guest.shop.show');
否则,如果您只需要产品,方法和路线应如下所示:
Route::get('guest/shop/{slug}/{product?}', 'GuestShopController@show')->name('guest.shop.show');
答案 1 :(得分:0)
@ chikurubhi的回答大多是正确的。它让我改变了url结构并稍微重新控制了控制器方法。
Route::get( 'guest/shop/modal/{productId}', 'GuestShopController@modal' )->name( 'guest.shop.modal' );
Route::get( 'guest/shop/{slug}', 'GuestShopController@show' )->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。