如何在Laravel的路由上动态调用方法?
我是这个新手,我需要一些帮助。如何在Laravel的路由上动态调用方法?
我正在开发某种音乐库,并让我们说我不想为每个艺术家,所以我做出这一个路径:
Route::get('/{artist_name}', '[email protected]{artist_name}');
我得到的{artist_name}
从我的价值查看和路由工作,例如,artist_name
可能是约翰和生成的url是localhost:8000/John
。但是当涉及到在控制器中寻找类时,它不起作用。我有一个在我的控制器名为John类,但我不断收到这个错误,当我尝试访问:
BadMethodCallException 方法[{} ARTIST_NAME]不存在。
所以我猜这条路线没有取值{artist_name}
。我想要的是要处理的路线,如:
Route::get('/John', '[email protected]');
但正如我所说的,我不想为艺术家创建特定路线。
我会很感激任何形式的帮助。谢谢
在控制器类中不能有动态方法(控制器动作)。相反,您应该定义一个方法并将路由参数传递给该操作。
在你的路线(web.php
)文件:
Route::get('/{artist_name}', '[email protected]');
然后在ArtistController.php
:
public function artist ($artist_name) {
// do stuff based on $artist_name
}
为了获得更多的信息读取这些2个文档页面。 Controller和Routing。
没有必要为每位艺术家创建动态方法。您可以在控制器中使用一种通用方法来处理从数据库检索适当的艺术家信息并将其传递给视图。
routes文件:
Route::get('artists/{artist_id}', '[email protected]');
ArtistsController.php
class ArtistsController extends Controller
{
public function show($artist_id)
{
$artist = Artists::find($artist_id);
return view('artists.show', ['artist' => $artist]);
}
}
所以,如果用户点击以下网址http://localhost/artists/4的4艺术家ID将被传递到展示方法,它会动态地看对于具有该ID的艺术家并将艺术家的对象传递给您的视图。
当然,您不仅限于您的网址中的ID。您可以使用该名称,如果它是唯一的,您的代码将如下所示。
routes文件:
Route::get('artists/{artist_name}', '[email protected]');
ArtistsController。php
class ArtistsController extends Controller
{
public function show($artist_name)
{
$artist = Artist::where('name', $artist_name);
return view('artists.show', ['artist' => $artist]);
}
}
我建议您阅读this documentation以获取有关路由的更多信息。
您是否将自己的艺术家数据存储在数据库中? –
可以理解的是,你不想为每个艺术家创建具体的路线。但是你是否在每个艺术家的控制器中创建了一个特定的功能?我不信。 – ayip
https://laracasts.com/series/laravel-from-scratch-2017/episodes/7 –