Laravel по-русски

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

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

#1 10.10.2017 16:58:22

Оптимизация роутинга.

Привет всем!

Опишу немного ситуацию. Есть у меня приложение. Там куча роутингов соответсвенно. Каждый раз при запуске все эти маршруты по новой компилируются и тп... Вот. Для контроллер роутинга есть фишка в том, что можно закэшировать, но вот беда в том, что у меня части маршрутов надо передать переменную из кода, и приходиться использовать роутинги с функциями(клосуре) и как это оптимизировать я пока понятия не имею.
То-есть по сути у меня через админку создается дерево категорий, для каждой категории задается url и в модуль(контроллер) с кем она работает. Потом я строю урлы для всего этого дела(вложенность может быть любая) и далее генерю роутинги, но опять же в роутинг надо передать id категории, что бы контроллер который отвечает за отображения данного материала применил фильтр по категории... Вот. Мысли у меня пока такие.
1. Создать обычные контроллер роутинги, и там, где нужно знать категорию обращаться к зараенее закэшированному массиву с роутингами...
2. В конце файла роутингов добавить переход в контроллер который уже определит к какому модулю относиться данная ссылка и вызовет нужный контроллер с нужными параметрами.
Может еще как можно реализовать? Щас пишу, думаю второй способ получше, но хотелось бы вашего мнения услышать. Если конечно я хоть что то понятно написал smile

Спасибо!

Не в сети

#2 10.10.2017 17:32:11

Re: Оптимизация роутинга.

Расскажи пожалуйста подробнее про «передать переменную из кода».

Изменено AlexeyMezenin (10.10.2017 17:32:31)

Не в сети

#3 10.10.2017 17:53:45

Re: Оптимизация роутинга.

Ну смотри, вот у меня есть куча роутингов для моего дерева категорий, если я делаю обычный контроллер роуте, то там вызывается какой то контроллер и максимум, что я могу сделать это передать ему часть урла {id} .  А мне нужно передать туда еще ID категории, что бы контроллер мог понять какую запись надо получить.
Вот пример у меня есть 2 статьи урл у которых contacts .  Одна находиться по пути /info/contacts вторая /pages/contacts . За вывод их отвечает один котроллер. Если я добавляю два рутинга например info и pages на один и тот же метод контроллера и в параметрах методу будет название статьи тобиш contacts, то не ясно какую статью надо выдать, толи с первого пути, то ли со второго. Вот по этому мне надо как то в этот метод передать id категории. Для этого использую Route::get($uri, $callback); Но они не кэшируются (

Так лучше ? smile

Не в сети

#4 10.10.2017 18:44:04

Re: Оптимизация роутинга.

Дак передавай два параметра /{category}/{article} в контроллер

Изменено AlexeyMezenin (10.10.2017 18:44:51)

Не в сети

#5 10.10.2017 18:58:26

Re: Оптимизация роутинга.

Так в таком случае мне надо в урле указывать id категории. А она может быть разная, не обязательно, что я написал, вот пример еще

/root-cat/cat-2/cat-3/contacts
/root-cat2/contacts

Не в сети

#6 10.10.2017 20:04:41

Re: Оптимизация роутинга.

Ну дак сделай маршрут и метод для каждого случая, например 3 маршрута и метода для:

/root-cat/contacts
/root-cat/cat-2/contacts
/root-cat/cat-2/cat-3/contacts

Там и обрабатывай, главное не копипастить в этих методах, а выносить общую логику в отдельный метод.

Или перенеси логику из замыкания в отдельный метод контроллера.

Изменено AlexeyMezenin (10.10.2017 20:12:36)

Не в сети

#7 11.10.2017 13:02:44

Re: Оптимизация роутинга.

Спасибо AlexeyMezenin

Перенес логику в контроллер, так явно быстрее получается. А закэшировать остальные маршруты все равно не получается так как пользуюсь такими штуками как

Route::group(['prefix' => 'content', 'middleware' => 'auth.basic'], function()

Вот мне интересен еще один момент, походу дела ларавел выполняет все функции с инсталом роутев, а уже потом ищет подходящий маршрут. По мне как то не совсем умно получается, может конечно чего не понимаю...

Не в сети

#8 11.10.2017 13:17:27

Re: Оптимизация роутинга.

А закэшировать остальные маршруты все равно не получается так как пользуюсь такими штуками как Route::group(['prefix' => 'content', 'middleware' => 'auth.basic'], function()

Группы кэшируются. Не кешируются такие замыкания:

Route::get('/', function () {
    return view('index');
});

Не в сети

#9 11.10.2017 16:23:08

Re: Оптимизация роутинга.

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Вот на такую штуку ругается, я что то врубиться не могу если закоминчу, будут ли какие проблеммы?

Не в сети

#10 11.10.2017 17:51:29

Re: Оптимизация роутинга.

Вообщем то работает, спасибо огромное AlexeyMezenin ! Удалил выше описаный роутинг. Единственный минус надо 2 раза набирать команду route:cache что бы сработало, странно ну да ладно, не страшно smile

Не в сети

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