Symfony2. Краткий обзор.

Валерий Рабиевский, веб-студия stfalcon.com



Краткий обзор

Решаемые фреймворком задачи

  • Автозагрузка классов
  • Роутинг
  • Сохранение данных (via Doctrine)
  • Безопасность
  • Формы
  • Валидация
  • Переводы
  • Шаблоны
  • Asset-менеджмент
  • Dependency Injection
  • Консольные задачи
  • Логирование
  • Кэширование

А почему
Symfony2?

Преимущества

  • Модульность
  • Система бандлов
  • DI-контейнер
  • ...

Преимущества

  • Модульность
  • Система бандлов
  • DI-контейнер
  • ...
  • Комьюнити

Сила комьюнити

1140+ бандлов с открытым исходным кодом

440+ контрибьюторов

Работа с консолью

Предназначение

  • Cron-задания и пакетная обработка данных
  • Генерация кода
  • Интерактивные утилиты настройки
  • Создание/очистка кэша
  • ...

Генерация бандла

              ./console generate:bundle
              Bundle namespace: Acme/Bundle/MyBundle
              Bundle name [AcmeMyBundle]:
              Target directory [/path/to/project/src]:
              Configuration format (yml, xml, php) [annotation]:
              Confirm automatic update of your Kernel [yes]?:
              Confirm automatic update of the Routing [yes]?:
           

Создание консольной команды

               src/
                  Bundle/
                      Acme/
                          Command/
                              MyCommand.php
           

Создание консольной команды

               use Symfony\Component\Console\Command\Command;
                
               class MyCommand extends Command {
                
                  protected function configure() {
                      $this
                          ->setName('my:test')
                          ->setDescription('My command');}}
           

Создание консольной команды

               protected function execute(
                  InputInterface $input,
                  OutputInterface $output)
               {
                  // the business logic goes here...
               }
           

+++

  • Валидация входных парараметров
  • Форматирование вывода
  • Система подсказок
  • Интерактивные диалоги (DialogHelper)
  • ...

Service Container

Пример класса

                   class NewsletterManager
                   {
                      protected $mailer;
                      public function setMailer(Mailer $mailer)
                      {
                          $this->mailer = $mailer;
                      }
                      /* ... */}
               

Конфигурирование

               # src/Acme/HelloBundle/Resources/config/services.yml
               services:
                  my_mailer:
                      # ...
                  newsletter_manager:
                      class:     NewsletterManager
                      calls:
                          - [ setMailer, [ @my_mailer ] ]
           

Использование

Где то в котроллере:

                $this->container->get('newsletter_manager ');
           

Doctrine

Doctrine: entities

                namespace Acme\StoreBundle\Entity;

                class Product
                {
                  protected $name;
                  protected $price;
                  protected $description;
                }
            

Doctrine: entities

                /**
                 * @ORM\Entity
                 * @ORM\Table(name="product")
                 */
                class Product
                { /* ... */ }
            

Doctrine: entities

                /**
                 * @ORM\Id
                 * @ORM\Column(type="integer")
                 * @ORM\GeneratedValue(strategy="AUTO")
                 */
                protected $id;
            

Doctrine: behaviors

                /**
                 * @ORM\PrePersist
                 */
                public function setCreatedValue()
                {
                    $this->created = new \DateTime();
                }
            

Doctrine: lifecycle events

  • preRemove
  • postRemove
  • prePersist
  • postPersist
  • preUpdate
  • postUpdate
  • postLoad

Doctrine: lifecycle callbacks

                /**
                 * @ORM\HasLifecycleCallbacks()
                 */
                class Product
                {
                  // ...
                }
            

Тестирование

Тестирование контроллера

                class HelloControllerTest extends WebTestCase {
                  public function testIndex() {
                      $client = $this->createClient();
                      $crawler = $client->request('GET', '/hello/Fabien');
                      $this->assertTrue(
                          $crawler->filter('html:contains("Hello Fabien"))
                              ->count()
                      );
            

Тестирование контроллера

                

Клиент делает запрос к Symfony2 приложению

$client = $this->createClient(); $client->request('GET', '/hello/Fabien');

Тестирование контроллера

                

Crawler парсит ответ

$crawler->filter('html:contains("Hello Fabien"))

и используется для навигации по странице

$link = $crawler->selectLink("Read more"); $client->click($link);

Тестирование контроллера

                

И, наконец-то, PHPUnit проверяет наш ответ

$this->assertEquals(10, $crawler->filter('.test')->count() ); $this->assertTrue( $client->getResponse()->isSuccessful() );

Тестирование консольных команд

                $input = new ArrayInput(array('name' => 'Hugo'));
                $input->setInteractive(false);
                $output = new StreamOutput();
                $command = new SayHelloCommand();
                $command->run($input, $output);
                $this->assertEquals('Your name is Hugo',
                  $output->getStream()
                );
            

Symfony2. Краткий обзор.

Валерий Рабиевский, веб-студия stfalcon.com