【问题标题】:How to call method dynamically on routes on Laravel?如何在 Laravel 的路由上动态调用方法?
【发布时间】:2017-12-20 14:09:33
【问题描述】:

我是这方面的新手,我需要一些帮助。

我正在开发某种音乐库,假设我不想为每个艺术家制作路线,所以我做了这个:

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

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

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

所以我猜这条路线没有采用{artist_name} 的值。我打算处理的路线如下:

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

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

如果能提供任何帮助,我将不胜感激。谢谢你

【问题讨论】:

标签: laravel methods controller routes


【解决方案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]);
    }
}

因此,如果用户点击以下 URL http://localhost/artists/4,4 的艺术家 ID 将被传递给 show 方法,它会动态查找具有该 ID 的艺术家并将艺术家对象传递给您的视图。

当然,您不仅限于 URL 中的 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 了解有关路由的更多信息。

【讨论】:

    【解决方案2】:

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

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

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

    然后在ArtistController.php:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2017-08-17
      • 2013-01-07
      • 2021-09-03
      • 2018-08-09
      • 1970-01-01
      • 2020-01-10
      相关资源
      最近更新 更多