在过滤器未运行之前

时间:2013-05-07 17:27:21

标签: php apache laravel laravel-4 rhel

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

主要问题:

  • 受'before'=>保护的路线'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;
}

到此:

public function filtersEnabled()
{
    return true;//$this->runFilters;
}

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

1 个答案:

答案 0 :(得分:12)

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

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

所以我觉得“太棒了!$ testENvironment是可配置的。我讨厌'测试'默认,因为我们称之为QA环境,所以我将其改为”phpunit“,然后创建了app / config / phpunit / *它在开发过程中就像一个魅力。

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

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

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

也许我会做一个拉取请求,让env名称可配置:)