如何在Laravel 5.7中添加函数名称作为路由?

时间:2018-11-06 03:41:14

标签: php laravel laravel-5 routing laravel-5.7

我有一个控制器,该控制器返回各个字段的枚举。例如

// Expected route - /api/getFamilyTypes - only GET method is allowed
public function getFamilyTypes()
{
    return [
        'Nuclear Family',
        'Joint Family'
    ];
}

我大约有20个这样的功能。如何在不手动在路由文件中为每个函数添加条目的情况下添加它?

谢谢。

2 个答案:

答案 0 :(得分:1)

如果响应始终来自硬编码数组(而不是来自数据库),则一种方法可能是在路由中添加变量:

Route::get('/api/enum/{field}', 'EnumController@getField');

然后在您的控制器方法中,使用变量从键控数组中获取正确的数据:

public function getField($field)
{
    $fields = [
        'family' => [
            'Nuclear Family',
            'Joint Family'
        ],
        // ...
    ];

    return $fields[$field];
}

如果您想继续对每个字段使用不同的方法,那么迈克尔的答案是最简单的选择,但有一个警告。允许用户在控制器上按名称调用任何方法都是安全隐患。为了保护自己,您应该针对白名单 validate 方法名称。

答案 1 :(得分:0)

在您的路线文件中,添加类似以下内容的

Route::get('/something/{func}', 'SomeController@functionRoute');

something是您要使用的任何路径,SomeController是具有您正在使用的20个功能的控制器,而functionRoute是我们将要使用的操作制造。

然后在您的控制器中,执行以下功能

public function functionRoute($func)
{
    return $this->$func();
}

这样做将使每当有人浏览您网站上的/something/*时,它都会在末尾执行函数名称。因此,如果您导航到/something/getFamilyTypes,它将运行您的getFamilyTypes函数。

这不是特别安全。如果执行此操作,则用户将能够运行控制器的任何方法。您可以像这样设置黑名单。

public function functionRoute($func)
{
    $blacklist = [
        'secret',
        'stuff',
    ];
    return in_array($func, $blacklist) ? redirect('/') : $this->$func();
}

或者您可以像这样设置白名单,

public function functionRoute($func)
{
    $whitelist = [
        'getFamilyTypes',
        'otherUserFriendlyStuff',
    ];
    return in_array($func, $whitelist) ? $this->$func() : redirect('/');
}