如何路由动态网址?

时间:2018-10-17 07:31:28

标签: laravel

我是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');

有人可以帮我弄清楚我在做什么错吗?

4 个答案:

答案 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]);