Фреймворк Symfony 2 хорош тем, что на нем можно быстро разрабатывать произвольные веб-приложения. Doctrine ORM позволяет быстро создать модель данных, затем нужно создать контроллеры и шаблоны на базе шаблонизатора Twig. Однако, если помимо какого то специфического функционала требуется достаточно стандартная публикация материалов на сайте и организация сайта в древовидную структуру, при этом зачастую, по крайней мере на начальном этапе, внешнее оформления сайта не имеет значения, требуются дополнительные затраты времени на разработку. В статье рассмотрен пример создания сайта с базовыми возможностями публикации материалов.
Популярные бандлы помогают решить стандартные задачи:
- FOSUserBundle — пользовательская система
- SonataAdminBundle — административный интерфейс
Для решения задачи публикации материалов предлагаются бандлы:
- IphpCoreBondle — организация сайта в древовидную структуру
- IphpContentBondle — публикация материалов в разделах сайта
В качестве примера рассмотрим создания сайта с использованием этих бандлов
Внимание! Скачать получившийся проект можно тут https://github.com/vitiko/IphpSandbox
Установка Symfony 2 standart edition
Установка Symfony 2 standart edition
Для начала установим стандартный проект Symfony 2. Для установки требуется файл composer.phar, который можно взять с сайта getcomposer.org). Нужно выполнить команду (используется последняя на момент написания стабильная версия Symfony 2.1.5):
php composer.phar create-project symfony/framework-standard-edition /path/to/site/ 2.1.5
DocumentRoot директорию веб-сервера соответственно нужно настроить на путь /path/to/site/web/. Послу установки стандартного проекта при запросе http://localhost/app_dev.php (где http://localhost — адрес вашего веб-сервера) должна выдаваться базовая начальная страница дистрибутива Symfony 2.
Настройка соединения с БД
Настройки соединения с БД можно настроить либо правкой файла app/config/parameters.yml, либо через веб-конфигуратор, входящий в стандартный дистрибутив Symfony 2 http://localhost/app_dev.php/_configurator. Затем нужно создать БД с указанным именем.
Установка IphpCoreBundle и IphpContentBundle
Загрузка кода
Для загрузки бандлов нужно добавить в composer.json дополнительную строку в раздел require, также нужно добавить строку Application в раздел autoload — этот путь будет использоваться копиями стандартных бандлов. Для загрузки бандлов, от которых зависит iphp/content-bundle также нужно добавить строку «minimum-stability»: «dev»
// composer.json
{
"autoload":{
"psr-0":{
"":"src/",
"Application":"app/"
}
},
...
"require": {
...
"iphp/content-bundle": "@stable"
}
}Бандл IphpContentBundle зависит от IphpCoreBundle и IphpFileStoreBundle, соответственно эти бандлы будут загружены автоматически. Затем нужно выполнить команду
$ php composer.phar update iphp/content-bundleИнициализация бандлов
Composer загрузит код бандлов в директорию vendor/iphp. Затем нужно добавить все загруженные бандлы в app/AppKernel.php. Для упрощения в составе IphpCoreBundle есть своя версия AppKernel, в которую уже включены все требуемые бандлы. Т.е. файл app/AppKernel.php нужно заменить на
<?php use Iphp\CoreBundle\Kernel\AppKernel as IphpKernel; use Symfony\Component\Config\Loader\LoaderInterface; class AppKernel extends IphpKernel { public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml'); } }
Конфигурация
В файл app/config/config.yml нужно добавить включение конфигурационных файлов установленных бандлов. Стандартный файл конфигурации security.yml можно заменить на файл @IphpCoreBundle/Resources/config/config.yml, в котором уже прописаны настройки для FosUserBundle и параметры доступа к административному интерфейсу SonataAdminBundle
imports:
...
- { resource: "@IphpCoreBundle/Resources/config/security.yml" }
- { resource: "@IphpCoreBundle/Resources/config/config.yml" }
- { resource: "@IphpContentBundle/Resources/config/config.yml" }Роутинг
В файл app/config/routing.yml нужно добавить
_main:
resource: "@IphpCoreBundle/Resources/config/routing.yml"
fos_user_all:
resource: "@IphpCoreBundle/Resources/config/routing/fos_user.yml"Т.к. демострационый бандл AcmeDemoBundle из стандартного дистрибутива для сайта не нужен — нужно удалить из файла app/config/routing_dev.yml маршруты, использующие контроллеры из этого бандла.
Генерация файлов бандлов для кастомизации
Проекты с использованием Iphp используют схему расширения стандартной функциональности базовых бандлов, которую предлагает SonataEasyExtendsBundle — специальной командой в директории app проекта создается поддиректория app/Application, в которой создаются заготовки (файлы сущностей, конфигурация Doctrine и т.п.) для бандла, расширяющего базовый бандл. Для нашего случая нужно выполнить команды:
php app/console sonata:easy-extends:generate IphpCoreBundle php app/console sonata:easy-extends:generate IphpContentBundle php app/console sonata:easy-extends:generate SonataUserBundle
Которые создадут соответствующие файловые структуры в app/Application/Iphp/CoreBundle, app/Application/Iphp/ContentBundle и app/Application/Sonata/UserBundle.
Генерация таблиц БД
Для генерации таблиц БД, соответствующих сущностям, описанным в установленных бандлах (параметры доступа к БД уже должны быть настроены и БД создана) , нужно выполнить команду:
php app/console cache:clear php app/console doctrine:schema:update --force php app/console iphp:core:createrootrubric
Команда iphp:core:createrootrubric создает запись о корневой рубрике сайта в соответствующей таблице
Использование базового шаблона Twitter Bootstrap
Базовая схема наследования шаблонов Symfony 2 предполагает использование шаблона «::base.html.twig» (файл base.html.twig находится в директории app/Resources/views). Для применения в качестве базового файла в поставке IphpCoreBundle находится шаблон, использующий Twitter Bootstrap. Соответственно нужно модифицировать файл app/Resources/views/base.html.twig чтобы он содержал:
{% extends 'IphpCoreBundle::bootstrap-v3-layout.html.twig' %}Создание пользователя — администратора
Доступ к административному интерфейсу возможен только авторизованному пользователю с правами администратора. Чтобы его создать нужно выполнить команду:
php app/console fos:user:create admin --super-admin
Затем ввести e-mail и пароль этого пользователя.
Теперь можно зайти в административный интерфейс http://localhost/app_dev.php/admin/dashboard чтобы создать структуру сайта. Чтобы SonataAdminBundle и FosUserBundle пользовались русскими переводами своих терминов — в parameters.yml нужно указать locale:ru, а в файле config.yml раскомментировать строку
translator: { fallback: %locale% }(по умолчанию в Symfony Standart она закомментирована ). Если транслятор включен, вы увидите такую страницу:

Создание структуры сайта
В разделе «Рубрики» редактируется структура сайта. Для начала нужно зайти на страницу редактирования корневой рубрики, и переименовать ее согласно тому как называется сайт, например, «Symfony2 & Twitter Bootstrap». Также нужно выбрать модуль, который находится в рубрике («Индекс сайта»), также можно ввести описание рубрики.
Затем занесем несколько рубрик, например, «Новости», «Статьи», «О проекте» в которых будут размещаться материалы сайта. Для этого нужно выбрать пункт «Добавить новый» в списке рубрик сайта. Модуль в рубрике нужно выбрать «Материалы — список»
Положение рубрик в дереве можно менять, для этого нужно только перетащить соответствующую рубрику или ветку. После формирования списка рубрик первая страница выглядит так:
Мы получили заготовку сайта с современным оформлением, использующим фреймворк Twitter Bootstrap, с пользовательской системой, реализованной на базе FOSUserBundle, административным интерфейсом на основе SonataAdminBundle и широкими возможностями разработки нового функционала и кастомизации, которые предоставляет фреймворк Symfony 2 и огромное количество бандлов, разрабатываемых сообществом разработчиков Symfony 2.
Скачать получившийся проект можно тут https://github.com/vitiko/IphpSandbox


Vitiko,
Дошел до команды:
php app/console iphp:core:createrootrubric
Получаю ошибку:
[Doctrine\ORM\ORMException]
Unknown Entity namespace alias ‘ApplicationIphpCoreBundle’.
Подскажи пож., в чем может быть дело?
Попробуйте перед этой командой очистить кэш Symfony2 (php app/console cache:clear)
Vitiko,
продолжил разбираться с Вашим материалом.
Вот что получилось…
У Вас опущены в инструкции две команды:
php app/console doctrine:database:create
php app/console doctrine:schema:create
при операциях с БД. Затем предложенное:
php app/console doctrine:schema:update —force — не очень актуальна…
php app/console cache:clear
php app/console iphp:core:createrootrubric
После этого все работает. Но css у меня были проблемы…
Разрешились после:
php app/console assets:install web.
Но никак не хочет загружать файлы.
Вот что говорит:
The form’s view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class Symfony\Component\HttpFoundation\File\UploadedFile. You can avoid this error by setting the «data_class» option to «Symfony\Component\HttpFoundation\File\UploadedFile» or by adding a view transformer that transforms an instance of class Symfony\Component\HttpFoundation\File\UploadedFile to scalar, array or an instance of \ArrayAccess.
Посоветуй пож. куда копать. Очень хочу сделать так чтобы код работал.
Поправка:
Ошибка происходит при добавлении материала.
Когда используешь кнопку «Добавить новый»
Если нажать кнопку сохранить, то файл добавляется.
Vitiko,
Что такое блоки в получившейся системе?
Как их можно использовать?
Блоки — используются блоки из http://sonata-project.org/bundles/block/master/doc/index.html
Таже проблема что и у mopkob. Если не сохранил первый добавленный и пытаешься добавить еще один получаешь LogicException. Усли просто добавить несколько пустых полей загрузки сразу, потом их заполнить (выбрать файлы) все сохраняется без проблем.
Пытаюсь сделать php app/console cache:clear
и получаю ошибку
Class ‘Application\Sonata\UserBundle\Entity\User’ does not exist
хотя физически файл присутствует в /web/Application…..
Пытаюсь жёстко в Kernel прописать new \Application\Sonata\UserBundle\ApplicationSonataUserBundle()
Получаю ошибку PHP Fatal error: Class ‘Application\Sonata\UserBundle\ApplicationSonataUserBundle’ not found in /var/www/shop1.loc/vendor/iphp/core-bundle/Iphp/CoreBundle/Kernel/RegisterBundles.php
В чём может быть причина? Почему не видится класс?
Проверьте что директория Application подключена в autoload проекта, в composer.json должно быть
"autoload": { "psr-0": { "": "src/", "Application":"app/" } } ...Спасибо, продвинулся немного дальше!
Но теперь другая беда . При выполнении команды
php app/console doctrine:schema:create
получаю сообщение что всё ОК
ATTENTION: This operation should not be executed in a production environment.
Creating database schema…
Database schema created successfully!
НО! Таблицы не создаются, и естественно
php app/console cache:clear выдаёт ошибки
Ну и соответственно
php app/console iphp:core:createrootrubric
Получаю ошибку
[Doctrine\ORM\ORMException]
Unknown Entity namespace alias ‘ApplicationIphpCoreBundle’.
Победил. Решение нашёл на StackOwerflow
Решение такое
Add the following code to AppKernel.php at the top before the class of the class file.
date_default_timezone_set(‘America/New_York’);
В описании таки пропущено
php app/console assets:install web
Добавьте плиз
Дошел до команды:
php app/console sonata:easy-extends:generate IphpCoreBundle
получаю ошибку
[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
You are not allowed to define new elements for path «security.providers». Please define all elements for this path in one config file.
Подскажи пожалуйста, в чем может быть дело?
надо добавить роут
fos_user_resetting:
resource: «@FOSUserBundle/Resources/config/routing/resetting.xml»
Спасибо, все сделал как описано выше и все вроде работает
но есть проблема
я захотел расширить интефейс своими сущностями как описано здесь
http://habrahabr.ru/post/125948/
дошел до команды
php app/console doctrine:generate:crud —entity=NSUNewsBundle:News —route-prefix=news —with-write —format=annotation
и получил ошибку
CRUD generation
[GedmoExceptionInvalidMappingException]
Missing properties: left, right in class — ApplicationIphpCoreBundleEnti
tyRubric
doctrine:generate:crud [--entity="..."] [--route-prefix="..."] [--with-write] [--format="..."] [--overwrite]
как это можно исправить?
Приветствую. Делаю все по вашей инструкции, но при выполнении любой из команда такого вида:
app/console sonata:easy-extends:generate SonataUserBundle
Вылетает ошибка:
«PHP Fatal error: Class ‘Sonata\jQueryBundle\SonatajQueryBundle’ not found in /home/user/www/sandbox.devuniversal.com/my_first_symfony_project/vendor/iphp/core-bundle/Iphp/CoreBundle/Kernel/RegisterBundles.php on line 31″
Исправлено https://github.com/vitiko/IphpCoreBundle/blob/v0.1.22/Kernel/RegisterBundles.php
вот на гите код, не могу понять, ругается что нет класса\Sonata\jQueryBundle\SonatajQueryBundle() но он там есть, как раз в 31 строчке. Вот кернел:
https://github.com/shubaivan/symfony.twitter/blob/master/app/AppKernel.php.
что не так ??
Из Sonat’ы убрали этот бандл, убрал создание этого бандла в версии 0.1.22 https://github.com/vitiko/IphpCoreBundle/blob/v0.1.22/Kernel/RegisterBundles.php
а что тогда исопльзовать?
В js-консоли ошибки типа:
404 http://iphp.local/bundles/sonatajquery/themes/flick/jquery-ui-1.8.16.custom.css
404 http://iphp.local/bundles/sonatajquery/jquery-1.8.3.js
404 http://iphp.local/bundles/sonatajquery/jquery-ui-i18n.js
404 http://iphp.local/bundles/sonatajquery/jquery-ui-1.8.23.js
А этого бандла теперь нет как вы говорите.
убрал его с 31 строчки:
\Sonata\jQueryBundle\SonatajQueryBundle()
?
все полчилось просто при создание админа просит указать почту, но надо указывать admin. А как теперь посмотреть результат захожу через прод выдает The server returned a «404 Not Found». Захожу через app_dev пишет No route found for «GET /» как зайти на первую страницу ?
первая страница — это админка http://localhost/app_dev.php/admin/dashboard
Т.е. сначала там создашь рубрики, а уже потом будет тебе /
Но я пока еще сам разбираюсь