Урок 13. Знакомство с хелпером, группами маршрутов и посредниками Laravel


На этом уроке мы познакомимся с хелпером, группами маршрутов и посредниками. Как обычно, все с примерами. Если что-то непонятно, то не переживайте – на следующих уровках все будет рассмотрено подробнее, пока только узнаем основы. Все уроки по Laravel.

Передача параметров маршрута хелперу (помощнику)

Если у вашего маршрута есть параметры (например, пользователи/идентификатор), вам необходимо определить эти параметры при использовании помощника route() для создания ссылки на маршрут.

Существует несколько различных способов передачи этих параметров. Давайте представим маршрут, определенный как пользователи/идентификатор пользователя/комментарии/идентификатор комментария. Если идентификатор пользователя равен 1, а идентификатор комментария равен 2, давайте рассмотрим несколько доступных нам вариантов:

route('users.comments.show', [1, 2])
// http://test.com/users/1/comments/2


route('users.comments.show', ['userId' => 1, 'commentId' => 2])
// http://test.com /users/1/comments/2

route('users.comments.show', ['commentId' => 2, 'userId' => 1])
// http://test.com /users/1/comments/2


route('users.comments.show', ['userId' => 1, 'commentId' => 2, 'opt' => 'a'])
// http://test.com /users/1/comments/2?opt=a
Как вы можете видеть, значения не ассоциативных массивов назначаются по порядку; значения массива с ключами сопоставляются с параметрами маршрута, соответствующими их ключам, и все, что осталось, добавляется в качестве параметра запроса.

Группы маршрутов

Часто группа роутов имеет общую характеристику — определенное требование аутентификации, префикс пути или, возможно, пространство имен контроллера. Определение этих общих характеристик снова и снова на каждом маршруте не только кажется утомительным, но и может испортить форму файла маршрутов и затуманить некоторые структуры вашего приложения.

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

Чтобы сгруппировать два или более маршрутов вместе, вы “окружаете” определения маршрутов группой маршрутов, как показано в коде ниже. На самом деле вы фактически передаете замыкание в определение группы и определяете сгруппированные маршруты внутри этого замыкания.

Route::group(function () {
    Route::get('hello', function () {
        return 'upread';
    });
    Route::get('world', function () {
        return '.ru';
    });
});
По умолчанию группа маршрутов фактически ничего не делает. Нет никакой разницы между использованием группы в примере выше и разделением сегмента ваших маршрутов комментариями к коду.

Посредники

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

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

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

Route::middleware('auth')->group(function() {
    Route::get('dashboard', function () {
        return view('dashboard');
    });
    Route::get('account', function () {
        return view('account');
    });
});
Применение посредников в контроллерах

Часто проще подключать посредников к вашим маршрутам в контроллере, а не в определении маршрута. Вы можете сделать это, вызвав метод middleware() в конструкторе вашего контроллера. Строка, которую вы передаете методу, является именем посредника, и вы можете дополнительно связать методы-модификаторы (only() и except()) чтобы определить, какие методы получат этого посредника:

class DashboardController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('admin-auth')
            ->only('editUsers');

        $this->middleware('team-member')
            ->except('editUsers');
    }
}
Обратите внимание, что если вы выполняете много настроек only и except, это часто является признаком того, что вам следует создать новый контроллер для исключительных маршрутов.

Ограничение скорости

Если вам нужно ограничить доступ пользователей к любому заданному маршруту (маршрутам) только определенным количеством раз за заданный промежуток времени (называемый ограничением скорости и наиболее распространенный в API), для этого в версии 5.2 и выше есть готовый посредник. Примените посредник throttle, которые принимает два параметра: первый - количество попыток, разрешенных пользователю, и второй - количество минут ожидания перед сбросом количества попыток. Пример ниже демонстрирует его использование.

Применение посредника, ограничивающего скорость, к роуту

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/profile', function () {
        //
    });
});
Ограничение динамической скорости

Если вы хотите отличить ограничение скорости одного пользователя от ограничения скорости другого, вы можете поручить посреднику извлечь количество попыток (его первый параметр) из модели Eloquent. Вместо того, чтобы передавать количество попыток в качестве первого параметра throttle, вместо этого передайте имя атрибута в модели Eloquent, и этот атрибут будет использоваться для расчета того, превысил ли пользователь свой лимит скорости.

Итак, если в вашей пользовательской модели есть атрибут plan_rate_limit, вы можете использовать посредника с throttle:plan_rate_limit,1.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по Laravel, маршрутизация, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




MAC-адрес C#
Магия закончилась: часть 1
Дочерние темы и вариативный товар WordPress