SlideShare a Scribd company logo
1 of 27
Download to read offline
Symfony2. На чём можно
сэкономить время при разработке?

            Stepan Tanasiychuk
             ceo@stfalcon.com
### Нам проще переписать. Оно
глюкавое, тормозное, etc.

Это отмазки :)

Глюкавое — покрой тестами.
Тормозное — пройдись
профайлером, исправь и отправь
pull request.
Да, велосипеды это круто!
Но готовые решения —
      экономят время.
### SonataAdminBundle
<parameters>
  <parameter key="stfalcon_page.admin.page.class">
     StfalconBundlePageBundleAdminPageAdmin
  </parameter>
  <parameter key="stfalcon_page.admin.page.entity">
     StfalconBundlePageBundleEntityPage
  </parameter>
  <parameter key="stfalcon_page.admin.page.controller">
     SonataAdminBundle:CRUD
  </parameter>
</parameters>

<services>
   <service id="stfalcon_page.admin.page" class="%stfalcon_page.admin.page.class%">
      <tag name="sonata.admin" manager_type="orm" group="Pages" label="page"/>
      <argument />
      <argument>%stfalcon_page.admin.page.entity%</argument>
      <argument>%stfalcon_page.admin.page.controller%</argument>
   </service>
</services>
### SonataAdminBundle
class PageAdmin extends Admin {
   protected function configureListFields(ListMapper $listMapper) {
     return $listMapper
        ->addIdentifier('slug')
        ->add('title');
   }

    protected function configureFormFields(FormMapper $formMapper) {
      return $formMapper
         ->with('General')
            ->add('slug')
            ->add('title')
            ->add('text')
         ->end();
    }
}
### SonataAdminBundle
### SonataAdminBundle
class PageAdmin extends Admin {
   protected function configureListFields(ListMapper $listMapper) {
     return $listMapper
        ->addIdentifier('slug')
        ->add('title');
   }

    protected function configureFormFields(FormMapper $formMapper) {
      return $formMapper
         ->with('General')
            ->add('slug')
            ->add('title')
            ->add('text')
         ->end();
    }
}
### SonataAdminBundle
### SensioFrameworkExtraBundle
/**
 * @Route("/page/{slug}")
 * @Template()
 * @Cache(smaxage="15")
 */
public function showAction(Page $post)
{
    return array('page' => $page);
}
### JMSSecurityExtraBundle
/**
 * @Secure(roles="ROLE_USER, ROLE_ADMIN")
 */
public function secureAction()
{
    // ...
}
### AsseticBundle
# config.yml
assetic:
   use_controller: false
   filters:
       yui_css:
          jar: "%kernel.root_dir%/yuicompressor-2.4.6.jar"


{# layout.html.twig #}
{% stylesheets 'css/style.css' filter='yui_css' output="tmp/css/*.css" %}
        <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
{% endstylesheets %}
### StofDoctrineExtensionsBundle

* Tree
* Translatable
* Sluggable
* Timestampable
* Loggable
### StofDoctrineExtensionsBundle
/**
 * @ORMEntity
 */
class Page
{
    /**
     * @var DateTime $createdAt
     *
     * @ORMColumn(name="created_at", type="datetime")
     * @GedmoTimestampable(on="create")
     */
    private $createdAt;
### DoctrineFixturesBundle
class LoadPageData extends AbstractFixture {
   public function load($em) {
     $page = new Page();
     $page->setTitle('Contacts');
     $page->setSlug('contacts');
     $page->setText('ceo@stfalcon.com');
     $em->persist($page);
     $em->flush();
   }
}

$ php app/console doctrine:fixtures:load
### DoctrineMigrationsBundle
### А также:

* FOSUserBundle
* FOSCommentBundle
* KnpMenuBundle
* KnpPaginatorBundle
* AvalancheImagineBundle

и другие бандлы =>
### http://symfony2bundles.org
### http://symfohub.com/bundles
Тестирование
### Тесты не экономят время?

Сравните время на:
* Рефакторинг кода
* Внедрение новых фич
* Полную проверка функционала
перед каждым релизом
С тестами и без => тесты рулят!

ps. и используйте CI
### LiipFunctionalTestBundle

* Фикстуры
* Сахар (fetchContent, fetchCrawler,
getUrl, isSuccessful)
* HTML5
### BehatBundle & MinkBundle
# language: ru

Функционал: Первый тест для AcmeDemoBundle
 Тестируем реализованные возможности в
демонстрационном бандле

  Сценарий: Открыть главную страницу в dev окружении и
убедиться в ее существовании
   Допустим я на странице "/app_dev.php"
   Тогда код ответа сервера должен быть 200
   И я должен видеть "Congratulations! You have successfully
installed a new Symfony application."
   И я должен видеть "Welcome!"
Кодогенерация
### SensioGeneratorBundle

generate:bundle
generate:doctrine:crud
generate:doctrine:entities
generate:doctrine:entity
generate:doctrine:form
### Подведем итоги:

* Используйте готовые решения
(бандлы)
* Пишите тесты
* Генерируйте код

И получите профит :)
### Благодарю за внимание ;)


       Готов ответить на вопросы


Stepan Tanasiychuk
ceo@stfalcon.com
@stfalcon
http://github.com/stfalcon

More Related Content

What's hot

Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС2ГИС Технологии
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelOleg Poludnenko
 
Removing superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajaxRemoving superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajaxYury Glushkov
 
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.DrupalForumZP2012
 
Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Max Klymyshyn
 
Перевод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeПеревод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeInterSystems
 
Сергей Сыркин - CSS
Сергей Сыркин - CSSСергей Сыркин - CSS
Сергей Сыркин - CSSYandex
 
работа сайта
работа сайтаработа сайта
работа сайтаRinald Latupov
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
пабсаб презентейшн
пабсаб презентейшнпабсаб презентейшн
пабсаб презентейшнAlexey Osipenko
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressRuslan Begaliev
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобовLidiya Myalkina
 
Free TallyErp9
Free TallyErp9Free TallyErp9
Free TallyErp9Piyush
 

What's hot (20)

Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Yserver
YserverYserver
Yserver
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
 
Removing superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajaxRemoving superfluous page loads, or a few more words about popups and ajax
Removing superfluous page loads, or a few more words about popups and ajax
 
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах.
 
Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)
 
Перевод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeПеревод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в Unicode
 
Сергей Сыркин - CSS
Сергей Сыркин - CSSСергей Сыркин - CSS
Сергей Сыркин - CSS
 
Render API.
Render API.Render API.
Render API.
 
работа сайта
работа сайтаработа сайта
работа сайта
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
пабсаб презентейшн
пабсаб презентейшнпабсаб презентейшн
пабсаб презентейшн
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Миша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPressМиша Рудрастых: Введение в HTTP API WordPress
Миша Рудрастых: Введение в HTTP API WordPress
 
Cобачники против кинофобов
Cобачники против кинофобовCобачники против кинофобов
Cобачники против кинофобов
 
Free TallyErp9
Free TallyErp9Free TallyErp9
Free TallyErp9
 

Similar to Symfony2. На чем можно сэкономить время при разработке?

ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииPaul Klimov
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляцииPaul Klimov
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodePositive Hack Days
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''DneprCiklumEvents
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customersaheadWorks
 
Psgi app
Psgi appPsgi app
Psgi appund3f
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoMagecom Ukraine
 

Similar to Symfony2. На чем можно сэкономить время при разработке? (20)

ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляции
 
Problems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source CodeProblems of Automated Generation of Exploits on the Basis of Source Code
Problems of Automated Generation of Exploits on the Basis of Source Code
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Ci
CiCi
Ci
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customers
 
Psgi app
Psgi appPsgi app
Psgi app
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
course js day 4
course js day 4course js day 4
course js day 4
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 

Symfony2. На чем можно сэкономить время при разработке?

  • 1. Symfony2. На чём можно сэкономить время при разработке? Stepan Tanasiychuk ceo@stfalcon.com
  • 2. ### Нам проще переписать. Оно глюкавое, тормозное, etc. Это отмазки :) Глюкавое — покрой тестами. Тормозное — пройдись профайлером, исправь и отправь pull request.
  • 4. Но готовые решения — экономят время.
  • 5. ### SonataAdminBundle <parameters> <parameter key="stfalcon_page.admin.page.class"> StfalconBundlePageBundleAdminPageAdmin </parameter> <parameter key="stfalcon_page.admin.page.entity"> StfalconBundlePageBundleEntityPage </parameter> <parameter key="stfalcon_page.admin.page.controller"> SonataAdminBundle:CRUD </parameter> </parameters> <services> <service id="stfalcon_page.admin.page" class="%stfalcon_page.admin.page.class%"> <tag name="sonata.admin" manager_type="orm" group="Pages" label="page"/> <argument /> <argument>%stfalcon_page.admin.page.entity%</argument> <argument>%stfalcon_page.admin.page.controller%</argument> </service> </services>
  • 6. ### SonataAdminBundle class PageAdmin extends Admin { protected function configureListFields(ListMapper $listMapper) { return $listMapper ->addIdentifier('slug') ->add('title'); } protected function configureFormFields(FormMapper $formMapper) { return $formMapper ->with('General') ->add('slug') ->add('title') ->add('text') ->end(); } }
  • 8. ### SonataAdminBundle class PageAdmin extends Admin { protected function configureListFields(ListMapper $listMapper) { return $listMapper ->addIdentifier('slug') ->add('title'); } protected function configureFormFields(FormMapper $formMapper) { return $formMapper ->with('General') ->add('slug') ->add('title') ->add('text') ->end(); } }
  • 10. ### SensioFrameworkExtraBundle /** * @Route("/page/{slug}") * @Template() * @Cache(smaxage="15") */ public function showAction(Page $post) { return array('page' => $page); }
  • 11. ### JMSSecurityExtraBundle /** * @Secure(roles="ROLE_USER, ROLE_ADMIN") */ public function secureAction() { // ... }
  • 12. ### AsseticBundle # config.yml assetic: use_controller: false filters: yui_css: jar: "%kernel.root_dir%/yuicompressor-2.4.6.jar" {# layout.html.twig #} {% stylesheets 'css/style.css' filter='yui_css' output="tmp/css/*.css" %} <link rel="stylesheet" type="text/css" href="{{ asset_url }}" /> {% endstylesheets %}
  • 13. ### StofDoctrineExtensionsBundle * Tree * Translatable * Sluggable * Timestampable * Loggable
  • 14. ### StofDoctrineExtensionsBundle /** * @ORMEntity */ class Page { /** * @var DateTime $createdAt * * @ORMColumn(name="created_at", type="datetime") * @GedmoTimestampable(on="create") */ private $createdAt;
  • 15. ### DoctrineFixturesBundle class LoadPageData extends AbstractFixture { public function load($em) { $page = new Page(); $page->setTitle('Contacts'); $page->setSlug('contacts'); $page->setText('ceo@stfalcon.com'); $em->persist($page); $em->flush(); } } $ php app/console doctrine:fixtures:load
  • 17. ### А также: * FOSUserBundle * FOSCommentBundle * KnpMenuBundle * KnpPaginatorBundle * AvalancheImagineBundle и другие бандлы =>
  • 21. ### Тесты не экономят время? Сравните время на: * Рефакторинг кода * Внедрение новых фич * Полную проверка функционала перед каждым релизом С тестами и без => тесты рулят! ps. и используйте CI
  • 22. ### LiipFunctionalTestBundle * Фикстуры * Сахар (fetchContent, fetchCrawler, getUrl, isSuccessful) * HTML5
  • 23. ### BehatBundle & MinkBundle # language: ru Функционал: Первый тест для AcmeDemoBundle Тестируем реализованные возможности в демонстрационном бандле Сценарий: Открыть главную страницу в dev окружении и убедиться в ее существовании Допустим я на странице "/app_dev.php" Тогда код ответа сервера должен быть 200 И я должен видеть "Congratulations! You have successfully installed a new Symfony application." И я должен видеть "Welcome!"
  • 26. ### Подведем итоги: * Используйте готовые решения (бандлы) * Пишите тесты * Генерируйте код И получите профит :)
  • 27. ### Благодарю за внимание ;) Готов ответить на вопросы Stepan Tanasiychuk ceo@stfalcon.com @stfalcon http://github.com/stfalcon