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

Я тестирую новую структуру каталогов 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');

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

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

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

2

Решение

Вы можете создать псевдоним для класса Kernel:

   class_alias('App\Kernel', 'Kernel');
1

Другие решения

Существует известная проблема в 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.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector