У меня есть настройка привязки маршрута / модели. Их около десяти для разных идентификаторов. Ничего особенного не происходит:

$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.

1
Rob 8 Мар 2015 в 12:38

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 installcomposer 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"
    ]
},
2
Community 20 Июн 2020 в 09:12

Попробуйте поместить раздел привязки перед определением маршрута.

$router->bind('active_notification_id', function ($id)
{
    echo 'here'; echo $id; exit;

    // code
});

$router->get('/notifications/{active_notification_id}/open', 'NotificationsController@open');
0
Nilesh G 8 Мар 2015 в 10:19