【问题标题】:PHP laravel automatic routingPHP laravel 自动路由
【发布时间】:2017-12-17 02:29:47
【问题描述】:

我正在使用 laravel 5.5,我正在尝试使用自动路由到控制器,但它不起作用

在web.php中(这个版本的路由文件) 我有后续行

Route::resource('panel', 'panel');
Route::resource('/', 'HomeController');

在面板中我有以下操作

namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class panel extends Controller{
    public function index(){
        return \View::make('panel.index');
    }

    public function registrar(){
        return \View::make('panel.registrar');
    }

}

但它只调用index() 视图 用户访问 url 时不会调用 registrar() 视图

site.com/panel/registrar

以下错误正在屏幕上打印

"Method [show] does not exist on [App\Http\Controllers\panel]."

我尝试使用 base_controller 但它也不起作用

"Class 'App\Http\Controllers\Base_Controller' not found"

有没有办法识别这些操作?

【问题讨论】:

  • 基本上我们没有你所说的“自动”路由,它不再是一个东西了

标签: php laravel laravel-5


【解决方案1】:

资源路由设置了 7 个特定的路由,即控制器上需要的 7 个特定方法,7 个。如果您不想要所有 7 个路由,则必须以这种方式定义它。

资源路由不是隐式控制器。它不查看控制器上的方法然后进行路由..资源路由是“特定”的事情。我们在 Laravel 中不再有隐式控制器,因为这真的没有意义。

Laravel 5.5 Docs - Controllers - Resource Controllers

您创建的路由指向不存在的方法,这就是错误所在。

另外,Route::resource 的第一个参数是资源“名称”,而不是 PATH。从技术上讲,它不是 URI。它是资源的名称。

Route::resource('/', ...) // not a name

【讨论】:

  • 我刚刚看到所有三个答案,所有三个解释,给出了问题的原因和解决方案。
【解决方案2】:

这是一个具有基本 CRUD 操作的资源控制器,因此为了工作,您必须定义其余方法,就像您应该添加一个方法 show() 一样,然后在该方法中呈现您想要的视图。

资源控制器必须定义以下方法:

class TestController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

而基本控制器显然不是Base_Controller,而是Controller

更多信息请参考这里Laravel 5.5 Resource Controllers

【讨论】:

    【解决方案3】:

    如果您不需要所有资源方法,请将此资源更改为简单的 get

      Route::get('/panel', 'panel@index');
      Route::get('/panel/registrar', 'panel@registrar');
    

    并使用home 而不是只使用/ 来获得不冲突的网址

     Route::resource('home', 'HomeController');
    

    【讨论】:

    • 是的,实际上他们根本不应该使用资源路由,很可能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2014-04-20
    • 2012-08-16
    • 1970-01-01
    • 2018-10-04
    • 2021-07-02
    相关资源
    最近更新 更多