Как предоставить пространство имен ядра для кодирования для проекта 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');

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

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

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

Author: Alexandre T, 2017-09-04

2 answers

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

   class_alias('App\Kernel', 'Kernel');
 1
Author: Federkun, 2017-09-04 19:54:20

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

 2
Author: zstate, 2018-02-19 21:58:34