2013-11-11 3 views
9

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

Для промежуточный, я поместил его внутрь: SRC/ProjectName/Библиотека

Контекст

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

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

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

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

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

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

Мое спасибо заранее.

+0

По глобальной функциональности вы имеете в виду глобальную функциональность проекта или глобальную функциональность Symfony2? – Dandy

+3

(На самом деле это отличный вопрос). Быстрый намек, вы сможете сделать это исключительно с композитором. В принципе, вы можете зарегистрировать пакеты, совместимые с PSR-0, сопоставить их с пространством имен и должны быть установлены в папке поставщика (иерархия путей не имеет значения, это зависит от вас, вы можете использовать другие библиотеки в качестве примера) , –

+0

@ Dan - глобальная функциональность, я имею в виду функциональность, которая будет доступна из глобальной/прикладной области, чтобы она была доступна для всех пакетов. – rvdavid

ответ

2

Эта документация о composer repositories является отличной ссылкой, и documentation about packages that don't support Composer должен быть тем, что вы ищете.

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

Вы можете сделать следующее - это не потребует, чтобы у вас была система упаковки или что-то еще. Вам просто нужно поставить пакет как 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, то вам нужно использовать the option "classmap" иначе ваш пакет поддерживает PSR-0 вы должны использовать the option psr-0.

+0

Спасибо. Хотя, часть этого конфликтует с «игнорировать все в каталоге поставщика, потому что композитор должен иметь возможность мусор и воссоздать его по своему усмотрению». Философия, которую я видел в Интернете, но на этом этапе я был бы счастлив смириться с некоторыми не очень семантическими правилами gitignore, пока мы не получим более четкую концепцию. – rvdavid

+0

Почему вы не хотите, чтобы ваши сторонние библиотеки вели себя так? Он предназначен для сокращения кода «копировать/вставлять», легко обновлять пакеты и обеспечивать быстрый и простой способ установки вашего приложения. В качестве альтернативы я бы поставил исключение в файл '.gitignore', но композитор определенно является нормой. –

+0

Спасибо, что нашли время ответить. Я предполагаю, что с этим решением получается то, что, идущий по этому маршруту, мне нужно будет создать отдельную систему распространения через упаковщик, satis или артефакт для конкретной библиотеки приложений. Вернемся к вашему первоначальному комментарию, который вызвал мой интерес: «В принципе, вы можете регистрировать пакеты, совместимые с PSR-0, сопоставлять их с пространством имен и должны быть установлены в папке поставщика» - есть ли у вас какие-либо документы для них? – rvdavid

1

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

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

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

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

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

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

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

Я ранее реализовал модификацию Symfony 2 Доктрина конфигурации 2, что позволило мне (по праву) удалить объекты из пучка и в отдельное центральное пространство имен.

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

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

  • «Как о форме объектов, где нужно поместить те в отдельный каталог в/ЦСИ как? Объект является
  • Как насчет уровня службы (не DI, но реальная служба Layer - где логика приложения живет)? «

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

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

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

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

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

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

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

пакет и установить с помощью композитора

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

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

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


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

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


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


+1

Отличное чтение и большой вклад! Теперь я вижу, что вы хотите знать, где должны сохраняться общие основные функции; Вы быстро обнаружите, что ваш CoreBundle значительно вырастет в ходе разработки вашего проекта, что поднимет еще одну проблему: вам будет сложно найти свой путь. В качестве шага вперед вы можете играть с пространствами имен и делать что-то вроде «MyBundle \ Core \ CacheBundle» или «MyBundle \ Core \ TwigBundle» (который расширяет набор SF2). Ваша стратегия останется прежней, но функции будут разделены. –

+0

@ThomasPotaire. Я вернусь к вашему комментарию, когда придет время играть с архитектурой связки. :) Еще раз спасибо. – rvdavid

Смежные вопросы