Где я могу разместить общий код библиотеки в Symfony 2?

Быстрый вопрос: где я должен помещать код, который имеет схожие характеристики с классом Service Utilities Service, как описано здесь в этом сообщении блога Benjamin Eberlei ( http://www.whitewashing.de/2013/06/27/extending_symfony2__controller_utilities.html ) ?

В промежутке времени я разместил его внутри: src / ProjectName / Library

контекст

Я отметил следующее:

  • Эта логика не относится к определенному набору , на самом деле она применима ко всем связям, которые будет создаваться.
  • Эта логика обычно принадлежит к конкретной библиотеке приложений , а не к тому, чтобы быть частью пакета, поскольку контроллеры в пакетах будут либо распространять, либо использовать этот библиотечный код.

Я нашел ответы на вопросы, похожие по теме, но не совсем то, что я был после

Основываясь на моих исследованиях здесь, только на SO, этот вопрос, похоже, несколько дошел до смерти, но я думаю, что вопросы задавали ранее юбки вокруг того, что я на самом деле после. Несмотря на это, похоже, у меня есть следующие варианты:

  • Помещение этих типов расширений в пакет – не применимо, поскольку тип функциональности, которую я разрабатываю, существенно расширяет рамочный код.
  • Создание каталога поставщика для проекта, куда будет идти весь код библиотеки, – если это действительно лучшая практика, то это будет означать, что мне нужно будет сделать библиотеку доступной через частное репо в композиторе, но это означает, d необходимо поддерживать отдельную кодовую базу.
  • Создайте своего рода набор псевдо-коннекторов, который живет в src / Company / SomeNamespace – я даже не знаю, все ли в порядке, но если это соответствует лучшей практике SF, я рассмотрю его в дальнейшем.

Вопрос, опять же, для краткости: где я помещаю классы, которые предоставляют универсальную глобальную функцию в Symfony 2?

Я очень благодарен.

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

Также я хотел бы отметить документацию о VCS, которая часто используется, когда вам нужно разблокировать Bundle и переопределить оригинал (я использовал его довольно много раз).

Вы можете сделать следующее – это не потребует, чтобы у вас была система упаковки или что-то еще. Вам просто нужно поставить пакет как zip, доступный на вашем компьютере, используя URL-адрес.

{ "repositories": [ { "type": "package", "package": { "name": "my/package", "version": "1.0.0", "dist": { "url": "https://github.com/my/package/archive/master.zip", "type": "zip" }, "autoload": { "psr-0": { "My\\Package\\": "src/" } } } } ], "require": { "my/package": "1.0.0" } } 

Если ваш пакет не поддерживает PSR-0, вам нужно использовать опцию «classmap», иначе ваш пакет поддерживает PSR-0, вам нужно использовать параметр psr-0 .

После некоторого беспорядка, в то время как принятый ответ здесь имеет свои достоинства, я решил создать пакет «Core», в который будут включены все мои проекты, связанные с перекрестными связями / приложениями, с широкими зависимостями и ресурсами.

Это позволит мне иметь центральное место для всех активов, связанных объектов и кода конкретной библиотеки проекта.

Позиционируется для рефакторинга

Я внутренне рассуждал с самим собой, что это счастливое промежуточное решение (возможно временное), которое позволяет мне продолжить развитие, а не состояние анализа паралича, в котором я сейчас живу.

Делая так, я могу иметь точки гибкости для рефакторинга позже в решении каталога поставщика.

Если вы работаете над проектом и раздражены неестественным ощущением того, что ваши сущности и код библиотеки разбросаны по разным путям, как я был, это будет хорошим решением.

Он не изменяет поведение по умолчанию для SF2 и Doctrine 2

Ранее я внедрил модификацию конфигурации Symfony 2 Doctrine 2, которая позволила мне (по праву) удалить Entities из пакета и в отдельное центральное пространство имен.

Мне понравилась эта идея. Я использовал его некоторое время. Предостережение с этим подходом заключается в том, что у вас больше нет возможности использовать интерфейс командной строки, когда вам нужно быстро создать объект Doctrine в качестве пространства имен Bundle.

Я думал, что все в порядке, потому что мне все равно нужно что-то менять, но потом я подумал:

  • «Как насчет объектов Form? Где я их помещаю? В их собственном каталоге под / src, например Entity?
  • Как насчет уровня обслуживания? (не DI, а фактический уровень обслуживания – где находится логика приложения) "

На полпути, написав еще один вопрос «где поставить вопрос XXXX в Symfony 2» (я уверен, что те люди, которые следуют за тегами PHP и Symfony2, устали видеть), я остановился и поместил его в комплект, который у меня есть и переименовал его в пакет Core.

Core Bundle Таким образом, он находится в комплекте в соответствии с требованием CLI, его намного легче отслеживать, и я могу семантически делиться содержимым этого пакета, поскольку он содержит основной код, специфичный для приложения:

  • Сущности.
  • Общие формы.
  • Общий ресурс HTML, CSS и JavaScript.
  • Код конкретной библиотеки проекта.
  • Здесь также живут мои расширения Twig.
  • Наконец, сюда также входят классы Service Layer и связанные с ними заводы.
  • Если у меня есть другие расширения, которые я хочу сделать для Symfony для этого проекта, я буду добавлять их здесь.

Самое главное, когда я получаю время, чтобы на самом деле сесть и работать с композитором и др., Я могу реорганизовать это легко, потому что все это существует в одном месте.

Так. В двух словах. Чтобы ответить на мой собственный вопрос: где я должен разместить общий код библиотеки в Symfony 2?

Я бы поместил его в пакет, созданный специально для хранения активов, ресурсов и библиотечного кода, который должен быть доступен для нескольких пакетов, используя следующие рекомендации:

  • Создайте пакет Core.
  • Поместите здесь общий код библиотеки.
  • Поместите здесь все сущности.
  • Поместите общие активы (main.css, reset.css и т. Д.) Здесь.
  • Поместите здесь общие формы.
  • Поместите здесь все классы уровня обслуживания.

Пакет и установка через композитор

Проводите ли ваши исследования по форматированию вашей файловой структуры, чтобы быть совместимым с PSR-0, тогда, когда вы начнете использовать композитор:

  • Отформатируйте его как совместимые с PSR-0 стандарты
  • Упакуйте его в zip-файл и установите его через композитор (в соответствии с инструкциями @Thomas Potaires)

Приложение / Проект – Связки, которые создают приложение, но полагаются на Core Bundle.


Core Bundle – расширяет SF2 в ключевых точках, содержит общие ресурсы и библиотечный код. Поскольку я не изменил способ работы фреймворка, файлы находятся там, где их ожидает SF2. Это означает, что я все еще могу использовать его генераторы для Entities.

У меня не будет проблем с создаваемыми здесь экранами / CRUD-экранами, поскольку они будут рассматриваться как прототипы, а не реальные функции приложения.


SF2-слой. – остается неизменным, нетронутым. Extended.