У меня есть приложение, которое я создаю в Laravel, это второй раз, когда я серьезно его использовал. Приложение предоставляет вам возможность входа в систему и доступа к определенным областям сайта, к которым гости или посетители могут не иметь доступа. Это довольно стандартный тариф каждого веб-сайта с возможностью регистрации, а Laravel по умолчанию предоставляет некоторые стандартные способы обработки их с уже созданными фильтрами:
// LARAVEL DEFAULT FILTER Route::filter('auth', function() { if (Auth::guest()) { if (Request::ajax()) { return Response::make('Unauthorized', 401); } else { return Redirect::guest('login'); } } });
Мое приложение делает это еще дальше и предоставляет различные разрешения (вы также можете назвать их уровнями или ролями), которые пользователь может иметь. Сорт подобный, но гораздо менее сложный, чем скажем, переполнение стека. Я собираю перечисление для представления этих уровней, причем большее число обеспечивает больший доступ к тем областям, которые другие могут не иметь:
abstract class UserRole { const Unauthenticated = 1; const Member = 2; const Subscriber = 3; const CharterSubscriber = 4; const Moderator = 5; const Administrator = 6; }
Из-за этого я обнаружил, что настраиваю фильтры, которые очень похожи друг на друга, и я чувствую, что из-за этого я нарушаю DRY. Фильтры проверяют, есть ли у вас необходимые разрешения для доступа к определенным страницам, например:
Route::filter('mustBeMemberOrGreater', function() { if (Auth::guest() || Auth::user()->role_id < UserRole::Member) { return Redirect::home(); } }); Route::filter('mustBeSubscriberOrGreater', function() { if (Auth::guest() || Auth::user()->role_id < UserRole::Subscriber) { return Redirect::home(); } }); Route::filter('mustBeModeratorOrGreater', function() { if (Auth::guest() || Auth::user()->role_id < UserRole::Moderator) { return Redirect::home(); } }); // etc, etc
Как вы можете видеть, все они очень похожи друг на друга. В любом случае я могу превратить эту функциональность в нечто менее дублирующее? Все, что я знаю, это фильтры Laravel, поскольку я использую их сейчас. Какие другие альтернативы настройки фильтра у меня есть в моем распоряжении? Должен ли я использовать фильтры, может ли такая логика быть лучше в моих контроллерах?
Весь ввод оценивается.