Что должен представлять пакет в Symfony2 - PullRequest
32 голосов
/ 24 апреля 2011

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

Например: у меня есть сайт, который разделен на две части (одна - это просто домен 2-го уровня, такой как example.com, а другая - dom2.example.com). Каждая из этих двух частей имеет свои собственные разделы - иногда одинаковые (например, новости), иногда разные.

Что бы правильно представить это в symfony2? Должен ли я иметь

  • a MySite\site1 и MySite\site2 связывают и выполняют различные секции через разные контроллеры, или
  • связки Site1\News и Site2\News или
  • связок MySite\Site1News и MySite\Site2News и т. Д.

... или я все неправильно понимаю?

Ответы [ 3 ]

15 голосов
/ 22 мая 2011

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

Комплект - это просто группа файлов, ресурсовPHP классы и методы, тесты и т. Д. Логика группировки может быть любой, какой вам нравится.В некоторых случаях действительно очевидно, что такое группировка и почему это было сделано - например, если бы я написал систему блогов для Symfony2 и хотел выпустить ее, я бы сделал ее в комплекте.Именно такой пример используется чаще всего в документации.

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

Наконец, вы также можете использовать пакеты внутри вашего проекта абсолютно любым способом, который имеет для вас смысл.


Мой взгляд на вашу конкретную ситуацию:

Быстро и просто:

  • MySite\MyCode - выполняет свою работу, и, возможно, вы неУ нас нет логичного способа разбить код, который вы собираетесь написать.

Если между двумя сайтами есть еще несколько уникальных функций, и вы хотите выделить их для ясности:

  • MySite\SharedFeatures
  • MySite\Site1Features
  • MySite\Site2Features

Если вам действительно нравится все на своем месте, или если у вас есть комплекспроект, возможно:

  • MySite\MySiteMain (общие функции и универсальный сборник, который не заслуживает отдельного пакета)
  • MySite\News
  • MySite\Site1FeatureSomethingOrOther
  • MySite\Site2FeatureSomethingOrOther

Я определенно думаю, что вы хотите придерживаться логических групп кода - так что я думаю, что ваш пример "связывает Site1 \ News andSite2 \ News "и" MySite \ Site1News и MySite \ Site2News "- не лучший путь.Site1 и Site2 являются реализациями, поэтому создание отдельного пакета для каждой страницы новостей сайта может показаться мне неэффективным;вам нужно создать один новостной компонент и создать его для использования двумя различными способами.

Что касается вопроса о двух доменах, вы можете либо указать оба домена на один и тот же код, либо протестировать его в своем коде.для какого домена запрашивается, или вы можете извлечь две копии одного и того же кода и слегка изменить файлы конфигурации (это не обязательно нарушает идею DRY , потому что вы все равно отредактируете код водно место, затем обновите обе копии.)

11 голосов
/ 24 апреля 2011

Я понимаю, что пакет подобен тому, что CMS, например, Typo3 или Drupal, называют «плагином».Поэтому он должен быть идеально автономным и написанным таким образом, чтобы его можно было использовать и в других проектах.

Например, в вашем случае я бы создал «staticHtmlBundle», которое содержит все статические страницы вашего веб-сайта., разделенный на site.com и dom2.site.com.

Тогда я бы создал "newsBundle", который содержит все новостные статьи, возможно, даже управляемые базой данных, с небольшим административным разделом, где вы можете редактировать их и назначать их различным каналам (в вашем случае этоsite.com, dom2.site.com).Статическая страница из staticHtmlBundle будет вызывать newsBundle и отображать ее данные (например, listView для новостей или detailView и т. Д.).

Если вы сохраняете все как можно более абстрактным и повторно используемым, вы можете даже опубликоватьnewsBunde в репозитории Symfony 2 Bundle и делитесь им с сообществом!

1 голос
/ 30 декабря 2015

Я понимаю, что пакеты Symfony2 представляют собой модульную систему, которая позволяет не только расширять и переопределять код php, но и любые ресурсы, которые они могут включать или не включать.

Сказав это, представьте, что у вас есть API, и вы хотите передать объект.
Как бы вы это сделали?

Конечно, вы можете сделать это вручную, но было бы неплохо, если бы Symfony мог сделать это для вас?

Мой способ сделать это будет включать 3 пакета, JMSSerializerBundle и FosRestBundle .

  1. Один пакет для клиентской стороны - MyCompany/ClientBundle
  2. Один пакет на стороне сервера - MyCompany/ServerBundle
  3. Один пакет, содержащий все объекты для передачи данных, которые я хотел бы передать - MyCompany/CommonBundle.

Внутри моего MyCompany/CommonBundle у меня будут классы, которые я буду использовать для своих объектов передачи данных, а также правила сериализации, которые я должен предоставить JMSSerializerBundle. Они могут быть в форме аннотаций xml, yml или php.

Если у вас есть объект, заполненный данными, вы можете просто использовать return и FosRestBundle будет его сериализовать для вас. Сериализация будет зависеть от маршрутизации, поэтому вы можете сериализовать объект в XML для одной системы и в JSON для другой. Ключевым моментом является то, что у вас есть разные форматы сериализации и версии, которые вы можете использовать позже.

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

В моем примере MyCompany/CommonBundle имеет объекты, которые будут использоваться несколькими приложениями и будут идентичными. Наличие этого в виде отдельного пакета помогает избежать дублирования кода и значительно облегчает долгосрочное обслуживание.

Надеюсь, мне удалось это объяснить. Есть вопросы?
Спросите в комментариях. Буду обновлять ответ соответственно.

...