Обновление от Августа 2016: перевод документации Symfony 2 на русский опубликован в виде бесплатной книги на сайте Leanpub. Узнать подробности.
А вот и вы, мой герой ) Ну кто бы мог подумать, что вы все еще будете с нами после первых трех частей ) Однако же, ваши усилия скоро будут щедро вознаграждены. В этой части мы коснемся пожалуй самой мощной функции Symfony – системы пакетов (bundles).
- Symfony 2.0 – быстрый тур – общая картинка (часть 1)
- Symfony 2.0 – быстрый тур – вид/the view (часть 2)
- Symfony 2.0 – быстрый тур – контроллер/the controller (часть 3)
- Symfony 2.0 – быстрый тур – архитектура/the architecture (часть 5)
Система пакетов / The Bundle System
Пакеты в Symfony можно сравнить с модулями расширений (плагинами) в прочем программном обеспечении. Но почему же тогда мы кошку называем кошкой пакет называем пакетом а не плагином? А потому что в Symfony все есть пакет: начиная от ядра фремворка и заканчивая кодом, который вы пишите для своего приложения. Пакеты – это граждане первейшего сорта. Они дают вам гибкость в использовании возможностей сторонних пакетов или же распространении своих собственных пакетов. Т.о. вы можете легко выбирать какие возможности будут доступны вашему приложению и оптимизировать его требуемым вам способом.
Приложение состоит из пакетов, определенных в методе registerBundles()
класса HelloKernel
:
# hello/HelloKernel.php public function registerBundles() { return array( new SymfonyFoundationBundleKernelBundle(), new SymfonyFrameworkWebBundleBundle(), new SymfonyFrameworkDoctrineBundleBundle(), new SymfonyFrameworkSwiftmailerBundleBundle(), new SymfonyFrameworkZendBundleBundle(), new ApplicationHelloBundleBundle(), ); }
Обратите внимание, что наряду с HelloBundle
, ядро подключает KernelBundle
, WebBundle
, DoctrineBundle
, SwiftmailerBundle
и ZendBundle
. Все эти пакеты являются частью ядра фреймворка.
Каждый пакет может быть настроен через конфигурационные файлы, написанные на YAML или XML. Давайте взглянем на конфигурацию по-умолчанию:
# hello/config/config.yml kernel.config: ~ web.web: ~ web.templating: ~
Каждый параметр, например kernel.config определяет конфигурацию пакета. Некоторые пакеты могут иметь много настроек если вы используете много возможностей, например WebBundle
имеет две настройки: web.web
и web.templating
.
Каждое окружение может переопределять конфигурацию по-умолчанию через отдельные конфигурационные файлы:
# hello/config/config_dev.yml imports: - { resource: config.yml } web.debug: exception: %kernel.debug% toolbar: %kernel.debug% zend.logger: priority: info path: %kernel.root_dir%/logs/%kernel.environment%.log
Теперь вы знаете как подключать пакеты и как конфигурировать их. Давайте теперь посмотрим что для нас могут сделать встроенные пакеты.
Пользователь / The User
Не смотря на то что протокол HTTP не сохраняет состояния между запросами, Symfony предоставляет отличный объект user, который представляет клиента (будь то реальный человек через интернет-обозреватель, бот или же вебсервис). Между двумя запросами Symfony сохраняет атрибуты в cookie с использованием нативных сессий PHP.
Эта возможность предоставляется WebBundle
и может быть подключена при помощи следующей строки в config.yml
:
# hello/config/config.yml web:user: ~
Сохранение и получение информации о пользователе осуществляется следующим образом:
// store an attribute for reuse during a later user request $this->getUser()->setAttribute('foo', 'bar'); // in another controller for another request $this->getUser()->getAttribute('foo'); // get/set the user culture $this->getUser()->setCulture('fr');
Вы также можете хранить небольшие сообщения, которые будут доступны только для следующего запроса:
$this->getUser()->setFlash('notice', 'Congratulations, your action succeeded!')
Работа с БД / Accessing the Database
Если ваш проект взаимодействует с базой данных тем или иным образом, вы свободны в выборе любого удобного вам инструмента. Вы можете использовать ORM, например Doctrine или Propel, если хотите высокого уровня абстракции от БД. Но в этой секции мы не будем усложнять примеры и воспользуемся Doctrine DBAL, который представляет собой “тонкий слой” поверх PDO, для подключения к базе данных.
Подключим DoctrineBundle и сконфигурируем наше подключение в config.yml:
# hello/config/config.yml doctrine.dbal: driver: PDOMySql # can be any of OCI8, PDOMsSql, PDOMySql, PDOOracle, PDOPgSql, or PDOSqlite dbname: your_db_name user: root password: your_password # or null if there is none
Вот и все. Теперь вы можете использовать объект соединения для взаимодействия с БД из любого действия:
public function showAction($id) { $stmt = $this->getDatabaseConnection()->execute('SELECT * FROM product WHERE id = ?', array($id)); if (!$product = $stmt->fetch()) { throw new NotFoundHttpException('The product does not exist.'); } return $this->render(...); }
Выражение $this->getDatabaseConnection()
возвращает объект, с которым можно работать как и с PDO.
Отправка email / Sending Emails
Отправить email в Symfony также просто как и щелкнуть пальцами. Во-первых, нужно подключить SwiftmailerBundle
и сконфигурировать его:
# hello/config/config.yml swift.mailer: transport: gmail # can be any of smtp, mail, sendmail, or gmail username: your_gmail_username password: your_gmail_password
После этого вы можете использовать мэйлер в любом действии:
public function indexAction($name) { // get the mailer first (mandatory to initialize Swift Mailer) $mailer = $this->getMailer(); $message = Swift_Message::newInstance() ->setSubject('Hello Email') ->setFrom('send@example.com') ->setTo('recipient@example.com') ->setBody($this->renderView('HelloBundle:Hello:email', array('name' => $name))) ; $mailer->send($message); return $this->render(...); }
Тело письма хранится в шаблоне, который рендерится при помощи метода renderView()
.
Последний рывок / Final Thoughts
В этой части мы рассмотрели основные особенности Symfony. Играйтесь с Symfony, разрабатывайте небольшие приложения и, когда почувствуете себя готовыми, завершите наш небольшой тур по Symfony чтением следующей части, где мы поговорим немного более подробно о том как Symfony работает и как его можно настроить под свои нужды.
Прочитал, на хабре еще, но вот как-то странно не могу всё целиком сложить.
Почему люди не пишут статьи по использованию фреймворков например на рабочей задачи, к примеру написать простенький каталог, вики систему или ленту новостей, попутно останавливаясь на том как и каким компонентом можно реализовать задачу?
Очень просто. Это превью-релиз. До релиза еще пол года, а то и больше. Берите сандбокс, берите пример symfony meets ajax и вперед… Сами же эти статьи и напишете ))
Прошло полгода, не дожидаясь релиза начал немного разбираться. После Rails часть вещей очень простая и прослеживается заимствование. Пока только с Doctrine не вник до конца, а там уже точно можно писать свои живые примеры 🙂
А я все по верхам (( силы воли не хватает
Задумался над примером реальной задачи.
http://symfony2bundles.org/project – есть проекты, есть бандлы.
Может посоветуете максимально простой(блог, лента новостей и т.д.) проект/бандл для ознакомления, что бы работа с БД была, пользователями, формами, валидация и т.д. И конечно архитектура/код должен быть на высок уровне.
Смотрел lichess в плане архитектуры все круто, но для начала хочется чего то попроще.
Спасибо!
Я посматриваю BlogBundle и FacebookBundle. Ребята советовали http://symfony2bundles.org/knplabs/symfony2bundles (собственно движок сайта). Еще не смотрел. В общем очень актуальный вопрос, чего-то работающего крайне мало все еще.
Спасибо, посмотрю на досуге.