我是laravel的新手。我正在将此路线定义为编辑按钮:
<a href="/editTasks/{{ $task->id }}"><button class="btn btn-primary">Edit task</button></a>
该URL生成正常,但是找不到该页面。我通过此路线返回了TaskController@edit
的视图:
Route::get('/editTasks/{{ $task->id }}', 'TaskController@edit');
有人可以帮我弄清楚我在做什么错吗?
答案 0 :(得分:6)
定义路线时,路线参数周围应仅包含一个{
。另外,您不应在声明中使用变量,而应使用变量的名称。
在您的示例中,这可能是有效的声明:
Route::get('/editTasks/{id}', 'TaskController@edit');
更多信息可以在文档中找到:https://laravel.com/docs/5.7/routing#route-parameters
还建议使用路由名称,以便可以自动生成网址。
例如:
// Route declaration
Route::get('/editTasks/{id}', 'TaskController@edit')->name('tasks.edit');
// In view
<a href="{{ route('tasks.edit', [$task->id]) }}">Edit task</a>
答案 1 :(得分:2)
您需要使用一个{
而不是两个,因此您的路由中必须使用以下内容:
Route::get('/editTasks/{taskId}', 'TaskController@edit');
在您的edit
函数中:
public function edit($taskId) { }
模板中的双{
是正确的,因为这表明要检索变量
其他信息/建议
建议让路由中的变量名称与您的函数定义中的变量匹配(如上所示),因此您始终会在函数中获得期望的变量。如果它们不匹配,Laravel将使用索引来解析变量,即,如果您的路由模式中有多个变量并且仅在函数中使用一个变量,即使您可能想要第二个变量,它也会采用您的第一个路由参数。
示例:
如果您的路线的模式为/something/{var1}/something/{var2}
,并且函数为public function test($variable2)
,则它将使用var1
而不是var2
。因此,最好让这些名称匹配,以便您始终在函数中获得期望的值。
答案 2 :(得分:2)
不必像这样定义路线:
Route::get('/editTasks/{id}', 'TaskController@edit');
您的路线中没有$ task,并且您无需在路线中编写任何其他内容。在您的控制器中,您可以像下面这样访问此ID:
public function edit($taskId) {
}
只有您这样做
答案 3 :(得分:0)
最好使用"Route Model Binding"。您的路线应如下所示:
(?=\]\])
然后在Controller中使用如下代码:
$re = '@<!CDATA\[.*?/\K\w+\.\jpg(?=\]\])@';
$str = '<!CDATA[/2018/08/hello.jpg]]><!CDATA[/2018/08/another.jpg]]>';
preg_match_all($re, $str, $matches);
print_r($matches[0]);