使用Laravel 5.6,我们当前正在编写一个API,它将接受来自各种来源的输入。某些消息源希望以其他方式传递数据,而其余消息源除外。我希望我们的API尽可能灵活,所以我们愿意为一个字段接受多个名称。
例如,如果我们在表中存储名字,则将其存储为first_name。但是,某些api可能会将其传递为名字,甚至名字。
我可以(并且目前是)在Input上检查其他字段名称是否存在,如果存在,请将其他字段名称的内容复制到预期的字段名称中。
这是一个粗略的示例(不完全是我们的操作方式,但足够接近):
if (Input::has('firstname')) {
Input::merge(['first_name'=>Input::get('firstname')]);
}
如您所见,这很脏,加班会导致问题并变得笨拙。
一个有用的选项(尤其是使用具有多个可能名称的列)是执行以下操作:
$first_names = ['firstname', 'firstName', 'name1'];
foreach ($first_names as $name) {
if (Input::has($name)) {
Input::merge(['firstname'=>$name]);
break;
}
}
我看不到任何使它更容易实现的方法(我们甚至可以在其周围包装一个包装器,以便我们可以传递可能的名称和期望的字段名称的数组),但是总是有可能忽略一个更简单的方法解决方案或不了解某些功能。
是否有更简单/更可靠的方法来完成上述操作?
答案 0 :(得分:1)
PHP 7.0新增的“空合并运算符”使您可以执行以下操作。即如果设置了第一个输入,则使用它,如果不使用第二个输入。
$firstname = Input::get('firstname') ?? Input::get('firstName');
从docs ...
Coalescing可以链接起来:这将返回$ _GET ['user'],$ _ POST ['user']和'nobody'中的第一个定义的值。
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
如果可能的话,您可以将空合并运算符放在merge()
内,也可以执行以下操作...
$firstname = Input::get('firstname') ?? Input::get('firstName') ?? Input::get('name1');
Input::merge(['first_name'=>$firstname]);