Неможливо оголосити інтерфейс, оскільки ім'я вже використовується


12

Після створення простого інтерфейсу в моєму новому модулі. Я набрав bin / magento setup: di: compile, і я отримую помилку про те, що ім'я вже використовується.

Ось мій код:

namespace Company\Test\Api;

/*
 *  @api
 */
interface XyzInterface {
    public function getSomething();
}

Тоді я отримую цю помилку:

Repositories code generation... 1/7 [====>-----------------------]  14% 2 secs 52.0 MiBPHP 
Fatal error:  Cannot declare interface Company\Test\Api\XyzInterface, because the name is already in use in .../app/code/Company/Test/Api/XyzInterface.php on line 13

Рядок - це "інтерфейс XyzInterface". Я не впевнений, що я роблю неправильно.


1
Чи можете ви, будь ласка, запустити команду з опцією -vvv, щоб побачити слід стека? Файл може бути включений двічі з якоїсь причини.
BuskaMuza

Він просто показує "фатальну помилку PHP"
Неллі

Ви також можете спробувати включити xdebug. Я думаю, що це повинно допомогти показувати відсталість.
BuskaMuza

1
Я отримав цю помилку також через помилковий клас "простору імен"
Ansyori

Відповіді:


36

Сьогодні я отримав однотипну помилку:

PHP Fatal error: Неможливо оголосити клас Class \ Name \ Here, тому що ім'я вже використовується в /var/www/m2/magento2/app/code/path/to/the/class.php у рядку 100

де рядок 100 - кінець файлу.

Приблизно через 4 години налагодження я дійсно знаходжу причину: помилку в декларації простору імен. До останнього моменту я не повірив, що це друкарська помилка в декларації імен, але коли я переписав усі імена заново - помилка зникла. Ця стаття була дуже корисною:

Я трохи дряпаю голову, цікавлюсь, що відбувається, і врешті зрозумію, що це таке

Pulsetorm

тобто я неправильно ввів ім’я простору імен, і коли початкові автозавантаження завантажують файл класу, він не визначив би клас, який він шукає, а потім другий автозавантажувач (зазвичай композитор) завантажує його ще раз, і намагається повторно визначити те саме неправильний клас.

тобто Магенто хотів класу

Pulsestorm\Helloworld\Observers\Block

але я визначив

Pulsetorm\Helloworld\Observers\Block

завдяки неправильному простору імен.

Дякую, Алан Шторм :)

ОНОВЛЕННЯ:

Іншим типом цієї помилки є неправильне оголошення простору імен з відсутньою частиною простору імен, як у цьому прикладі:

Помилка:

Генерація коду сховищ ... 1/7 [==== -----------------------] 14% 1 сек 50,0 MiBPHP Фатальна помилка: Неможливо оголосити клас міграції \ Step \ Version11410to2000Test, тому що ім'я вже використовується в /var/www/vhosts/rwld/vendor/magento/data-migration-tool/tests/unit/testsuite/Migration/Step/UrlRewrite/Version11410to2000Test.php рядок 109

де рядок 109 - кінець файлу.

У файлі vendor/magento/data-migration-tool/tests/unit/testsuite/Migration/Step/UrlRewrite/Version11410to2000Test.phpми знайшли простір імен як Migration\Stepтоді, коли має бути правильна область імен, Migration\Step\UrlRewriteтому що шлях до цього класу є Migration/Step/UrlRewrite. Після зміни простору імен на Migration/Step/UrlRewriteпомилку немає.


1
У мене був такий самий випуск, це божевільний випуск
Хамза Алаєд

+1 для проблеми з простором імен. Я витратив 2 години. Дуже дякую!
wezzy

1
Також просто хочуть додати до цього, будьте обережні, називаючи свої каталоги, оскільки корпус повинен відповідати - це також могло бути витрачено ще дві години!
Smithee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.