in Профессиональное

Symfony 2.0 – быстрый тур – пакеты/the bundles (часть 4)

Обновление от Августа 2016: перевод документации Symfony 2 на русский опубликован в виде бесплатной книги на сайте Leanpub. Узнать подробности.

А вот и вы, мой герой ) Ну кто бы мог подумать, что вы все еще будете с нами после первых трех частей ) Однако же, ваши усилия скоро будут щедро вознаграждены. В этой части мы коснемся пожалуй самой мощной функции Symfony – системы пакетов (bundles).

Система пакетов / 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 работает и как его можно настроить под свои нужды.

Оригинал: http://symfony-reloaded.org/quick-tour-part-4

Write a Comment

Comment

ERROR: si-captcha.php plugin: GD image support not detected in PHP!

Contact your web host and ask them to enable GD image support for PHP.

ERROR: si-captcha.php plugin: imagepng function not detected in PHP!

Contact your web host and ask them to enable imagepng for PHP.

  1. Прочитал, на хабре еще, но вот как-то странно не могу всё целиком сложить.

    Почему люди не пишут статьи по использованию фреймворков например на рабочей задачи, к примеру написать простенький каталог, вики систему или ленту новостей, попутно останавливаясь на том как и каким компонентом можно реализовать задачу?

    • Очень просто. Это превью-релиз. До релиза еще пол года, а то и больше. Берите сандбокс, берите пример symfony meets ajax и вперед… Сами же эти статьи и напишете ))

      • Прошло полгода, не дожидаясь релиза начал немного разбираться. После Rails часть вещей очень простая и прослеживается заимствование. Пока только с Doctrine не вник до конца, а там уже точно можно писать свои живые примеры 🙂

  2. Задумался над примером реальной задачи.
    http://symfony2bundles.org/project – есть проекты, есть бандлы.
    Может посоветуете максимально простой(блог, лента новостей и т.д.) проект/бандл для ознакомления, что бы работа с БД была, пользователями, формами, валидация и т.д. И конечно архитектура/код должен быть на высок уровне.
    Смотрел lichess в плане архитектуры все круто, но для начала хочется чего то попроще.
    Спасибо!