在刀片中使用时,路由未将变量传递给控制器

时间:2019-05-08 23:36:46

标签: laravel

我在视图中使用命名路由,同时传递了两个变量,但是会引发错误,即不传递任何参数。

我知道我可以为href构造url,但是到目前为止,我正在尝试的内容也可以正常工作(而且我看不出我在做什么)确实来自文档示例)。

show.blade.php中的链接

<a href="{{ route('tasks.create', ['colony_slug' => $colony->slug, 'action_name' => 'change_name']) }}">Change Name</a>

在浏览器中,链接显示为

http://localhost/tasks/create?colony_slug=labr-oclh&action_name=change_name

在web.php中路由

Route::get('tasks/create/{colony_slug}/{action_name}', 'TaskController@create')->name('tasks.create');

TaskController @ create

// CREATE ACTION
// =========================================================================
    /**
     * Show the form for creating a new resource.
     *
     * @param string $colony_slug
     * @param string $action_name
     * 
     * @return \Illuminate\Http\Response
     */
    public function create($colony_slug, $action_name)
    {
        dd($colony_slug . " " . $action_name);
    }

错误

Too few arguments to function App\Http\Controllers\TaskController::create(), 0 passed and exactly 2 expected

路线列表

|        | GET|HEAD  | tasks                                    | tasks.index                      | App\Http\Controllers\TaskController@index                              | web,auth
         |
|        | POST      | tasks                                    | tasks.store                      | App\Http\Controllers\TaskController@store                              | web,auth
         |
|        | GET|HEAD  | tasks/create/{colony_slug}/{action_name} | tasks.create                     | App\Http\Controllers\TaskController@create                             | web,auth
         |
|        | PUT|PATCH | tasks/{task}                             | tasks.update                     | App\Http\Controllers\TaskController@update                             | web,auth
         |
|        | DELETE    | tasks/{task}                             | tasks.destroy                    | App\Http\Controllers\TaskController@destroy                            | web,auth
         |
|        | GET|HEAD  | tasks/{task}                             | tasks.show                       | App\Http\Controllers\TaskController@show                               | web,auth
         |
|        | GET|HEAD  | tasks/{task}/edit                        | tasks.edit                       | App\Http\Controllers\TaskController@edit                               | web,auth
         |
| 

2 个答案:

答案 0 :(得分:1)

通过评论问题发现,问题是您的自定义路由与资源控制器路由冲突。特别是在路由名称中(通过named()),即使它们使用相同的URI,也应始终是唯一的。

您可以使用几种解决方案,具体取决于您的功能目标是什么:

解决方案:我只需要一条“创建任务”路线

使用task.create修饰符禁用资源控制器创建的except()路由:

Route::resource('tasks', 'TasksController')->except(['create']);

保持其他路线定义不变。这将从您的应用中删除URI /tasks/create,并保留其中的附加参数。

解决方案:我想同时使用两者

路由路径本身是可以的,并且仅通过名称冲突。为您的自定义路线命名其他名称,并在需要使用其他参数时使用它。

Route::get('tasks/create/{colony_slug}/{action_name}', 'TaskController@create')->name('tasks.create-custom');

解决方案:我想在“创建任务”表单上指定默认设置

我猜测您正在使用这些参数,以便在“创建任务”表单中设置一些默认值。如果那是您的最终目标,那么使用默认的Resource Controller route +查询字符串参数同样可以很好地工作,并且不会涉及额外的路由。

  1. 删除多余的自定义路由,并坚持使用资源控制器中的默认设置

  2. 在您的Illuminate\Http\Request控制器方法中声明一个create()依赖项:

    public function create(Request $request)
    {
        // ...
    }
    
  3. 检查query string values in the request,并将其作为默认值添加到表单中。

答案 1 :(得分:0)

当我查看您提供的所有代码时,对我来说似乎是正确的。 也许您应该检查您的路线文件。请记住,路由的优先级最高是波顿,如果您有另一条名称与相似的路由,则可能是该路由的优先级高于您尝试使用的路由。