Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Привет всем!
Опишу немного ситуацию. Есть у меня приложение. Там куча роутингов соответсвенно. Каждый раз при запуске все эти маршруты по новой компилируются и тп... Вот. Для контроллер роутинга есть фишка в том, что можно закэшировать, но вот беда в том, что у меня части маршрутов надо передать переменную из кода, и приходиться использовать роутинги с функциями(клосуре) и как это оптимизировать я пока понятия не имею.
То-есть по сути у меня через админку создается дерево категорий, для каждой категории задается url и в модуль(контроллер) с кем она работает. Потом я строю урлы для всего этого дела(вложенность может быть любая) и далее генерю роутинги, но опять же в роутинг надо передать id категории, что бы контроллер который отвечает за отображения данного материала применил фильтр по категории... Вот. Мысли у меня пока такие.
1. Создать обычные контроллер роутинги, и там, где нужно знать категорию обращаться к зараенее закэшированному массиву с роутингами...
2. В конце файла роутингов добавить переход в контроллер который уже определит к какому модулю относиться данная ссылка и вызовет нужный контроллер с нужными параметрами.
Может еще как можно реализовать? Щас пишу, думаю второй способ получше, но хотелось бы вашего мнения услышать. Если конечно я хоть что то понятно написал
Спасибо!
Не в сети
Расскажи пожалуйста подробнее про «передать переменную из кода».
Изменено AlexeyMezenin (10.10.2017 17:32:31)
Не в сети
Ну смотри, вот у меня есть куча роутингов для моего дерева категорий, если я делаю обычный контроллер роуте, то там вызывается какой то контроллер и максимум, что я могу сделать это передать ему часть урла {id} . А мне нужно передать туда еще ID категории, что бы контроллер мог понять какую запись надо получить.
Вот пример у меня есть 2 статьи урл у которых contacts . Одна находиться по пути /info/contacts вторая /pages/contacts . За вывод их отвечает один котроллер. Если я добавляю два рутинга например info и pages на один и тот же метод контроллера и в параметрах методу будет название статьи тобиш contacts, то не ясно какую статью надо выдать, толи с первого пути, то ли со второго. Вот по этому мне надо как то в этот метод передать id категории. Для этого использую Route::get($uri, $callback); Но они не кэшируются (
Так лучше ?
Не в сети
Дак передавай два параметра /{category}/{article} в контроллер
Изменено AlexeyMezenin (10.10.2017 18:44:51)
Не в сети
Так в таком случае мне надо в урле указывать id категории. А она может быть разная, не обязательно, что я написал, вот пример еще
/root-cat/cat-2/cat-3/contacts
/root-cat2/contacts
Не в сети
Ну дак сделай маршрут и метод для каждого случая, например 3 маршрута и метода для:
/root-cat/contacts
/root-cat/cat-2/contacts
/root-cat/cat-2/cat-3/contacts
Там и обрабатывай, главное не копипастить в этих методах, а выносить общую логику в отдельный метод.
Или перенеси логику из замыкания в отдельный метод контроллера.
Изменено AlexeyMezenin (10.10.2017 20:12:36)
Не в сети
Спасибо AlexeyMezenin
Перенес логику в контроллер, так явно быстрее получается. А закэшировать остальные маршруты все равно не получается так как пользуюсь такими штуками как
Route::group(['prefix' => 'content', 'middleware' => 'auth.basic'], function()
Вот мне интересен еще один момент, походу дела ларавел выполняет все функции с инсталом роутев, а уже потом ищет подходящий маршрут. По мне как то не совсем умно получается, может конечно чего не понимаю...
Не в сети
А закэшировать остальные маршруты все равно не получается так как пользуюсь такими штуками как Route::group(['prefix' => 'content', 'middleware' => 'auth.basic'], function()
Группы кэшируются. Не кешируются такие замыкания:
Route::get('/', function () {
return view('index');
});
Не в сети
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Вот на такую штуку ругается, я что то врубиться не могу если закоминчу, будут ли какие проблеммы?
Не в сети
Вообщем то работает, спасибо огромное AlexeyMezenin ! Удалил выше описаный роутинг. Единственный минус надо 2 раза набирать команду route:cache что бы сработало, странно ну да ладно, не страшно
Не в сети
Страницы 1