当前位置: 首页 > 知识库问答 >
问题:

未找到Laravel 5.2控制器方法,但显示在artisan route:列表中

莫承运
2023-03-14

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

调试时我已经完成的操作:

  • Ranphp artisan路由:列表和确认的路由、控制器和中间件都匹配
  • 运行composer dumpautoload
  • 已将路线移动到路线的顶部。php
  • 将抽象ShopController的方法移动到GuestShopController,并将GuestShopController的扩展更改为Laravel默认控制器

共有2个答案

白禄
2023-03-14

@Chikurubi的回答基本上是正确的。这使我改变了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之后,这可能是我不知道的框架中的一个变化,控制器方法和路由中的参数名称必须匹配?不管怎么说,现在修好了,很开心。

因为我有一个modals的路径,它使用相同的路径,附加了modal,我也改变了这一点,这样Laravel就不会被它弄糊涂了。模式路径现在是/guest/shop/modal/{productId}。modal controller方法现在只通过$productId参数查找产品,如果请求不是通过ajax来的,它会通过重定向()将用户重定向到show方法-

由于modal和show路线的结构相似,我确保将modal路线放在第一位,否则它将始终返回404。

杭胜
2023-03-14

确切地说,你在浏览器中放了什么url?你有

Route::get('guest/shop/{product}', 'GuestShopController@show')->name('guest.shop.show');

但是show方法需要两个参数$slug和一个可选的$product,所以路由应该是

Route::get('guest/shop/{slug}/{product?}', 'GuestShopController@show')->name('guest.shop.show');

否则,如果您只需要产品,则方法和路线应如下所示:

    Route::get('guest/shop/{product?}', 'GuestShopController@show')->name('guest.shop.show');

public function show($product = null)
{

}
 类似资料:
  • 由于某种原因,即使目标控制器类已经存在于正确的路径中,也找不到它。 路线 我的控制器路径是App- 这是我的控制器: 我已经尝试了作曲家转储-自动加载。我使用laravel框架8.0,所以我也试图恢复和使用7.24。仍然没有找到目标类。

  • 我一直在犯这个错误 你们可以看到,我的项目里有那个文件。 我还尝试重新启动我的本地MAMP服务器并清除缓存 我也做了 请让我知道我还能做什么。 路线 route::get(“/”,function(){return redirect::to(“/baby/signin”);});route::get(“/baby/signin”,“BabyAccountController@signin”);

  • 我有一个REST API,当没有找到记录时返回404。 我使用 Rx 和 j 查询来调用 API。我可以捕获404响应,但是错误不断出现在浏览器的控制台中,就好像找不到资源URL一样,而实际上只是因为没有找到记录。 我如何处理这种(没有找到记录)404响应,使它们不出现在控制台中? 还是“没有找到记录”实际上应该用空的尸体返回200 OK?

  • 本文向大家介绍thinkPHP控制器变量在模板中的显示方法示例,包括了thinkPHP控制器变量在模板中的显示方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP控制器变量在模板中的显示方法。分享给大家供大家参考,具体如下: 控制器中变量 模板中引用位置一:php代码中,直接用$i; 模板中引用位置二:模板中直接应用{$i}或者 class="{$unlogined}"

  • 本文向大家介绍matplotlib.pyplot绘图显示控制方法,包括了matplotlib.pyplot绘图显示控制方法的使用技巧和注意事项,需要的朋友参考一下 在使用Python库时,常常会用到matplotlib.pyplot绘图,本文介绍在PyCharm及Jupyter Notebook页面中控制绘图显示与否的小技巧。 在PyCharm中显示绘图 在绘图代码最后加上“plt.show()”

  • 我们面临错误,应用程序无法连接到队列管理器,原因代码为mqrc 2538, “侦听器可用,但当我试图显示此侦听器的状态时,它显示未找到MQ对象。” 我们已经检查了错误日志,但没有相关客户端失败的信息。我们手动启动了监听器,监听器信息只在错误日志中可用。 我们还检查了“/var/mqm/error”,我们发现了FDC文件“Probe ID:xy132002”,我们与sysadmin有联系,他们挂载了