Я тестирую новую структуру каталогов Symfony4 с помощью Coception.
Codeception установлен и настроен. Из-за стратегии окончания пакета я знал, что произошла ошибка, и вот ошибка:
Неустранимая ошибка PHP: неперехваченная ошибка: класс ‘Kernel’ не найден в
...\my_project\vendor\codeception\codeception\src\Codeception\Module\Symfony.php:146
Codeception не находит класс Kernel из-за его нового пространства имен, которое является App, а не пустым пространством имен.
Ядро теперь находится в каталоге src и объявлено в пространстве имен приложения.
SRC / Kernel.php
namespace App; // <-- the namespace
[...]
class Kernel extends BaseKernel[...]
Ранее ядро называлось AppKernel и не имело пространства имен:
Приложение / AppKernel.php
<?php
//no namespace
[...]
class AppKernel extends Kernel
Я отредактировал 265-ю строку Symfony.php
файл, чтобы изменить эту строку, которая возвращается Kernel
:
$class = $file->getBasename('.php');
по этой линии, чтобы вернуться App\Kernel
:
$class = 'App\\'.$file->getBasename('.php');
Эта модификация заставляет новое пространство имен новой структуры.
Мои функциональные тесты работают отлично, но я хочу избежать изменений в файле продавца.
Как я могу заставить пространство имен приложения без этого мотыга? Кажется, что нет никакого параметра, чтобы сделать это, но могу ли я инкапсулировать кодовое восприятие в пространстве имен приложения или найти хак, чтобы поместить его в мои файлы, а не в файл вендора?
Вы можете создать псевдоним для класса Kernel:
class_alias('App\Kernel', 'Kernel');
Существует известная проблема в 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.