Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.06.2021 12:13:33

Не могу организовать редирект

Здравствуйте!

Существует БД на PostgreSQL, со своей собственной системой хранения пользователей и их ролей. Требуется сделать веб-приложение, для работы с этой БД.

Ранее у меня был опыт работы во фреймворке Kohana, но он сдох, поэтому я выбрал Laravel.

Этот опыт со мною играет злую шутку. Начал делать так, как дела всегда. Создаю контроллер-предка, в котором выполняю все однотипные действия, присущие унаследованным контроллерам.

Обычно я в этом предке проверял, аутентифицирован ли пользователь, и если нет, редиректил его на страницу логина. Таким образом все остальные страницы оказывались недоступны неаутентифицированному пользователю.

Здесь я пошёл этим же путём. Добавил в уже существующий контроллер Controller.php нужный функционал и в теле конструктора делают редирект к нужному мне адресу:

    
public function __construct()
    {
// тут какой-то код
        if (!$this->IsAuth()) return redirect('/user');

    }

Но эта директива ни к чему не приводит. Просто не работает.

Вчитался в маны. Вычитал, что я могу передать управление в посредник. Сделал свой посредник, написал тестовую функцию, зарегистрировал его в Kernel.php

    public function handle(Request $request, Closure $next)
    {
        if (true) return redirect('/user');
        return $next($request);
    }

Прописал роутинг

Route::get('test', [MainController::class, 'test'])->middleware('CheckAuth');

На выходе браузер ругается: ERR_TOO_MANY_REDIRECTS

Подскажите, что я делаю не так и как можно реализовать редирект?

Спасибо!

Не в сети

#2 02.07.2021 18:09:52

Re: Не могу организовать редирект

Подскажите, что я делаю не так и как можно реализовать редирект?

  Если честно , я не понял какой велосипед Вы пытаетесь построить , но на этом же форуме в разделе Документация , почитайте раздел Аунтефикация. Ссылка ,если чО. https://laravel.ru/docs/v5/authentication

Изменено DzonyBB (02.07.2021 19:05:36)

Не в сети

#3 03.07.2021 06:51:29

Re: Не могу организовать редирект

Конструктор контроллера выполняется ДО того как обрабатываются куки и происходит идентификация пользователя. Поэтому проверка не работает.

Если я правильно понял задумку, то вам надо воспользоваться controller middleware. Объявление middleware не означает что её код выполнится прямо в этом месте и в этот момент. Мы таким образом помещаем проверку в очередь (стек) посредников, которые выполнятся позже конструктора, но перед обращением к методу-экшену маршрута.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 05.07.2021 20:30:39

Re: Не могу организовать редирект

почитайте раздел Аунтефикация

Мир не завязан на шаблонных моделях из коробки. БД УЖЕ существует и прекрасно работает. Никто не собирается заниматься переделками под Laravel. Требуется прикрутить веб-морду к уже рабочей базе, а не рихтовать рабочую базу под модуль Auth одного из фреймворков. Кстати, в проекте используется сырой SQL.

Конструктор контроллера выполняется ДО того как обрабатываются куки и происходит идентификация пользователя.

Как я понимаю (если не прав, поправьте), ядро фреймворка получает запрос, смотрит в конфиг роутинга и создаёт нужный класс. При создании класса вызывается конструктор, если он есть в наличии. Мне не совсем понятно, почему я могу получить доступ к сессии из любого метода класса, а из конструктора не могу.

Кстати, я действительно воспользовался middleware.

Не в сети

#5 05.07.2021 21:49:51

Re: Не могу организовать редирект

  1. Мне не совсем понятно, почему я могу получить доступ к сессии из любого метода класса, а из конструктора не могу.

Потому что так устроен стек обработки запроса. Сначала сначала выясняется конечная точка маршрута — метод контроллера, создается экземпляр объекта этого контроллера. Потом вызываются мидлвары в прямом проходе чтобы иметь возможность поработать с запросом. И на вершине стека срабатывает обработчик роута, создается ответ на запрос. Затем мидлвары получают управление в обратном порядке, чтобы иметь возможность поработать с объектом ответа.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#6 06.07.2021 11:13:10

Re: Не могу организовать редирект

Потому что так устроен стек обработки запроса.

Ага, т.е. просто потому, что фреймворк так работает.

создается экземпляр объекта этого контроллера

и при создании объекта ему ничего не передаётся? Что-то вроде new Class();

Просто в Кохане при создании класса ему передавался $request и $response, а к сессии я получал доступ через Session::instance();

Хотя, как я понимаю, мне никто не запрещает использовать $_SESSION, кроме понимания, что это будет слишком костыльно и выбиваться из концепции фреймворка.

Правильно ли я понимаю, что в случае с Laravel правильным подходом видится именно использование посредников (middleware), в котором мне будет доступна session?

И разрешите ещё глупые вопросы: в посредниках доступен фасад DB, или есть иные способы достучаться до базы данных? Само собой pg_connect никто не отменял, но это опять выглядит костыльно.

Спасибо!

Не в сети

#7 06.07.2021 14:00:07

Re: Не могу организовать редирект

Ларавель использует симфоневский Http Foundation, поэтому вероятно сходное поведение будет и в множестве других мест: новые версии PHPBB, Drupal и др.

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

Если этот код не увидит никто кроме тебя, то ради бога, используй инородные сущности. Иначе не надо ))) не провоцируй хейт.

Да, правильно через посредников.

DB будет доступен. Также как и классы-модели. Будет всё доступно, кроме объектов, порождаемых в middleware.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#8 06.07.2021 15:11:39

Re: Не могу организовать редирект

не буду пытаться чему-то учить.

Ну вот. А я только собрался поучиться.

Не в сети

#9 22.04.2023 10:34:56

Re: Не могу организовать редирект

Для тех, кто еще не разобрался:

return redirect('/user')->send();

->send()

Не в сети

Подвал раздела