Разработка сайта на Symfony 2 и Twitter Bootstrap

Фреймворк Symfony 2 хорош тем, что на нем можно быстро разрабатывать произвольные веб-приложения. Doctrine ORM позволяет быстро создать модель данных, затем нужно создать контроллеры и шаблоны на базе шаблонизатора Twig. Однако, если помимо какого то специфического функционала требуется достаточно стандартная публикация материалов на сайте и организация сайта в древовидную структуру, при этом зачастую, по крайней мере на начальном этапе, внешнее оформления сайта не имеет значения, требуются дополнительные затраты времени на разработку. В статье рассмотрен пример создания сайта с базовыми возможностями публикации материалов.

Популярные бандлы помогают решить стандартные задачи:

Для решения задачи публикации материалов предлагаются бандлы:

  • IphpCoreBondle — организация сайта в древовидную структуру
  • IphpContentBondle — публикация материалов в разделах сайта

В качестве примера рассмотрим создания сайта с использованием этих бандлов

Внимание! Скачать получившийся проект можно тут https://github.com/vitiko/IphpSandbox

Установка 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

Запись опубликована в рубрике Iphp Framework с метками , , . Добавьте в закладки постоянную ссылку.

23 комментария: Разработка сайта на Symfony 2 и Twitter Bootstrap

  1. mopkob говорит:

    Vitiko,

    Дошел до команды:
    php app/console iphp:core:createrootrubric

    Получаю ошибку:
    [Doctrine\ORM\ORMException]
    Unknown Entity namespace alias ‘ApplicationIphpCoreBundle’.

    Подскажи пож., в чем может быть дело?

  2. mopkob говорит:

    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.

    Посоветуй пож. куда копать. Очень хочу сделать так чтобы код работал.

  3. mopkob говорит:

    Поправка:
    Ошибка происходит при добавлении материала.
    Когда используешь кнопку «Добавить новый»
    Если нажать кнопку сохранить, то файл добавляется.

  4. mopkob говорит:

    Vitiko,

    Что такое блоки в получившейся системе?
    Как их можно использовать?

  5. Aliaksei говорит:

    Таже проблема что и у mopkob. Если не сохранил первый добавленный и пытаешься добавить еще один получаешь LogicException. Усли просто добавить несколько пустых полей загрузки сразу, потом их заполнить (выбрать файлы) все сохраняется без проблем.

  6. Viktor говорит:

    Пытаюсь сделать 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

    В чём может быть причина? Почему не видится класс?

    • vitiko говорит:

      Проверьте что директория Application подключена в autoload проекта, в composer.json должно быть

         
      "autoload": {
         "psr-0": {
           "": "src/",  
           "Application":"app/" 
          }
        }
      ...
      
      • Viktor говорит:

        Спасибо, продвинулся немного дальше!
        Но теперь другая беда . При выполнении команды
        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’.

        • Viktor говорит:

          Победил. Решение нашёл на 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’);

  7. Viktor говорит:

    В описании таки пропущено
    php app/console assets:install web
    Добавьте плиз

  8. Andrey говорит:

    Дошел до команды:
    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.

    Подскажи пожалуйста, в чем может быть дело?

  9. Dmitry говорит:

    надо добавить роут

    fos_user_resetting:
    resource: «@FOSUserBundle/Resources/config/routing/resetting.xml»

  10. Сергей говорит:

    Спасибо, все сделал как описано выше и все вроде работает
    но есть проблема
    я захотел расширить интефейс своими сущностями как описано здесь
    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]

    как это можно исправить?

  11. Николай говорит:

    Приветствую. Делаю все по вашей инструкции, но при выполнении любой из команда такого вида:
    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″

  12. Ivan говорит:

    вот на гите код, не могу понять, ругается что нет класса\Sonata\jQueryBundle\SonatajQueryBundle() но он там есть, как раз в 31 строчке. Вот кернел:
    https://github.com/shubaivan/symfony.twitter/blob/master/app/AppKernel.php.
    что не так ??

  13. Ivan говорит:

    убрал его с 31 строчки:
    \Sonata\jQueryBundle\SonatajQueryBundle()
    ?

  14. Ivan говорит:

    все полчилось просто при создание админа просит указать почту, но надо указывать admin. А как теперь посмотреть результат захожу через прод выдает The server returned a «404 Not Found». Захожу через app_dev пишет No route found for «GET /» как зайти на первую страницу ?

Добавить комментарий для Aliaksei Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">