Laravel - Принятие нескольких имен для одного столбца - PullRequest
0 голосов
/ 16 сентября 2018

Используя Laravel 5.6, в настоящее время мы пишем API, который будет принимать входные данные из различных источников. Некоторые источники ожидают передачи данных определенным образом, кроме остальных. Мне бы хотелось, чтобы наш API был максимально гибким, поэтому мы готовы принять более одного имени для поля.

Например, если мы сохраним имя в нашей таблице, мы сохраним его как first_name. Однако некоторые API могут передать его как имя или даже имя.

Я могу (и в настоящее время являюсь) на входе, проверяя наличие других имен полей, и, если они существуют, копируя содержимое другого имени поля в ожидаемое имя поля.

Вот грубый пример (не совсем то, как мы это делаем, но достаточно близко):

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;
    }    
}

Я не вижу каких-либо методов, которые могли бы сделать это намного проще (мы можем даже обернуть его вокруг него, чтобы мы могли передать массив возможных имен и ожидаемое имя поля), однако всегда можно пропустить гораздо проще решение или не знать о определенной функциональности.

Есть ли более простой / более надежный способ сделать это?

1 Ответ

0 голосов
/ 16 сентября 2018

«Нулевой оператор объединения», новый для PHP 7.0 , позволяет вам делать что-то подобное.Т.е. если задан первый вход, используйте его, если не используете второй.

$firstname = Input::get('firstname') ?? Input::get('firstName');

Из документов ...

Коалесцирующая банкабыть цепочкой: это вернет первое определенное значение из $ _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]);
...