【问题标题】:Route Model Binding Not Firing路由模型绑定未触发
【发布时间】:2015-03-08 09:38:46
【问题描述】:

我有一些路由/模型绑定设置。其中大约十个用于各种 ID。没什么特别的:

$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 盒子的问题。

【问题讨论】:

  • Ubuntu 是区分大小写的系统,所以如果调用类例如:MyExampleClass 而文件应该有名称MyExampleClass.php,你会得到什么错误?
  • 这就是我没有收到任何与语法等相关的错误。当我在控制器中打印出模型时,它只是一个空模型。所以一切都在“工作”,但路由/模型绑定没有触发。
  • 是否有可能需要重置这些绑定的某种缓存?
  • 你可以试试php artisan route:clear清除路由缓存
  • 您找到解决方案了吗?

标签: php laravel routes laravel-5


【解决方案1】:

这可能是由于 Laravel 预编译造成的。

框架预编译某些基本用于每个请求的类。这服务于性能优化的目的。要编译的文件可以在files 下的config/compile.php 中指定。 default one 看起来像这样:

'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'),
],

在未启用调试(或使用--force 选项)运行php artisan optimize 时,那些列出的文件和其他框架类将被写入storage/framework/compiled.php。 (在 Laravel 5.0.16 中,路径已更改为 vendor/compiled.php

尝试运行php artisan clear-compiledphp artisan optimize,应该使用您的“新”RouteServiceProvider


背景资料

每次运行composer update composer install(和composer create-project)时都会调用php artisan optimize,因为它被注册为post script:

"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"
    ]
},

【讨论】:

  • 是的,我也在考虑这个问题,但不记得运行它并且那里没有compiled.php文件(虽然我刚刚运行了composer更新(修复了它),不确定是否删除它)。
  • Laravel 注册了两个post-update-cmds。 php artisan clear-compiledphp artisan optimize。我想它没有重新生成编译文件,因为你打开了调试。我说的对吗?`
  • 刚刚确认composer update 确实删除了这个文件,所以一定是它。不记得运行过那个命令,但谁知道呢。
  • 我很确定你以前跑过composer update。否则,您将如何获得依赖项?
【解决方案2】:

尝试在定义路由之前放置绑定部分。

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

    // code
});

$router->get('/notifications/{active_notification_id}/open', 'NotificationsController@open');

【讨论】:

  • 路由和绑定在不同的文件中(Laravel 5 标准)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2019-01-10
  • 2016-06-04
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多