2

我正在用 Coception 测试 Symfony4 的新目录结构。

Codeception 已安装和配置。由于捆绑策略的结束,我知道会发生错误,这是错误:

PHP致命错误:未捕获的错误:未找到类'内核'...\my_project\vendor\codeception\codeception\src\Codeception\Module\Symfony.php:146

Codeception 找不到 Kernel 类,因为它的新命名空间是 App 而不是空的命名空间。

内核现在位于 src 目录中,并在 App 命名空间中声明。

新的内核声明

src/Kernel.php

namespace App; // <-- the namespace

[...]

class Kernel extends BaseKernel[...]

以前,内核被命名为 AppKernel 并且没有命名空间:

旧内核声明

app/AppKernel.php

<?php

//no namespace

[...]

class AppKernel extends Kernel

我编辑了Symfony.php文件的第 265 行以更改正在返回的这一行Kernel

$class = $file->getBasename('.php');

通过这一行返回App\Kernel

$class = 'App\\'.$file->getBasename('.php');

此修改强制新结构的新名称空间。

我的功能测试运行完美,但我想避免修改供应商文件。

如何在没有这个hack的情况下强制 App 命名空间?似乎没有参数可以做到这一点,但我可以将代码接收封装在应用程序命名空间中,还是找到一个 hack 将它放在我的文件中,而不是在供应商文件中?

4

2 回答 2

2

Codeception https://github.com/Codeception/Codeception/issues/4695中有一个已知问题。基本上 Codeception 只允许某些 Symfony 内核名称:

# codeception/src/Codeception/Module/Symfony.php:287

$possibleKernelClasses = [
    'AppKernel', // Symfony Standard
    'App\Kernel', // Symfony Flex
];

目前,解决方法是class_alias('MyNamespace\Kernel', 'App\Kernel');按照@Federkun 的说明使用。

于 2018-02-19T21:58:34.387 回答
1

您可以为 Kernel 类创建一个别名:

   class_alias('App\Kernel', 'Kernel');
于 2017-09-04T17:23:53.620 回答