我在视图中使用命名路由,同时传递了两个变量,但是会引发错误,即不传递任何参数。
我知道我可以为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
|
|
答案 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 +查询字符串参数同样可以很好地工作,并且不会涉及额外的路由。
删除多余的自定义路由,并坚持使用资源控制器中的默认设置
在您的Illuminate\Http\Request
控制器方法中声明一个create()
依赖项:
public function create(Request $request)
{
// ...
}
检查query string values in the request,并将其作为默认值添加到表单中。
答案 1 :(得分:0)
当我查看您提供的所有代码时,对我来说似乎是正确的。 也许您应该检查您的路线文件。请记住,路由的优先级最高是波顿,如果您有另一条名称与相似的路由,则可能是该路由的优先级高于您尝试使用的路由。