【问题标题】:How can I add function name as route in Laravel 5.7?如何在 Laravel 5.7 中添加函数名称作为路由?
【发布时间】:2018-11-06 03:41:13
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 可以更新其中的一些功能吗?有什么模式吗?

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


【解决方案1】:

在你的路由文件中,添加类似这样的内容,

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('/');
}

【讨论】:

  • 在不受信任的用户输入上调用 $this->$func() 可能是不安全的。它允许在没有参数的情况下调用控制器上的 any 方法——甚至可能是一些从未打算供用户调用的内部方法。
  • 当然,但只要 Ganesh 在该控制器中只有他们希望用户可以访问的方法,这应该不是问题。我只是给了他们他们要求的东西——“如何在不手动为路由文件中的每个函数添加条目的情况下添加它?”如果他们有可接受输入的白名单会更安全,但到那时为什么不将它们全部添加到api.php
  • 请记住,“任何方法”实际上是指任何方法——甚至是由角色提供的私有 Laravel 方法。我没有立即在 Laravel 核心中看到任何有风险的东西,但我也不能肯定地说它是安全的。
  • 我已经对其进行了编辑以添加黑名单和白名单的说明。
【解决方案2】:

如果响应总是来自硬编码的数组(而不是来自数据库),那么一种方法可能是在你的路由中添加一个变量:

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

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

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

    return $fields[$field];
}

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

【讨论】:

  • 这实际上是一种特质。我已经在迁移文件中使用了它,并且想在前端使用它。
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2019-07-05
  • 2019-04-24
  • 2020-11-08
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多