может я просто что-то напортачил с пространствами имён, но я этого не вижу.
Я попытался разделить несколько классов в моем приложении Symfony на связку.
Ошибка, которую я получаю в Symfony:
Expected to find class "Shop\Admin\CategoryAdmin" in file "C:\wamp64\www\gall\bundles\Shop\src/Admin\CategoryAdmin.php" while importing services from resource "../bundles/Shop/src/*", but it was not found! Check the namespace prefix used with the resource in C:\wamp64\www\gall\config/services.yaml (which is loaded in resource "C:\wamp64\www\gall\config/services.yaml").
Вот мой services.yaml:
Shop\:
resource: '../bundles/Shop/src/*'
exclude: '../bundles/Shop/src/{Entity,Migrations,Tests}'
Shop\Controller\:
resource: '../bundles/Shop/src/Controller'
tags: ['controller.service_arguments']
Файловая структура выглядит так:
project (C:\wamp64\www\gall)
\- bundles
\- Shop
\- src
\- Admin
\- CategoryAdmin.php
\- config
\- services.yaml
А сам файл CategoryAdmin.php выглядит так:
namespace Shop\Admin;
use Shop\Entity\Category;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Sonata\TranslationBundle\Filter\TranslationFieldFilter;
/**
* Class CategoryAdmin
* @package Shop\Admin
*/
class CategoryAdmin extends AbstractAdmin
{
{...}
}
Су, маршруты выглядят точно так же, как указано в ошибке. Я не понимаю, почему FileLoader не может найти этот класс, какие-нибудь идеи?






Это проблема автозагрузки.
composer.json часть:
"autoload": {
"psr-4": {
"App\\": "src/",
}
},
Пространство имен App привязано к папке src.
Зарегистрируйте пространство имен Shop как bundles / Shop и удалите каталог src в bundles / Shop.
Обновлено: Я обычно делаю это для пакетов, которые я еще не готов опубликовать, но опубликую в будущем. Пример из одного из моих проектов:
"autoload": {
"psr-4": {
"App\\": "src/",
"Padam87\\AdminBundle\\": "bundles/Padam87/AdminBundle/"
}
},
Обновлено еще раз: Не забудьте запустить composer dump-autoload после изменения.
Структура пакета отличается от структуры приложения. Большинство пакетов не используют папку src. Кстати, если вы делаете это, чтобы добавить некоторую структуру в свое приложение, не делайте этого вообще. Используйте папки в обычном пространстве имен приложений.
Как правило, структура связок поощрялась в Sf3, а в Sf4 в основном не поощрялась. Я хочу отделить «Магазинный пакет», чтобы я мог легко удалить файлы и несколько строк конфигурации из проекта в любое время, не просматривая все каталоги и не удаляя каталог «магазин» с файлами, связанными с пакетом. Я еще немного поиграюсь с этим, спасибо за подсказки, и другие намеки по моей проблеме приятно видеть :)
Для пояснения - я пытаюсь создать какое-нибудь многоцелевое приложение и хочу, чтобы моя структура была легко изменена с учетом добавления и удаления основных функций приложения.
Есть ли какое-либо решение, которое не требует удаления папки src? Я хотел бы сохранить структуру Sf по умолчанию внутри моего пакета (класс в src, шаблонах, переводах и т. д. Рядом с каталогом src). Также есть ли возможность не включать «пакеты» в пространство имен и настроить автозагрузчик для работы с пространством имен «Магазин»? Я возьмусь с этим, спасибо за некоторые направления.