Как в Laravel переопределить/запретить роут или сервис-провайдер?
Всем привет!
Как переопределить роуты или сервис-провайдеры, которые идут в стандартной установке ларки?
Идея в том, чтобы не трогать то, что было установлено фреймворком - ни конфиги, ни сервис провайдеры. Расширять базовую установку только через пакеты, которые подключаются композером.
В общем разобрался:
1) $this->loadRoutesFrom(...) не переопределяет роуты, почему не знаю, надо разбираться.
2) Работает переопределение следующим образом. В пакете, в инициализирующем провайдере в методе boot необходимо регать RouteServiceProvider, в котором определять файлы роутов.
3) Сервис-провайдер не переопределить и не запретить - и это лишнее.
Задача решена - пакеты можно цеплять только через композер, без затрагивания базового приложения. И спасибо за ответы. Всем мир!
Возможные варианты ответов на этот вопрос скорее всего такие:
1) такое возможно и делается это так ...
2) такое невозможно :(
3) "я не знаю как" - проходить мимо
Например, я хочу сделать пакет "Profile". Такой пакет можно представить как еще одно приложение, со своими провайдерами, и прочей инфраструктурой. Также, например, я хочу сделать пакет "Dashboard", и у него своя инфраструктура. И было бы весьма неплохо, их просто "подцепить" к базовой установке лары, и неважно по каким причинам это потребуется. И главное, чтобы не было необходимости вносить изменения в эту базовую установку, кроме как в композер. Примерно так.
RaDir, нет никакого смысла переопределять сервис-провайдер, переопределять надо сервисы, роуты, обсерверы, роут-паттерны и прочее, регистрируемое/задаваемое сервис-провайдером.
Непонятно, что ты собрался переопределять, какие родные сервисы и роуты (которые ларавел по умолчанию не регает, кстати).
JhaoDa, регает. С сервис-провайдерами допустим нереально. Но routes/web.php (в нем, кстати, корневой урл), и т.д.
Ок, "переопределять надо сервисы, роуты, обсерверы, роут-паттерны и прочее, регистрируемое/задаваемое сервис-провайдером." - как переопределить роут "/"?
JhaoDa, не верю, и правильно делаю. И написал я в тостер не просто так. Роут отработает первым тот, который первым иницилизировался, базовые роуты отрабатываются первыми - поэтому не переопределяются другим сервис-провайдером.
Попробуй, прежде чем неверно отвечать в "тостере". =)
JhaoDa, в общем, перепроверил как через коллбэк, так и через контроллеры - маршрут определяется по первому подходящему роуту (в данном случае базовый роут ларки), остальные игнорируются. Т.е. переопределение не работает!
В дальнейшем споре нет смысла. Ларка 6.2.
P.S. может в старых версиях и работало наоборот.
Да, роут переопределяется, сработает роут номер 2!
Но суть моего вопроса в том, чтобы переопределять базовые роуты, роутами из пакета, подключенного через композер. Как раз вариант переопределения через пакет и не работает, а именно vendor/packageName/routes/web.php не перекроет routes/web.php. Если у тебя наоборот, я бы очень хотел увидеть твой рабочий код.
P.S. то же касается роутов и конкретного пакета, внутри пакета в файлах роутов переопределение работает.
RaDir, это следует из документации, что вариант с register не катит.
Твой провайдер загружается до или после RouteServiceProvider приложения? Раз ты такой фанатичный противник внесения изменений в конфиги, то полагаешься на package discovery?
JhaoDa, я нашел хоть какое-то решение. "Раз ты такой фанатичный противник внесения изменений в конфиги" - это неправда, я за конфиги и я за низкую связность кода. "...то полагаешься на package discovery?" - это дока от ларки по подключению пакетов. Да, я полагаюсь на доку.
Что-то за весь наш с тобой диалог, особенно твоя "конструктивная" и "профессиональная" часть, не принес мне никакой пользы, как, собственно, и другим читающим.
Я готов узнать более качественное, профессиональное, чистое и "феншуйное" решение от профи своего дела, коим ты, судя по всему, являешься. :)
RaDir, профессиональное и фэншуйное решение — разобраться в проблеме, а не подпереть её костылём, да ещё и таким уродливым.
Для начала замечу, что при package discovery, во-первых, порядком регистрации провайдеров управлять нельзя, во-вторых, они регистрируются раньше, чем все остальные провайдеры и какие сайд-эффекты ты можешь огрести в будущем — никто не знает.
Точно так же и порядок загрузки провайдеров не определён, из-за чего и возникает проблема — наверняка твой провайдер boot'ается раньше, чем системные/приложения.
Оно из некостыльных решений — регать свои роуты в коллбэке на событие booted приложения.
Кроме того, я считаю эту затею — «не трогать то, что было установлено фреймворком - ни конфиги, ни сервис провайдеры» — абсолютно глупой. Ты сам себе создаёшь проблемы и потом героически их решаешь.
JhaoDa, "а не подпереть её костылём, да ещё и таким уродливым." - костыль, предлагаемый самой ларой (разработка пакетов)? Я замечу, ни одного костыля или решения вне доки я не предложил.
"Кроме того, я считаю эту затею — «не трогать то, что было установлено фреймворком - ни конфиги, ни сервис провайдеры» — абсолютно глупой. " - считать ты можешь все что угодно, твое право. Касаемо "дискавери", сервис провайдеры ларки грузятся в первую очередь, это не сложно проверить.
"Оно из некостыльных решений — регать свои роуты в коллбэке на событие booted приложения." - чем метод boot сервис-провайдера плох?
JhaoDa, " это твоё решение с повторной регой уже зареганного провайдера в своём провайдере." - решительно не понимаю о каком "повторе" ты говоришь. Или может тебя смутил RouteServiceProvider, упомянутый мной ранее? Только вот я имел ввиду RouteServiceProvider, который ты создаешь внутри пакета, а не провайдер из базы ларки. Если ты подумал именно так и называешь это костылем - это действительно бред и что-то из ряда вон... И, кстати, в пакете ты можешь юзать сколько угодно провайдеров, которые ты совершенно спокойно и с чистой совестью можешь регать внутри иницилизирующего пакет сервис-провайдера, это офф.докс и проблем здесь нет. Собственно, я это и сделал, создал свой RouteServiceProvider в пакете, зарегал и переопределил роуты ларки из базы.
Есть еще какие-то "костылём", "уродливым", "глупой" и прочие "героически"? =)
JhaoDa, "дергать через коллбэк" - это в каком конкретно месте приложухи? Суть в изоляции пакетов, как от основного приложения, так и друг от друга, т.е. пакет самодостаточен. Все что знает базовое приложение - это зависимость в композере. В чем проблема создания провайдеров внутри пакета? Это логично, это читаемо, это предсказуемо и это чисто, на мой взгляд, и это по документации ларки.
Upd: "Правда?!" - чистейшая, можно.
Upd2: Вообще, ничего не мешает конфижить эти провайдеры в конфигах пакета, и подключать их соответствующим методом.
"дергать через коллбэк" - это в каком конкретно месте приложухи?
Очевидно, что в своём(-их) сервис-провайдере(-ах).
Upd: "Правда?!" - чистейшая, можно.
Ну ты мне просто глаза открыл.
В чем проблема создания провайдеров внутри пакета?
В том, что ты пытаешься этим костылём решить проблему, которой быть не должно — всё определяется только порядком boot'ания провайдеров. Смотри, как-то у человека получилось в одном провайдере зарегать роуты (только не надо говорить «ну он же свои роуты регает, а не не переопределяет имеющиеся»).
В том, что ты пытаешься этим костылём решить проблему, которой быть не должно — всё определяется только порядком boot'ания провайдеров. Смотри, как-то у человека получилось в одном провайдере зарегать роуты (только не надо говорить «ну он же свои роуты регает, а не не переопределяет имеющиеся»).
Какой-то несвязный бред. Переопределять или нет зависит от задачи, человек молодец и юзает public function boot() сервис-провайдера. Если ты прочитаешь выше по тексту, я про этот метод упоминал ни раз и собственно через него и необходимо инициализировать остальные сервис-провайдеры, это, кстати, я указал в решении своего же вопроса. Умещать всю инициализацию приложения в один сервис-провайдер или раскидать по разным в зависимости от логики - это дело вкуса, по мне так лучше 3 "тонких" и логичных провайдера, которые предоставляют свои, узкоспециализированные сервисы, чем один с 10-ом методов-хелперов. Опять же, дело вкуса.
UPD: JhaoDa, у тебя слишком часто звучит слово "костыль", и совершенно не аргументированно. =)
UPD2: Если внимательно посмотреть на количество и качество основных сервис-провайдеров самой ларки - мы приходим к написанному мной ранее "...3 "тонких" и логичных провайдера, которые предоставляют свои, узкоспециализированные сервисы...". :)