У меня есть настройка привязки маршрута / модели. Их около десяти для разных идентификаторов. Ничего особенного не происходит:
$router->get('/notifications/{active_notification_id}/open', 'NotificationsController@open');
$router->bind('active_notification_id', function ($id)
{
echo 'here'; echo $id; exit;
// code
});
Обвязка вообще не стреляет. Прекрасно работает в восьми других, но у двух из них просто не срабатывает. Он идет прямо к контроллеру с пустой моделью, что приводит к сбою моего кода.
Более безумно то, что они ВСЕ отлично работают на моем локальном компьютере (Windows), но имеют эту проблему только на сервере (Ubuntu). Мои версии php отключены только одной дополнительной версией. Но 8 привязок работают, просто эти две просто не сработают.
У кого-нибудь есть идея?
- Обратите внимание, что мои версии Laravel и пакета одинаковы на обоих концах.
ОБНОВЛЕНИЕ: так что на самом деле кажется, что ни один из моих маршрутов не будет отображаться на продакшене. Я «предположил», что остальные работают, потому что они работали правильно. Я также попытался отредактировать функцию src/Illuminate/Routing/Router.php bind()
, чтобы она отображала что-то, но не вижу этого эха при производстве (на локальном уровне).
В моем производственном блоке должно быть какое-то кеширование классов / файлов. Не уверен, что это проблема Laravel или что-то в этом роде с моей коробкой DigitialOcean.
2 ответа
Вероятно, это связано с предварительной компиляцией Laravels.
Фреймворк предварительно компилирует определенные классы, которые используются практически в каждом запросе. Это служит для оптимизации производительности. Файлы для компиляции могут быть указаны в config/compile.php
в files
. по умолчанию выглядит так:
'files' => [
realpath(__DIR__.'/../app/Providers/AppServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/EventServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/RouteServiceProvider.php'),
],
При запуске php artisan optimize
, когда отладка не включена (или с параметром --force
), перечисленные файлы и другие классы фреймворка будут записаны в storage/framework/compiled.php
. (в Laravel 5.0.16 путь был изменен на vendor/compiled.php
)
Попробуйте запустить php artisan clear-compiled
или php artisan optimize
, и вы должны использовать "новый" RouteServiceProvider
.
Справочная информация
php artisan optimize
вызывается каждый раз, когда вы запускаете composer update
composer install
(и composer create-project
), потому что он зарегистрирован как почтовый скрипт:
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php artisan key:generate"
]
},
Попробуйте поместить раздел привязки перед определением маршрута.
$router->bind('active_notification_id', function ($id)
{
echo 'here'; echo $id; exit;
// code
});
$router->get('/notifications/{active_notification_id}/open', 'NotificationsController@open');
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это широко используемый язык сценариев общего назначения с открытым исходным кодом, мультипарадигмальный, динамически типизированный и интерпретируемый, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.