我有一个控制器,该控制器返回各个字段的枚举。例如
// Expected route - /api/getFamilyTypes - only GET method is allowed
public function getFamilyTypes()
{
return [
'Nuclear Family',
'Joint Family'
];
}
我大约有20个这样的功能。如何在不手动在路由文件中为每个函数添加条目的情况下添加它?
谢谢。
答案 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('/');
}