#php #laravel #routes #laravel-7
#php #laravel #маршруты #laravel-7
Вопрос:
Я столкнулся с проводной проблемой с Laravel, где маршруты с несколькими параметрами (обязательными / необязательными) не работают.
Информация об окружающей среде
- Локально: Windows, XAMPP, PHP 7.3
- Производство: Ubuntu 18.04, PHP 7.4
Изначально я подозревал проблему с файлом .htaccess, но, похоже, это не проблема. Это отлично работает на моем локальном сервере, но по какой-то причине это не работает на сервере Ubuntu.
Следующий код работает отлично.
Route::any('route/me/','Tst@routeme');
Однако ни одно из следующих действий не работает:
Route::any('route/me/here/','Tst@routeme');
Route::any('route/me/here/{id?}','Tst@routeme');
Route::any('route/me/here/and/here','Tst@routeme');
Любые предложения, где я могу найти, чтобы исправить это, пожалуйста?
Комментарии:
1. Мне любопытно, почему в вашей локальной и производственной средах используются разные версии PHP? Кроме того, когда вы говорите, что маршруты не работают, что именно происходит?
2. вы используете Route::any вместо Route::get, поэтому любая база ‘route / me’ на доступных методах маршрутизатора будет проверяться на get ‘route / me’, post ‘route / me’, put ‘route / me’, patch ‘route / me’, delete ‘route / me’, опции ‘route / me’. попробуйте изменить ::any на ::get и проверьте на своем терминале php artisan route:list
3. @spholt, я знаю, что это некрасиво, но у моего локального есть другие клиентские проекты, которым требуется версия. Отсюда разница :
Ответ №1:
Моим первым предложением было бы разместить маршрут с большинством параметров вверху, например:
Route::any('route/me/here/and/here','Tst@routeme');
Route::any('route/me/here/{id?}','Tst@routeme');
Route::any('route/me/here/','Tst@routeme');
Это больше похоже на то, какой из маршрутов совпадает первым, выполняется первым, поэтому маршрут с наименьшим параметром совпадает последним сверху донизу.
Во-вторых, я бы посоветовал вам сгруппировать маршруты следующим образом:
Route::prefix('route/me')->group(function () {
Route::get('here/and/here', 'Tst@routeme');
Route::get('here/{id?}', 'Tst@routeme');
Route::get('here', 'Tst@routeme');
});
для лучшей читаемости…
Комментарии:
1. Пробовал и это, но не сильно помогло; (
Ответ №2:
Я не могу дать вам подробную информацию о том, почему происходит этот конкретный сценарий, но соответствие вашей среды разработки и производственной среды должно устранить эти проблемы в будущем.
Homestead Docs
Окно Homestead vagrant, предоставленное командой Laravel, является надежным выбором и хорошо документировано. Это Ubuntu 18.04 / 20.04, и на нем может быть настроено множество дополнений. Вы можете легко настроить, какую версию PHP использует тот или иной проект, с помощью одной строки в Homestead.yaml
файле.
Docker Docs
Docker немного более продвинутый, но очень гибкий в том, как его можно настроить. Конструкция контейнера позволяет изолировать зависимости одного проекта от следующего.
Их не так сложно настроить (легко выполнить в течение дня или двух) и они позволяют вам практически идеально копировать ваши производственные среды.
Это очень поможет в тех случаях, когда «но это работает на моей машине»!
Ответ №3:
обновляю свой собственный вопрос, чтобы это могло помочь другим.
Я бы сказал, вероятно, это последнее, что кто-то (или, по крайней мере, я) не смог проверить. Я попытался составить список маршрутов на моем сервере и обнаружил, что мой недавно добавленный маршрут не найден.
php artisan route:list
Ранее я очистил кэш, перезапустил apache, но это не помогло. Наконец-то обнаружил, что следующие команды являются спасением, когда маршруты кэшируются и не работают.
Итак, то, что сработало у меня — очистка кэша «маршрута».
php artisan route:cache
php artisan route:clear
Моя искренняя благодарность @Spholt, @Akbar khan, @Spholt, @Gzai Kun за помощь.