Как предоставить пространство имен ядра для кодирования для проекта Symfony4


Я тестирую новую структуру каталогов Symfony4 с помощью Coception.

Устанавливается и настраивается кодек. Из-за конца стратегии связки я знал, что произойдет ошибка, и вот ошибка:

PHP Fatal error: Uncaught Error: класс 'Kernel' не найден в ...my_projectvendorcodeceptioncodeceptionsrcCodeceptionModuleSymfony.php:146

Codeception не находит класс ядра из-за его нового пространства имен, которое является приложением, а не пустым пространством имен.

Ядро теперь находится в каталоге src и объявлено в Пространство имен приложений.

Новое объявление ядра

src / ядро.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');

По этой строке вернуть AppKernel:

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

Эта модификация заставляет новое пространство имен новая структура.

Мои функциональные тесты работают отлично, но я хочу избежать модификации в файле поставщика.

Как я могу заставить пространство имен приложений без этого взлома ? Кажется, что нет никакого параметра, чтобы сделать это, но могу ли я инкапсулировать codeception в пространстве имен приложений или найти хак, чтобы поместить его в Мои файлы, а не в файл поставщика?

2 2

2 ответа:

Можно создать псевдоним для класса ядра:

   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.