Как структурировать проект в Symfony2?

Я хотел бы спросить, как лучше всего структурировать проект с интерфейсом и бэкэндом в Symfony2? В других версиях Symfony этого легко достичь, потому что вы можете создать два приложения - frontend и backend - тогда все библиотеки/модели станут доступными между этими приложениями.

Теперь в Symfony2 все является связкой. Для меня не совсем ясно, как я могу представить "два" приложения, интерфейс и бэкэнд. Должен ли я создать два пространства имен - интерфейс и бэкэнд? Я хотел бы сохранить свои объекты только в одном месте, а не получать доступ к ним из двух приложений.

Ответ 1

Просто создайте одно приложение, создайте AdminBundle или BackendBundle или что-нибудь другое для своего проекта, у которого есть все необходимые инструменты в конце, и используйте брандмауэры и списки управления доступом в security.yml, чтобы создать отдельный маршруты для двух.

Не нужно создавать отдельные каталоги приложений, беспорядок с консолью script или что-то в этом роде. По умолчанию Symfony знает, как найти сущности и другие ресурсы для любого зарегистрированного вами пакета, чтобы вы могли легко делиться ими.

Эта запись документации о безопасности - это хорошее место, чтобы начать изучение контроля доступа и брандмауэров. Вот быстрый пример того, как выглядит моя конфигурация безопасности:

firewalls:
    main:
        pattern: /.*
        anonymous: true
        form_login: true

access_control:
    - { path: /admin/.*, roles: ROLE_ADMIN }
    - { path: /.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }

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

Ответ 2

Я пробовал подход, предложенный PAStheLoD (создание app_backend и web_backend и т.д.), но я нашел слишком много хлопот; вы должны помнить, какое приложение предназначалось для запуска с консоли, поддерживать отдельные файлы начальной загрузки, а структура каталогов становится беспорядочной.

Метод, рекомендованный документацией Symfony Документация по Symfony, должен иметь отдельный проект для каждого приложения. Затем вы можете создать отдельную область для своего исходного кода, записать большинство (если не все) своих пакетов, а затем просто настроить, как они включены в файл autoload.php обоих приложений.

например.

admin_app/
    app/
    bin/
    src/
    web/
frontend_app/
    app/
    bin/
    src/
    web/
common_src/
    Acme/
        AdminBundle/
        DataBundle/
        jQueryBundle/

Затем в * _app/app/autoload.php:

$loader->registerNamespaces(array(
    'Acme' => __DIR__ . '/../../common_src'
));

Ответ 3

Насколько я знаю, вы все равно можете сделать более или менее то же самое с Symfony2. Просто переименуйте app/app_frontend и сделайте копию в app_backend, а также дублируйте web/таким же образом. Тогда все остальное может жить в связках. Связки очень мощные, потому что они могут содержать маршруты, конфигурацию или что-то еще, поэтому вы можете делиться тем, что хотите, и полностью изолировать то, что вы не хотите делиться.

Возможно, возникли некоторые проблемы с bin/scripts из-за переименованных каталогов, но вам просто нужно их правильно настроить (или повысить их как проблему на сайте Symfony Github.)

Ответ 4

Как получить одно приложение и создать три пакета, src/Vendor/BackendBundle, src/Vendor/FrontendBundle и src/Vendor/SharedBundle. SharedBundle содержит сущности и другие общие части между FrontendBundle и BackendBundle