4

问题是客户告诉我们,我们可以使用任何我们想要的操作系统上线,所以我们照常在 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 的配置选项。

4

1 回答 1

12

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

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

所以我想“太棒了!$testENvironment 是可配置的。我讨厌'testing'默认值,因为这就是我们所说的 QA 环境,所以我将其更改为“phpunit”,然后创建了 app/config/phpunit/* 文件。它在发展中像魅力一样奔跑。

当我将代码推送到我们的测试环境时,我开始收到有关会话为空的错误。起初我以为 laravel 的数组会话处理程序坏了,所以我尝试了 native,但它也坏了。但是后来我在整个代码中添加了一些日志记录,并发现实际上 beforeFilters 没有运行,因此没有进行身份验证,因此会话理所当然地为空。因此,我跟踪了从 index 到 start 到 autoinclude 到 dispatch 的代码执行,在路由中我发现了这个小的硬编码 gem:

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

将我们的测试环境重命名为“test”,将我们的“phpunit”环境重命名为“testing”解决了这个问题。

也许我会做一个拉取请求以使该环境名称可配置:)

于 2013-05-07T19:55:35.273 回答