Как добавить имя функции в качестве маршрута в Laravel 5.7? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть контроллер, который возвращает перечисления для соответствующих полей. например,

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

У меня около 20 таких функций. Как я могу добавить это, не добавляя запись вручную для каждой функции в файле маршрутов?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Если ответы всегда поступают из жестко закодированных массивов (а не из базы данных), то одним из способов может быть использование переменной в вашем маршруте:

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

А затем в методе вашего контроллера используйте переменную для получения правильных данных из массива с ключами:

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

    return $fields[$field];
}

Если вы хотите продолжить использовать разные методы для каждого поля, тогда ответ Михаэля - самый простой вариант, с одним предупреждением. Разрешение пользователям вызывать любой метод по имени на вашем контроллере - это угроза безопасности . Чтобы защитить себя, вы должны проверить имя метода в белом списке.

0 голосов
/ 06 ноября 2018

В вашем файле маршрутов добавьте что-то вроде этого,

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('/');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...