如何在Laravel上的路由上动态调用方法?

时间:2017-07-15 16:37:28

标签: laravel methods controller routes

我是这个新手,我需要一些帮助。

我正在开发某种音乐库,让我们说我不想为每位艺术家制作一条路线,所以我做了这个:

Route::get('/{artist_name}', 'Artist_controller@{artist_name}');

我从我的视图中获取{artist_name}的值,并且路由有效,例如,artist_name可能是John,生成的网址是localhost:8000/John。但是当谈到在控制器中寻找课程时,它并不起作用。我的控制器中有一个名为John的类,但是当我尝试访问时,我一直收到此错误:

  

BadMethodCallException   方法[{artist_name}]不存在。

所以我猜这条路线并没有取{artist_name}的价值。我想要的是要处理的路线,如:

Route::get('/John', 'Artist_controller@John');

但正如我所说,我不想为艺术家创造一条特定的路线。

我很感激任何帮助。谢谢

2 个答案:

答案 0 :(得分:1)

无需为每位艺术家创建动态方法。您可以在控制器中使用一个通用方法来处理从数据库中检索正确的艺术家信息并将其传递给视图。

路线档案:

Route::get('artists/{artist_id}', 'ArtistsController@show');

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,则艺术家ID为4将传递给show方法,它将动态查找具有该ID的艺术家,并将艺术家对象传递给您的视图。< / p>

当然,您不仅限于网址中的ID。如果名称是唯一的,您可以使用该名称,您的代码如下所示。

路线档案:

Route::get('artists/{artist_name}', 'ArtistsController@show');

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以获取有关路由的更多信息。

答案 1 :(得分:0)

您不能在控制器类中使用动态方法(控制器操作)。相反,您应该定义一个方法并将route参数传递给该操作。

在您的路线(web.php)文件中:

Route::get('/{artist_name}', 'ArtistController@artist');

然后在ArtistController.php

public function artist ($artist_name) {
    // do stuff based on $artist_name
}

要获取更多信息,请阅读这两个文档页面。 ControllerRouting