Laravel 5.2控制器方法未找到但出现在工匠路线:列表中

时间:2016-05-23 16:03:18

标签: php laravel-5

我的一个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 );
    }
}

我在调试时已经完成的事情:

  • php artisan route:list并确认路线,控制器和中间件都匹配 php artisan route:list
  • composer dumpautoload
  • 将路线移至路线顶部.php
  • 将抽象ShopController的方法移动到GuestShopController中,并将GuestShopController的扩展名更改为Laravel默认控制器

2 个答案:

答案 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。