Как предоставить пространство имен ядра для кодирования для проекта Symfony4
Я тестирую новую структуру каталогов Symfony4 с помощью Coception.
Прием кода установлен и настроен. Из-за стратегии завершения пакета я знал, что произойдет ошибка, и вот ошибка:
Неустранимая ошибка PHP: Неперехваченная ошибка: Класс "Ядро" не найден в
...\my_project\vendor\codeception\codeception\src\Codeception\Module\Symfony.php:146
Прием кода не находит класс ядра из-за его нового пространства имен, которое является приложением, а не пустым пространством имен.
Ядро теперь находится в каталоге src и объявлено в пространстве имен приложения.
Новое объявление ядра
src/Kernel.php
namespace App; // <-- the namespace
[...]
class Kernel extends BaseKernel[...]
Ранее Ядро называлось AppKernel и не имело пространства имен:
Старое объявление ядра
app/AppKernel.php
<?php
//no namespace
[...]
class AppKernel extends Kernel
Я отредактировал 265-ю строку файла Symfony.php
, чтобы изменить эту строку, которая возвращает Kernel
:
$class = $file->getBasename('.php');
По этой строке, чтобы вернуться App\Kernel
:
$class = 'App\\'.$file->getBasename('.php');
Эта модификация принудительно создает новое пространство имен новой структуры.
Мои функциональные тесты работают отлично, но я хочу избежать изменений в файле поставщика.
Как я могу принудительно использовать пространство имен приложения без этого взлома? Похоже, для этого нет параметра, но могу ли я инкапсулировать кодирование в пространстве имен приложений или найти способ взломать его, чтобы поместить его в мои файлы, а не в файл поставщика?
2 answers
Вы можете создать псевдоним для класса ядра:
class_alias('App\Kernel', 'Kernel');
Существует известная проблема в кодировании https://github.com/Codeception/Codeception/issues/4695 . В основном кодирование позволяет использовать только определенные имена ядер Symfony:
# codeception/src/Codeception/Module/Symfony.php:287
$possibleKernelClasses = [
'AppKernel', // Symfony Standard
'App\Kernel', // Symfony Flex
];
Обходным решением на данный момент было бы использование class_alias('MyNamespace\Kernel', 'App\Kernel');
, как было отмечено @Federkun.