在过滤器未运行之前

lo_*_*fye 4 php apache rhel laravel laravel-4

问题是客户告诉我们我们可以使用我们想要的任何操作系统,所以我们像往常一样在CentOS上开发,当我们上线时,他们说"哦,新政策只有RHEL,对不起".我们的应用程序完全适用于CentOS,但不适用于RHEL.

主要问题:

  • 由"前" =>"AUTH"过滤器保护的路由被保护在CentOS,但不是在RHEL.这意味着用户从未进行过身份验证,因此Auth :: user()始终为空,因此所有后续代码都会失败.

配置信息:

  • 两台服务器都运行Apache 2.2.15和PHP 5.4.13
  • 两者都有相同的Apache模块和PHP扩展.
  • 两者都有来自git的相同代码.

我有一个修复,但它没有意义:在vendor/laravel/framework/src/Illuminate/Routing/Router.php

在第1398行,改变这个:

public function filtersEnabled()
{
    return $this->runFilters;
}
Run Code Online (Sandbox Code Playgroud)

对此:

public function filtersEnabled()
{
    return true;//$this->runFilters;
}
Run Code Online (Sandbox Code Playgroud)

你知道这里发生了什么吗?我无法在设置runFilters = false的任何地方找到配置选项.

lo_*_*fye 12

我终于找到了这个问题.前一段时间我正在运行单元测试,在app/tests中我看到了这个:

class TestCase extends Illuminate\Foundation\Testing\TestCase {
    public function createApplication(){
        $unitTesting = true;
        $testEnvironment = 'testing';
        return require __DIR__.'/../../bootstrap/start.php';
}
Run Code Online (Sandbox Code Playgroud)

所以我觉得"太棒了!$ testENvironment是可配置的.我讨厌'测试'默认,因为我们称之为QA环境,所以我把它改成了"phpunit",然后创建了app/config/phpunit/*文件.在发展中像一个魅力.

当我将代码推送到我们的测试环境时,我开始收到有关会话为空的错误.起初我认为laravel的数组会话处理程序被破坏了,所以我尝试了本机,但它也被打破了.但后来我在整个代码中进行了一些日志记录,并发现实际上在过滤器没有运行之前,因此认证没有发生,因此会话是正确的空.于是我追踪的执行代码从指数开始autoinclude到调度,并在路由一路下跌,我发现这个小硬编码的宝石:

vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php
   35           if ($app['env'] == 'testing')
   36           {
   37:              $router->disableFilters();
   38           }
Run Code Online (Sandbox Code Playgroud)

将我们的测试环境重命名为'test',将'phpunit'环境重命名为'testing'解决问题.

也许我会做一个pull请求,使env名称可配置:)