6 июня 2011 в 12:20

Простейший блог на Symfony 2

Привет, %username%!
symfony — популярный PHP-фреймворк, на котором создано не мало серьезных проектов. Но в русскоязычном сообществе он распространен гораздо меньше. То ли это связано с более высоким порогом входа, то ли с отсутствием русскоязычной документации.
В этом статье я хочу рассказать о создании простейшего блога на symfony2.

Шаг 0. Требования к ПО

Веб-сервер (например, Apache) с 5.3.2 или выше.
Сервер базы данных. Мы будем использовать MySQL.
Git (опционально).
Шаг 1. Установка.

Есть два пути: скачать архив с сайта или использовать git. Мы пойдем по второму, т.к. многие бандлы обновляются вслед за репозитарием.
В корне веб-сервера выполняем команды:
git clone https://github.com/symfony/symfony-standard.git symfony
cd symfony
php bin/vendors.php

Переходим по ссылке http://localhost/symfony/web/config.php. Тут symfony напишет требования и рекомендации по настройке веб-сервера.
В моем случае нужно только указать директиву date.timezone в php.ini.
Там же, внизу страницы написано расположение вашего php.ini.
После того как вы исправите все проблемы, вас ждет самое интересное.
Перейдите по ссылке, с той же страницы, http://localhost/symfony/web/app_dev.php/_configurator/.
Сдесь можно настроить соединение с базой данных и выставить секретный ключ для предотвращение CSRF-аттак.
После этого symfony будет настроена, ну или предложит сама ввести полученую конфигурацию, если файл app/config/parameters.ini не доступен для записи.
Тут стоит упоминуть о бандлах. В данном случае мы будем использовать AcmeDemoBundle — уже созданный бандл, для создания демо-приложений. Углубляться в бандлы я не буду, скажу лишь, что в symfony2 из них, как из кирпичиков, строится ваше приложение.
Так же нам понадобится еще один бандл — FOSUserBundle. Он предоставляет все необходимое для работы с пользователями — вход, регистрация, подтверждение пароля и другое.
Скачиваем:
git submodule add -f git://github.com/FriendsOfSymfony/UserBundle.git vendor/bundles/FOS/UserBundle

Добавляем новое пространство имен(namespace) в app/autoload.php:
$loader->registerNamespaces(array(<br>    'FOS' => __DIR__.'/../vendor/bundles',<br>    // your other namespaces<br>);<br>

Добавляем новый бандл в наше приложение в файле app/AppKernel.php:
public function registerBundles()<br>{<br>    return array(<br>        // ...<br>        new FOS\UserBundle\FOSUserBundle(),<br>        // ...<br>    );<br>}<br>

В app/config/security.yml заменяем параметр providers:
security:<br>    providers:<br>        fos_userbundle:<br>            id: fos_user.user_manager<br>

А так же изменяем firewalls и access_control чтобы разрешить анонимный доступ для всех страниц, кроме страницы создания сообщения.
firewalls:<br>    main:<br>        pattern:     .*<br>        form_login:<br>            provider:      fos_userbundle<br>            login_path:     /login<br>            use_forward:    false<br>            check_path:     /login_check<br>            failure_path:  null<br>        logout:      true<br>        anonymous:    true<br>access_control:<br>    - { path: /post/new, role: ROLE_USER } <br>    - { path: /.*, roles: IS_AUTHENTICATED_ANONYMOUSLY}<br>

В app/config/config.yml удаляем auto_mapping: true и добавляем следующее:
doctrine:<br>    orm:<br>        mappings:<br>            FOSUserBundle: ~<br>            AcmeDemoBundle:  ~<br>            # your other bundles<br>

и в конце файла дописываем:
<br>fos_user:<br>    db_driver: orm<br>    firewall_name: main<br>    class:<br>        model:<br>            user: Acme\DemoBundle\Entity\User<br>

Так же нужно добавить в framework translator, чтобы включить перевод строк. В частности строк FOSUserBundle.
framework:<br>    translator: { fallback: en }<br>

Шаг 2. Создание моделей.

Создадим файлы в директории src/Acme/DemoBundle/Entity. Если такой папки нет — создайте её.
Post.php:
<?php<br><br>namespace Acme\DemoBundle\Entity;<br><br>use Doctrine\ORM\Mapping as ORM;<br><br>/**<br> *<br> * @ORM\Entity<br> */<br>class Post<br>{<br>    /**<br>     * @var integer $id<br>     *<br>     * @ORM\Id<br>     * @ORM\Column(name="id", type="integer")<br>     * @ORM\GeneratedValue(strategy="AUTO")<br>     */<br>    private $id;<br><br>    /**<br>     * @ORM\ManyToOne(targetEntity="User", inversedBy="posts")<br>     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")<br>     */<br>    public $user;<br><br>    /**<br>     * @var string $title<br>     *<br>     * @ORM\Column(name="title", type="string", length=255)<br>     */<br>    public $title;<br><br>    /**<br>     * @var text $description<br>     *<br>     * @ORM\Column(name="description", type="text")<br>     */<br>    public $description;<br>}<br>

Комментарии перед переменными — аннотации. В их использовании не должно возникнуть сложностей, если, конечно, не задаваться вопросом «как оно работает?».
User.php:
<?php<br>namespace Acme\DemoBundle\Entity;<br>use FOS\UserBundle\Entity\User as BaseUser;<br>use Doctrine\ORM\Mapping as ORM;<br><br>/**<br> * @ORM\Entity<br> * @ORM\Table(name="fos_user")<br> */<br>class User extends BaseUser<br>{<br>    /**<br>     * @ORM\Id<br>     * @ORM\Column(type="integer")<br>     * @ORM\generatedValue(strategy="AUTO")<br>     */<br>    protected $id;<br>    <br>    /**<br>     * @ORM\OneToMany(targetEntity="Post", mappedBy="fos_user")<br>     */<br>    public $posts;<br><br>    public function __construct()<br>    {<br>        parent::__construct();<br>        // your own logic<br>    }<br>}<br>

Мы наследуемся от FOS\UserBundle\Entity\User, так что кроме двух заданных нами будут сгенерированы еще несколько полей, включая username, password и email.
После написания моделей мы можем смело создать таблицы:
php app/console doctrine:schema:create

Шаг 3. Создание контроллера.

Создадим файл PostController.php в папке src/Acme/DemoBundle/Controller/:
<?php<br>namespace Acme\DemoBundle\Controller;<br><br>use Symfony\Bundle\FrameworkBundle\Controller\Controller;<br>use Acme\DemoBundle\Entity\Post;<br>use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;<br><br>class PostController extends Controller<br>{<br>    /**<br>     * @Template()<br>     */<br>    public function indexAction()<br>    {<br>        $em = $this->get('doctrine')->getEntityManager();<br>        $posts = $em->getRepository('AcmeDemoBundle:Post')->findAll();<br>        return array('posts' => $posts);<br>    }<br>    <br>    /**<br>     * @Template()<br>     */<br>    public function newAction()<br>    {<br>        $post = new Post();<br>        // Получаем пользователя и присваиваем новому посту<br>        $post->user = $this->get('security.context')->getToken()->getUser();<br>        // Создаем форму, по хорошему следовало бы создать отдельный класс, но можно и так<br>        $form = $this->get('form.factory')<br>            ->createBuilder('form', $post)<br>            ->add('title', 'text')<br>            ->add('description', 'textarea')<br>            ->getForm();<br>        $request = $this->get('request');<br>        if ($request->getMethod() == 'POST') {<br>            $form->bindRequest($request);<br>            if ($form->isValid()) {<br>                $em = $this->get('doctrine')->getEntityManager();<br>                $em->persist($post);<br>                $em->flush();<br>                return $this->redirect($this->generateUrl('post_index'));<br>            }<br>        }<br>        return array('form' => $form->createView());<br>    }<br>}<br>

Зачем нужен Template() перед каждым экшеном? Без него вместо
return array('posts' => $posts);

нам бы пришлось писать
return $this->render('AcmeDemoBundle:Post:index.html.twig', array('posts' => $posts));

Шаг 4. Шаблоны.

В src/Acme/DemoBundle/Resources/views/Post создадим вид для каждого экшена.
index.html.twig:
{% extends 'AcmeDemoBundle::layout.html.twig' %}<br><br>{% block content %}<br><br>{% if is_granted('ROLE_USER') %}<br>    <div><a href="{{ path("post_new") }}">New Post</a></div><br>{% endif %}<br><br>{% for post in posts %}<br>      <h2>{{ post.title}}</h2><br>      <p>{{ post.description }}</p><br>      <div>by {{ post.user.username }}</div><br>{% else %}<br>    Пока в блоге нет статей.<br>{% endfor %}<br><br>{% endblock %}<br>

new.html.twig:
{% extends 'AcmeDemoBundle::layout.html.twig' %}<br><br>{% block content %}<br>    <h1>New Post</h1><br>    <br>    <form action="{{ path("post_new") }}" method="post"><br>        {{ form_widget(form) }}<br><br>        <input type="submit" class="symfony-button-grey" value="Create" /><br>    </form><br>{% endblock %}<br>

О шаблонизаторе Twig уже частично упоминалось на хабре, но есть и отличная официальная документация, правда на английском языке.
Шаг 5. Роуты.

В app/config/routing.yml прописываем наши роуты и не забываем про UserBundle
post_index:<br>    pattern: /post<br>    defaults: { _controller: AcmeDemoBundle:Post:index }<br><br>post_new:<br>    pattern: /post/new<br>    defaults: { _controller: AcmeDemoBundle:Post:new }<br><br>fos_user_security:<br>    resource: "@FOSUserBundle/Resources/config/routing/security.xml"<br><br>fos_user_user:<br>    resource: "@FOSUserBundle/Resources/config/routing/user.xml"<br>    prefix: /user<br><br>* This source code was highlighted with Source Code Highlighter.

Теперь наш блог будет доступен по ссылке http://localhost/symfony/web/app_dev.php/post, а при попытке зайти на http://localhost/symfony/web/app_dev.php/post/new вы будете перенаправлены на страницу входа.
Послесловие

Я не претендую на полное руководство и оригинальность, это скорее заметка по быстрому старту приложения для себя.
Буду рад если кому то пригодится, так же не откажусь от помощи и критики.
У кого будут вопросы — задавайте, думаю на хабре есть люди которые занимаются этим фреймворком.
Кроме того у нас есть jabber-конференция symfony@conference.jabber.ru
Игорь @nuclear
карма
9,0
рейтинг 0,0
Разработчик
Похожие публикации
Самое читаемое Разработка

Комментарии (102)

  • +14
    Не холивора ради, но если симфони1 вдохновлялся Ruby on Rails, то симфони 2 скорее ближе к джаве. Преимущество RoR подхода мне кажется в его лаконичности, преимущество джавы — гибкости и расширяемости. Т.е. как по мне, в чистом виде, симфони подходит для энтерпрайз-приложений, но не «сваять сайт», «сделать блог», «сделать свою социальную сеть», короче, не для стартапов. Ибо стартапы имеют ограниченные ресурсы и все эти неймспейсы, аннотации, конфиги это то что отвлекает от самой разработки.

    В моем понимнии, симфони2 это отличный каркас для некого нового фреймворка, который бы объединял простоту symfony1/ror и мощь symfony2. Но к сожалению, пока таких не видно и думаю, ближайший год не будет. Потому, чисто по параметрам стабильность, документированость, юзабилити я предпочту пока Rails. Для личных разработок.
    • +1
      Уже есть например silex. Собранный на основе компонент symfony. Интересная штука.
      • 0
        Да, направление правильное, разработчики симфони сами намекают на то, что хотят, чтобы был новый фрйемворк на основе симофни2. Сами они называют симфони2 метафреймворком. Но пока это Синатра-клон, он нацелен на свои задачи и для массового использования не годится.
        • +3
          Что за феерический бред? Где мы такое говорили? Symfony2 не годится для стартапов? shopopensky.com/, www.exercise.com/, jirafe.com/. И это учтите, что Symfony2 еще даже не в RC цикле!
          • +4
            Ну ты же сам работал с рельсами и работал с симфони2. Я лишь высказал мнение, что рельсы пока что выглядят лучше и дружелюбнее для разработки. И по сути это не в упрек симфони2, просто ему пока не хвтает некого более дружественного интерфейса в обертке над нынешнем. Более мощный аутолоадер, меньше конфигов, больше генераторов, и т.п. Например, я бы хотел верить, что с выходом Propel2 симфони даже превзойдет Rails.
            • +1
              Как можно сравнивать дружелюбность фрэймворка, уже имеющего 3 отстабиленные ветки с тем, который еще даже в RC ни разу не переходил (symfony1 и Symfony2 — абсолютно разные продукты)? И вот да, так документация и конвенции по Symfony2, отличны, понятны и дружелюбно, несмотря на постоянный WIP
              • +2
                Почему нельзя сравнивать? Из религиозных убеждений? Это всё веб-фрейимворки, на всех из них можно написать блог. Просто фичи для упрощения разработки пока даже не аннонсируются в симфони, потому мое мнение, скоро появится новый фреймворк типа Silex, но что-то более мощное, объединяющее простоту RoR и symfony.
                • 0
                  Не анонсируются фичи для упрощения? Правда? Мне опять кинуть ссылку на блог? Возможно просто не по той модели упрощения, которую хотели бы вы лично. Но поверьте мне, мы работаем именно над теми конвенциями, которые упростят жизнь PHP-разработчикам, а не тем, кому хочется RoR, но лень учить Ruby.
                  • 0
                    Интересно, про симфони1 ты тоже так говорил, что это РОР кому лень учить Руби?

                    Ну неужели так сложно попробовать смотреть ситуацию объективно, а не с религиозной точки зрения? Для ускорения разработки симфони2 не имеет никаких преимуществ над симфони1. И это видно по отзывам сдесь же.
                    • 0
                      Бентли не имеет никаких преимуществ над мерседесом. И это видно по отзывам тех, кто никогда не ездил на бентли.
                      • 0
                        Не ездил ни на том ни на другом, сказать не могу. Но думаю, водители бы оценили аналогию.
              • +5
                Не смотря на почти нулевые знания руби я в рельсы въехал за день (при этом копая доки по самому руби), а симфонии (2) я испугался. Нутром понимаю что вроде чуваки правы и делают правильно, но посмотрев на простейшие вещи понимаю, что до юзабилити рельсов им еще далеко. За основу можно брать любой компонент, хоть модель, хоть контроллер, хоть вьюхи, хоть роутинг. Про бандлы вообще молчу.
                • 0
                  Бандлы, правды ради, не столько заслуга Рельс, сколько Руби. Bundler просто удачно применил механику gem-ов.
                  Впрочем, я сейчас осознал, что, возможно, отсутствие этой кучи статичного кода, тоже заслуга Руби.
                  • +3
                    При чем тут руби? Разве только то, что на нем написаны рельсы… Никто не мешает сделать такой же простой конфиг и юзать его. Если у симфонии будут плагины «хорошо лежать», то никто не мешает их так же ставить.

                    Да и по поводу статичного кода…

                    @posts = Post.find;

                    $this->posts = Post::find();

                    вместо

                    $em = $this->get('doctrine')->getEntityManager();
                    $posts = $em->getRepository('AcmeDemoBundle:Post')->findAll();
                    return array('posts' => $posts);
                    • +1
                      Да, с примером согласен на все 100%. Доподлинно неизвестно, зачем заставлять писать пользователя такое количество ненужного кода. К примеру добавлю сложность описания моделей.
                      • 0
                        Вот потому я верю в успех Propel2, правда я думал, что будут развивать Doctrator, но он как-то заглох. Доктрина в чистом виде тоже метафреймворк, хотелось бы всё-таки хоть какой-то ActiveRecord. Тем не менее, она чуть более стабильна первой доктрины, и не «течет», как делала первая.
                        • 0
                          Вообще слово «верю» это круто. Не, правда. Можено сидеть и верить, что когда-то это станет крутым и прикольным. Вот тока проблемка одна есть… Писать то сейчас нужно :)
                          • 0
                            Ну так как возможности писать нет, я только верю. И совершенно не ставлю это себе в заслугу :(
                            • 0
                              Это не было укором)) И я не про помощи разработчикам пропела, а просто про текущие проекты. Для себя я решил, что свои проекты я буду поднимать только на рельсах, т.к. это просто удобней.
                        • 0
                          DataMapper(+UnitOfWork) более продвинутый паттерн, чем ActiveRecord. Но, да, даже Фаулер считает, что его применение не всегда лучший выход. Для CRUD он явно излишен, его преимущества чувствуются на более сложной бизнес-логике.
                      • 0
                        Модели описывать элементарно — простой «Plain Old PHP object» — разрабатывать и тестировать модель предметной области одно удовольствие. Запарно описывать мэппинг этой модели на базу данных.
        • 0
          Symfony2 cmf запланирован давно, но я от него чего-то особенного не ожидаю, т.к. участники пока своими работами (включая упоминаемую в посте ужаснейшую ФосЮзерБандлу) далеко не блещут. Вообще из всех лежащих в открытом доступе на гитхабе бандл мне пока понравилась только WhiteOctoberAdmin, которая, несмотря на зачаточное состояние, уже дает возможностей больше чем админ-генератор s1 и крайне проста.

          Что же касается сложности, имхо для «простого блога» не нужно юзать рельсы, а достаточно вордпресса с миллионом написанных плагинов и доступных для найма индусов. А для любого приложения, которое хоть как-то планирует расширяться и масштабироваться, спрингово-симфонийский подход гораздо лучше.
    • +1
      PHP вообще тяготеет к Java в последнее время и Фабиену это, похоже, нравится :) А так согласен, симфони2 с её модульностью, DI и т. п., больше подходит для долговременных сложных проектов, чем для «здесь и сейчас».

      Но вот с прогнозом, думаю, немного ошибаетесь. По-моему, перспективы у симфони выйти на «здесь и сейчас» никак каркас для какого-то другого единого каркаса, а в виде основы для многочисленных «сборок», решающих конкретные задачи.
      • 0
        Я и подразумеваю, что должен быть новый фреймворк, который позволяет писать на симфони маскимально лаконично и эффективно. Вполне возможно, это и будет некая такая сборка. Но, например, собрать полезные бандлы и выкатить это как сборку, каркас для проекта, этого будет немного маловато. С точки зрения архитектора это будет выглядеть хорошо, а с точки зрения разработчика он не поймет, почему, например, столь необходимо писать \Entities\User, Symfony\Controller, короче, использовать всю строгость именований. Для 90% случаев она не нужна.
        • 0
          Не нужна — не используйте. Пишите контроллеры и ентити в глобальный неймспейс и наслаждайтесь этим, если вам действительно кажется, что отсутствие неймспейсов сколь-нибудь ускорит вашу разработку.
          • 0
            Блин, ну неужели не очевидно о чем я говорю? О сложности писать все эти строгие конструкции. И ускорить разработку скорее поможет выбор другой платформы )
            • 0
              Вас НИКТО не заставляет их писать! Вам быстрее все накидать в 1 неймспейс или даже файл? Кидайте! Все будет работать.
              • 0
                Ок, если мои слова понять трудно, попытаюсь объяснить, что имелось ввиду с помощью ссылки:
                propel.posterous.com/the-end-of-autoloading
                • 0
                  Француа не программист, о чем он сам ни раз повторял (точнее он говорил, что он ужастный программист). И как не-программисту, ему сложно понять некоторые концепции программирования. Француа менеджит разработку пропела, но код пишут немного другие люди ;-)
                  • +3
                    Ага, отличный ход в споре — указать на ничтожность оппонента.
                    • 0
                      Вы прибегли к ссылке на пост автора, оперирующего своими личными ощущениями к теме дискуссии. Я обратил ваше внимание на то, что личные ощущения ДАННОГО автора могут сильно расходиться с ощущениями и потребностями РЕАЛЬНЫХ разработчиков, о которых мы ведем речь.
                      • 0
                        Ок, я тоже нереальный. Другие разработчики, которые не согласны с вашей политикой тоже нереальны?
                        • 0
                          Вы переводите разговор в сферу личностных восприятий. Я не делю программистов на реальных/нереальных по признаку принятия/непринятия моей точки зрения. Но я называю программистом лишь того, кто пишет код и пишет его профессионально. Тот, кто код не пишет или писать его красиво не умеет (по его собственному признанию), не является программистом и, соответственно, не может целостно определить что для программиста лучше, а что хуже. Вот и все. Политика тут не при чем. Приведите другой пример или сформулируйте свою собственную точку зрения.
                          • 0
                            Ну да, есть программисты, которые программисты, а есть программисты, которые никак не программисты, хотя пытаются казаться программистами.
                • +1
                  Есть сотни других ПРАВИЛЬНЫХ и КРАСИВЫХ моделей разработки помимо рельс. Свыкнитесь с этим, как свыклись коры Symfony2 ;-) Большинство проблем первой симфонии появились как раз от того, что симфония пыталась походить на рельсы, но PHP — это ни разу не Ruby. И да, по объектной модели, PHP ближе к Java, чем к чисто-объектному Ruby. Это ни хорошо, ни плохо — это просто так!
                  • +1
                    Ну да, рельсы просто помогают делать сложные вещи простыми, это мне и нравится. А вот модель делать простые вещи сложными, совершенно не нравится. Неужели это мнение столь дикое, что должно обязательно оспариваться?
                    • 0
                      Я оспариваю ваши личностные предположения о том, что Symfony2 априори развивается по пути усложнения жизни разработчиков и процесса разработки.

                      Я привел примеры 3 активно-разрабатывающихся стартапов на Symfony2, не имеющих проблем со сложностью разработки или понимания самого процесса разработки программистами. Вы, напротив, делаете выводы, о сложности и удобстве Symfony2, основываясь лишь на том, что она не похожа на RoR.
                      • 0
                        Блин, а в чем мы эффективность меряем? А её ни в чем пока не измерять, она может быть только личным ощущением. Я вот чувтствую, что тот же блог с фичами, я напишу на симфони1 и рор быстрее, чем на симфони2, даже если дать 3 дня форы на полноценное изучение документации. Я не оспариваю, что на симфони2 можно разрабатывать, и что он хорош. Блин, сколько можно повторять, что симфони2 настолько классная шутка, что поверх него, вполне можно написать свои рельсы, как уже написан свой Sinatra. Зачем тогда спорить? Я прекрасно понимаю, что обе модели разработки имеют право на жизнь. Почему не хочешь понять этого ты?
                        • –1
                          Затем, что «симфони2 настолько классная шутка, что поверх него, вполне можно написать свои рельсы», «для массового использования не годится» и т.п. являются голословными утверждениями, основанными на личностном отношении и непонимании субъекта обсуждения. Да, Symfony2 очень расширяем. Да, код в нем больше похож на Java, чем на Ruby. Но НЕТ, не нужно сверху ничего напиливать, чтобы он был прекрасным средством для разработки. Для блога он не сильно подходит, конечно. Как не подходят для этого и рельсы! Но если очень хочется — и на том и на том можно БЫСТРО, КРАСИВО, КАЧЕСТВЕННО написать блог. Только для начала нужно изучить тул, с которым будешь работать — будь то RoR или Symfony2.
                          • +2
                            Количество любви и обожания к Симофни2 тут явно обратно пропорционально адекватности высказываемого.

                            Сам я всё сказал. Dixi.
                          • +1
                            Скорость и качество разработки на знакомом фремворке явно выше, чем на незнакомом. Я даже не знаю, зачем было оглашать эту аксиому.
                            Речь, как я понял, идет лишь об излишнем нагромождении действий и кода, необходимых для решения элементарных задач. Если для получения результата нужно ручками написать 20 строк вместо 3х, то это восторга не вызовет, как вы ни расхваливайте удобство и элегантность этих 20ти строк. Краткость — сестра таланта.
                  • 0
                    Большинство проблем первой симфонии


                    А можно в двух словах о проблемах? Интересно.
      • 0
        Они как я понял так и хотят делать — distributions, просто пока со стабильностью не закончат — до этого видимо не доберутся.
        • 0
          это обнадеживает :)
    • –1
      Аннотации как раз и введены, чтобы упростить разработку, причём они опциональны. Не совсем понял про неймспейсы — как они могут отвлекать от разработки? Да и по поводу ресурсов — symfony2 куда менее требовательна к ресурсам по сравнению 1.
      • 0
        Аннотации — отлично. Но по сути вместо аннотаций мы пишем конфигурацию. Они могут быть гораздо лаконичнее, вот и всё. Я считаю, что аннотации это путь в будущее, но они должны легко запоминаться и легко писаться. Без всяких ужасных префиксов.
        • 0
          Да прочитайте вы хотябы оффициальный блог прежде чем делать какие-либо выводы или ставить утверждения: symfony.com/blog/symfony2-annotations-gets-better
          • 0
            Прикинь, читал. Суть поста в том, что мы сделали аннотации более длинными, чтобы вам было легче писать. Ну или вы можете вгружать неймспейсы. Я не говорю, что это неправильно. Просто это неудобно. Usability, ага?
            • 0
              Да поймите вы наконец, Usability !== МалоБуков! Порой легче написать и осознать 3 логичных слова, чем из раза в раз пытаться запомнить 1 нелогичное!

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

              Да, нужно написать полный неймспейс класса с аннотацией, но после этого вы сознательно понимаете:

              1) Как вызывать остальные аннотации
              2) Где смотреть код аннотации
              3) Как добавить свою

              Вот это — usability, а не что-то из области «меньше букв», «меньше нажатий»
              • 0
                Ну я же знал, что без холивора не обойдется. Ок.
        • 0
          /**
          * @Route("/:id")
          * @Cache(smaxage=«15»)
          */
          public function showAction(Post $post)
          {
          }

          Разве это не удобно?
          FrameworkExtraBundle, экспериментальная фича. Но кто его знает что будет на момент релиза.
          • –1
            Вот это как раз удобно. Только насколько быстро аннотации будут работать?
            • 0
              На сколько я понимаю в symfony все кешируется.
            • 0
              Понятно вообщем. Люди вам сейчас будут пересказывать документацию Symfony2, а вы будете задавать все новые и новые вопросы, прекрасно описанные в ней ;-)

              Все в Symfony2 КЕШИРУЕТСЯ. Включая прочтенные аннотации!
            • 0
              Миш, быстро они работают. Можно самому проверить :)
        • +2
          Меня честно говоря напрягает обилие возможностей для конфигурирования. Никак не могу остановиться на одном способе. Вроде бы аннотации смотрятся лаконично, но для config их использовать нельзя. XML вообще правильный формат, но по читабельности сильно проигрывает (именно читать конфиги неудобно, валидация по XSD рульная вещь, прямо на уровне IDE). Ну и т.д.
      • +1
        Аналогично не холивара ради.
        Извините, не знаком с Симфони, но если аннотации введены, чтобы упростить разработку, то что же было до них?
        Просто на протяжении чтения статьи не покидал опрос «Почему нужно выполнять столько действий? Зачем писать столько кода? Это же Симфони!» До этой статьи искренне считал Симфони нечто богоподобным, составляющим конкуренцию Рельсам.
        • 0
          Косательно аннотаций модели, в symfony1 (а если быть точнее, то в doctine1) были отдельные файлы схем config/doctrine/schema.yml. В symfony2 точно так же можно описать всё в одном файле app/config/mapping.orm.yml.

          Субъективно, 3 рhp-файла по 20 строк и 2 шаблона это не так уж и много кода для функционала блога. Единственное, чего нет в symfony2, так это admin generator'a из symfony1. C ним бы не пришлось создавать и эти файлы. Возможно, скоро и этот функционал появится в виде бандла (если ещё не появился), всё такие symfony2 ещё в бете.

          • 0
            Появился, уже давно.
            • 0
              • 0
                Это не админ-генератор. Тут генерация бандлов, моделей, круда и форм.
                • 0
                  Это то, что избавляет разработчика от рутины. Не вижу принципиального различия с админ-генератором из symfony1. Там та же генерация модулей, круда, форм и фильтров, разве нет?

          • 0
            Относительно разработки без фреймворка — не много. Я же невольно оцениваю любой фреймворк, опираясь на опыт Рельс. Для примера, файл с моделью поста выглядел бы так:

            class Post < ActiveRecord:Base
              belongs_to :user
            end
            

            Чувствуете разницу?
            • 0
              Не чувствую. Вы забыли про миграции. Получилось бы почти тоже самое.
              • +1
                Ой, да ради бога:

                class CreatePosts < ActiveRecord::Migration
                  def self.change
                    create_table :posts  do |t|
                      t.string :title
                      t.text :body
                      t.references :user
                      t.timestamps
                    end
                  end
                end
                

                И это при том, что миграции гораздо более удобны и не захламляют основной код.
                • 0
                  /** @Entity */
                  class Post
                  {
                  /** @Id */
                  private $id;

                  /**
                  * @ManyToOne(targetEntity="User", inversedBy="posts")
                  * @JoinColumn(name="user_id", referencedColumnName="id")
                  */
                  public $user;

                  /** @Column(name="title", type="string", length=255) */
                  public $title;

                  /** @Column(name="description", type="text") */
                  public $description;
                  }

                  Намного ужаснее выглядит. Спор о фломастерах. И да, мне нравятся подход Рельс, да и рельсы тоже, просто это не повод забивать на все остальное.
  • 0
    Пишем приложение на symfony2 + doctrine2 (~2000 человекочасов уже). Symfony довольны, особенно community. А вот с Doctrine2 стоит быть осторожным — я за время использования нашел некоторые баги, один из которых вчера пофиксили в апстриме, а другой так до сих пор и висит в их JIRA, несмотря на то что там репорт+тест+патч

    • 0
      В моделях используете геттеры/сеттеры или паблик свойства как тут?
    • 0
      А мы как раз хотим часть симфони1 проекта на Доктрину 2 переводить… Наверное, действительно стоит изучить все подводные камни, что там накопились в багтрекере.
  • 0
    по обилию кода очень на кое кого смахивает
    • 0
      На кого же?
      Да и тут больше конфигов, чем кода.
  • +1
    А тем временем вышла Symfony2 beta4. Впечатляет активность и прогресс разработки.
    • 0
      Чем именно? Активность последние 3 месяца, ребята конечно работают на износ, но обновляться каждую неделю (с правками сопутствующих багов) честно говоря уже достало )
      • 0
        Вот как раз тем как они работают. Извините, у меня просто нет приложений на Symfony2. Я пока слежу за разработкой.
        • 0
          Я до марта месяца следил, потом взялся делать небольшое приложение под Facebook. И сейчас для себя что-то типа такого блога делаю ) В документации поуши, постоянно меняется что-то, так что для активной разработки (во всяком случае коммерческой) не подходит. Хотя ребята делают проекты, с десятками моделей, самодельными админ-генераторами и т.п. )
          • 0
            Да, уж, тоже после первой беты перестал следить, обновляешь, слетает, правишь, потом опять…
            В общем понял, что рано пока.
  • +8
    Я наверное не попаду в струю, но эта жесть мне кажется куда менее клёвой и удобной, чем sf1.x. Наверное, пока нет рабочих генераторов sf2 так беспомощно выглядит. В общем, есть большая вероятность, что останусь на 1.4, которая куда как приятнее и логичнее для меня.
    • +2
      Ну вот вцелом у меня то же впечатление. Собственно холивар по этому поводу и вырастает на пару каментов выше.
  • 0
    Попробовал делать сайт одновременно на симфони 2 и на симфони 1.
    Симфони 2 очень хороший и мне безумно нравятся идеи в нем заложенные. Но сайт написал на симфони 1, который ругаю и не люблю. Почему? На симфони 1 быстрее в разы.

    Симфони 2 я бы выбрал для большого проекта на много разработчиков, где важна не скорость индивидуальной разработки, а строгость исполнения.
    • 0
      Ну как бы на 1.4 опыта больше. Потому и быстрее. Я столкнулся с аналогичной проблемой. Но с symfony2 ситуация как с теми мышами которые «плакали, кололись, но продолжали жрать кактус» )) Ибо идеи в нем заложенные мне тоже очень нравятся.

      Я сплю и вижу как буду составлять проекты из блоков-бандлов одной левой )) и все сразу с тестами, и все суперклево ))) но это пока только во сне.
      • +1
        А я вот мечтаю мегапростой фреймворк, со всеми возможностями симфони2, в том числе и составление преокта из блоков бандлов. Даже мечтаю сам некогда такой написать, но тоже, только во сне пока :)
  • +1
    В попытке сделать фреймфорк аля django/ror на php symfony 1 однозначно потерпел фиаско. Оно и не удивительно, ведь даже сам синтаксис php никак не похож ни на ruby ни на phyton не говоря даже об объектном начале (против процедурного в php). Реализация в стиле ASP.NET MVC и Spring Framework кажется более удачным началом. Возможно, это даже приведет к тому, что symfony станет enterprise ready. Все зависит от коммьюнити.
  • +3
    Ох, как же оно этими конфигами и аннотациями похоже на Spring в Java. Монструозное очень.
  • +1
    Да только эта кухня вышли в preview релиз, уже было ясно что это Java. Насколько я знаю everzet один из активных коммитеров в symfony2. Костя, вам люди уже сказали что эта кухня никому не нужна в стартапах, потому что это (время на проект * 2) ради сомнительной выгоды… в частности сетеров и гетеров,… с каких пор php уже жабабинсами стал? Анатоции через комментарии, бл@zzz?
    Да ну… по моему это академический фреймворк. А то что shopopensky.com делают себя на нем, не удивительно если J.Wage там работает
    • +1
      если писать на symfony2 то лучше уже сразу на java/scala перейти и это не преувеличение
      • 0
        Посещали такие мысли (насчёт Java, у Scala вроде функциональный подход, на который на практике у меня мозги не поворачиваются для CRUD и «бухгалтерских» приложений), но начал знакомиться с процессом деплоймента и что-то энтузиазм пропал — на симфони (как и на любом другом приложении на php) я могу написать в Install Guide, утрируя: «скачайте архив, разархивируйте, закачайте в корень сайта. Если у вас не виртхостинг, то предварительно сделайте apt-get install php5 mysql php5-mysql». Всё! Но вот хостингов на Java, на которые можно было бы просто залить исходники по ftp и сайт бы заработал я не встречал.
        • 0
          Можете забыть про обычные хостинги для sf2. Вам придется юзать VDS. А если уже такая кухня пошла то легче юзать django например, куча модулей уже готовых, кода в 3!!! раза меньше писать, и фреймворк намного! проще sf2, и быстрее :) Я могу сказать одно, что команда symfony сама себя в такое положение поставила. Делая из скриптового языка, и подхода в программировании, жалкое подобие компилируемой java.
          И не сравнивайте мягкое с теплым. Вы сначала скорость сравните scala и php. Если есть куда дейплоить то загрузка тоже сводится до выгрузки .war файла и не надо никаких apt. Сервер приложений для java проектов и скриптовых движок косящий под него, это совсем разные вещи.
          • 0
            Про обычные хостинги для себя я давно забыл. Но вот с той же Django не согласен, про RoR вообще молчу. Писать может и меньше, но у меня скорость разработки редко ограничена скоростью набора кода и тестов для него — думать больше приходится.

            Да и развертывание приложений на голом (v)ds под (или над?) ними, имхо, требует развитых навыков администрирования в отличии от php. Вы правильно сказали — «если есть куда деплоить», имхо настроить сервер приложений на порядки сложнее, чем поднять LAMP. А скорость адекватно сравнить не могу — в ФП я лишь немногим больше, чем ноль и мой код будет императивным, запихнутым в рамки функционального подхода, то есть органично сочетающий их недостатки. И вы действительно считате, что блог или сайт-визитку лучше делать на Scala или Java, чем на PHP, Python или Ruby?

            • 0
              Во-первых в scala можно писать без ФП, или по крайней мере использовать его по минимуму, там ничего сложного нет, не сложнее ruby. Там есть намного сложнее вещи, система типов и т.д. Ну неважно.
              Ну я не знаю если для вас сложно разобраться с методами дейплоймента или настройки ну тогда стоит специалиста нанять. Просто вы сравнили установить интерпретатор и установить и настроить сервер приложений. Это как бы завести мопед или перебрать двигатель в нем и завести. Ну это совсем разные задачи. Есть куча хостингов Java, но хороший найти чуть сложнее чем хороший с php найти. Именно чуть.
              Я не о сайте визитке говорил(читайте выше) а вообще о фреймворке. Визитку, блог, проще написать на django, чем на symfony. Объясняю почему. К слову, я с sf1 2 года проработал. Так вот, то что вы больше думаете когда пишите это замечательно, но как насчет последующей поддержки? В 3-5!!! раза больше кода получается в вашем приложении по сравнении с django приложением. Код намного больше запутан. Соответсвенно менять что-то дольше, так как вы в реальной жизни не сможете обойтись красивыми чистыми классами как doctrine2 навязывает. Это раз. Теперь взлянем на ситуацию новый программист хочет/нужен прийти в проект но незнает sf2, вы представляете сколько нужно времени чтобы он въехал в этот фреймворк и тогда уже в проект. Вы посчитайте сколько там технологий, если их выучить то это проще 60% технолигий выучить для java веб разработки, и получать 2-3 раза больше денег. Это два. И это ответ почему коммюнити не будет расти как будто какая то революция произошла. А я прекрасно помню как sf2 заявлялся года 1.5 назад. И три. Сравните бенчмарки через apache benchmark например 200 одновременных запросов c общей суммой запросов 10к например. Обычный не очень нагруженный сайт, к которому в один момен может стукнуться 200 пользователей а потом сразу еще 200. И тоже самое с тем же django. И вы увидите что у вас выхода не будет кроме как наставить все кешировать. Varnish и писать для приложения кеши. И это только с самого начала жизни сайта, а что будет потом? Мне такой фреймворк не нужен, придеться только им и заниматься как бы что не просело.
              • 0
                >>> Соответсвенно менять что-то дольше, так как вы в реальной жизни не сможете обойтись красивыми чистыми классами как doctrine2 навязывает.
                А если и сможете все аккуратно делать, то вы будете писать столько сколько пишутся java приложения, по несколько месяцев. Вот теперь скажите кто будет платить за эту сомнительную выгоду? А поскольку sf dev как человек знающий не мало захочет неплохой рейт в час, то как вы думаете кого будет предпочтительнее нанять заказчику разработчика python который пишет быстро! на django или sf2 дэва который не может объяснить почему его проект стоит так же как на django а может и дороже и ему еще нужно больше времени. Вот и все. Тут решит все рынок.
    • +1
      Я так понял, ему важнее защитить свою точку зрения, а не услышать других.
      • +1
        имхо, он не сможет повлиять никак, я на symfony v1.x уже около 2.5 лет проработал, я вынес один урок, что sensio ни к кому не прислушивается, даже если это конструктивная критика… поэтому я для себя решил что с смертью sf1 перейду на django… а это в 3 раза меньше кода писать чем в sf2
        конечно я сгораю от любопытства увидеть большой открытый проект на sf2, но имхо 80% даю что это epic fail…
        он просто настолько сложный будет, что на нем смогут писать только те кто знают более менее 2-3 ЯПа
        для программиста с 1 годом стажа он будет недосягаем
        • 0
          Я бы не драматизировал. Чувствую, они всё это понимают, но в первую очередь симфони и доктрина это метафреймворки, на них можно создавать удобные штуки, главное, пока избавить проекты от тех ограничений, что были в sf1. Удобство можно будет добавить потом. Нету никаких объективных причин почему нельзя спрятать мощь симфони за простой оберткой. Просто пока об этом никто не думает, или это не афишируется. Но пример Silex, FrameworkExtraBundle и Doctrator говорит о том, что впринципе такое будет создаваться и будет поощряться.
        • +1
          «что на нем смогут писать только те кто знают более менее 2-3 ЯПа для программиста с 1 годом стажа он будет недосягаем»

          Хе-хе. а в рельсах 3.1 добавили 2 новых языка программирования, и тем не менее они стали удобнее ) Всё-таки они развиваются как-то лучше, без революций, но именно целясь на удобство разработчиков. В Rails 3 они перелопатили всю архитектуру ActiveRecord, но переход достаточно несложным оказался. В симфони всё не так :(
          • 0
            В Rails 3 они перелопатили всю архитектуру ActiveRecord

            А во второй симфони просто отказались от этого паттерна (вернее в второй Доктрине от него отказались). И хз как кому, но мне приятней писать под вторую Доктрину, чем под первую.
  • 0
    Не понимаю почему так все набросились на Symfony2.
    Мне он очень даже понравился. Своей гибкостью.
    Это только сначала все кажется трудным и запутанным.
    Когда приходит понимание — все делается довольно быстро.
    Не вижу причин не использовать его для стартапов.
  • 0
    Попробовал сделать все, как в примерах… Произошел затык на этапе создания таблиц, выдает ошибку:

    [Symfony\Component\Config\Definition\Exception\InvalidTypeException]
    Invalid type for path "security.firewalls.pattern". Expected array, but got string


    буду благодарен за помощь. Сам я раньще вообще не связывался с фреимворками, решил попробовать поработать с Symfony 2. Пока темный лес…
    • –1
      • 0
        по ссылке пустой форум с 1 сообщением :(
        • 0
          Будьте первым.
  • 0
    Скажите, а зачем в «В app/config/config.yml удаляем auto_mapping»
    Я сам только что перешёл с первых версий Symfony и Doctrine на вторые и ещё не до конца разобрался, как работает mapping, но, насколько я понял, во-первых, и с auto_mapping всё работает, а во-вторых, если его убрать, придётся всё время помнить, что надо прописать маппинги при добавлении новых бандлов.
    Или я не прав?
    • 0
      Запоздал я с ответом, но ладно. Так, вроде, было в ранних версиях FOS User бандла, сейчас уже можно оставить auto_mapping.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.