Php 在过滤器未运行之前

Php 在过滤器未运行之前,php,apache,laravel,laravel-4,rhel,Php,Apache,Laravel,Laravel 4,Rhel,问题是客户告诉我们,我们可以使用我们想要的任何操作系统上线,所以我们像往常一样在CentOS上开发,当我们上线时,他们说“哦,新政策只适用于RHEL,对不起”。我们的应用程序在CentOS上运行得很好,但在RHEL上却不行 主要问题: CentOS上受“before'=>“auth”筛选器保护的路由受保护,但RHEL上不受保护。这意味着用户从未经过身份验证,因此Auth::user()始终为空,因此所有后续代码都会失败 配置信息: 这两台服务器都运行Apache2.2.15和PHP5.4.

问题是客户告诉我们,我们可以使用我们想要的任何操作系统上线,所以我们像往常一样在CentOS上开发,当我们上线时,他们说“哦,新政策只适用于RHEL,对不起”。我们的应用程序在CentOS上运行得很好,但在RHEL上却不行

主要问题:

  • CentOS上受“before'=>“auth”筛选器保护的路由受保护,但RHEL上不受保护。这意味着用户从未经过身份验证,因此Auth::user()始终为空,因此所有后续代码都会失败
配置信息:

  • 这两台服务器都运行Apache2.2.15和PHP5.4.13
  • 两者都有相同的Apache模块集和PHP扩展
  • 两者都有来自git的相同代码
我有一个解决方案,但毫无意义: 在vendor/laravel/framework/src/illumb/Routing/Router.php中

在第1398行,更改以下内容:

public function filtersEnabled()
{
    return $this->runFilters;
}
为此:

public function filtersEnabled()
{
    return true;//$this->runFilters;
}
你知道这是怎么回事吗? 我在任何地方都找不到设置runFilters=false的配置选项。

我终于找到了问题所在。 不久前,我正在运行单元测试,在应用程序/测试中我看到:

class TestCase extends Illuminate\Foundation\Testing\TestCase {
    public function createApplication(){
        $unitTesting = true;
        $testEnvironment = 'testing';
        return require __DIR__.'/../../bootstrap/start.php';
}
所以我觉得“太棒了!$TestenEnvironment是可配置的。我讨厌‘测试’默认值,因为这就是我们所说的QA环境,所以我把它改为“phpunit”,然后创建了app/config/phpunit/*文件。它在开发中运行得很有魅力

当我将代码推送到我们的测试环境时,我开始发现会话为空的错误。 起初我认为laravel的数组会话处理程序坏了,所以我尝试了native,但它也坏了。 但后来我在代码中做了一些日志记录,发现实际上beforeFilters没有运行,因此没有进行身份验证,因此会话是空的。 然后我跟踪了代码的执行过程,从索引到开始,从自动包含到分派,在路由中我发现了这个硬编码的gem:

vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php
   35           if ($app['env'] == 'testing')
   36           {
   37:              $router->disableFilters();
   38           }
将我们的测试环境重命名为“test”,将我们的“phpunit”环境重命名为“testing”,解决了这个问题


也许我会做一个pull请求来配置环境名称:)

你能尝试其他会话驱动程序吗?我也尝试了本机会话驱动程序。行为没有变化。伟大的发现,知道他们为什么这么做吗?我昨晚刚刚提交了pull请求:)不确定他们为什么这么做。可能是因为我更容易硬编码我爱你,伙计。花了一整晚和一上午的时间来找出问题所在