Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Drupal8 for Symfony Developers

359 views

Published on

Drupal8 modernization (new object-oriented base) and adoption of many Symfony components is a huge step in connecting these two amazing communities and amazing projects. Drupal8 is not powered by full-stack Symfony and there is still many differences between these two relatives, but still, Symfony developers should master it easily. This talk is for Symfony developers who don't have experience with Drupal8. It will guide you through routing, controllers, hooks, events, Drupal Console, DI and many other interesting elements that power Drupal8 under the hood. It will also show how to build custom modules Symfony way.

Published in: Software
  • Be the first to comment

Drupal8 for Symfony Developers

  1. 1. Drupal8 for Symfony Developers Antonio Perić-Mažar
 17.02.2017 @ #phpuk
  2. 2. @antonioperic About me • Antonio Perić-Mažar, mag. ing. comp. • CEO, Co-Founder @ Locastic • Co-Founder @ Shift Conference • Software developer, Symfony2 • Open Source Contributor • SFUGCRO
 • www.locastic.com • antonio@locastic.com • @antonioperic
  3. 3. @antonioperic Locastic • We help clients create amazing web and mobile apps (since 2011) • design and development agency • mobile development • web development • UX/UI • Training and Consulting • Shift Conference, Symfony Croatia • www.locastic.com • @locastic
  4. 4. @antonioperic Inside Locastic
  5. 5. @antonioperic Almost 25% of our team are women
  6. 6. @antonioperic Questions? • Any Drupal experts/developers here? • Symfony developers? • Symfony developers without Drupal knowledge
  7. 7. @antonioperic Drupal 101 for SF developers
  8. 8. @antonioperic Before we start, small disclaimer
  9. 9. @antonioperic My world is Symfony (still)
  10. 10. @antonioperic ♥
  11. 11. @antonioperic
  12. 12. @antonioperic What this means • Drupal8 doesn’t use full stack Symfony, it uses components (maybe in future) • Moving Drupal to modern stack • Building powerful CMS on top of Symfony components • Connecting two big communities • More learning for Drupal developers (OOP, Symfony, new concepts)
  13. 13. @antonioperic Who is it for? • Content strategist • Site Administrators • Content editors • “Build stuff without writing code” • Professional developers • Bespoke applications • “Make writing code easier”
  14. 14. @antonioperic In Drupal 8 there's three different types of knowledge that you're going to be using in order to work with it effectively.
  15. 15. @antonioperic
  16. 16. @antonioperic
  17. 17. @antonioperic
  18. 18. @antonioperic
  19. 19. @antonioperic Symfony2 Framework Bundle Symfony2 Bundles Symfony2 CMF Bundles Symfony2 Components Partnered Libs (twig, etc.) CMF Components Symfony fullstack Drupal 8 Distribution Drupal Core Modules Drupal Contrib Modules Drupal Core Libraries Symfony2 Components Partnered Libs (twig, etc.) Drupal Components
  20. 20. @antonioperic Symfony Components • ClassLoader • Console • CssSelector • DependencyInjection • EventDispatcher • HttpFoundation • HttpKernel • Process • Routing • Serializer • Translation • Validator • Yaml
  21. 21. @antonioperic • HTTP Kernel • Request / Response • Controllers • Event Dispatching • Listeners / Subscribers Dependencyinjectioncontainer
  22. 22. @antonioperic Development environment
  23. 23. @antonioperic Or just use your Symfony development environment • PHP built-in server • Vagrant • Docker • …
  24. 24. @antonioperic Tools
  25. 25. @antonioperic Drush • update core and contrib • download modules • enable modules • clear cache • update db • run cron • import config • export config • create user • change password • one time login • backup drupal • restore drupal • compile twig templates *Type “drush” to get full list - www.drushcommands.com
  26. 26. @antonioperic Drupal Console • update core and contrib • download modules • enable modules • clear cache • update db • run cron • import config • export config • generate console command • generate entity • generate content type • generate modules • run unit test *Type “drupal list” to get full list - drupalconsole.com/docs
  27. 27. @antonioperic Installation
  28. 28. @antonioperic How to install Drupal8 • Drush • drush dl drupal • Composer • Download zip file
  29. 29. @antonioperic Lets use composer • drupal/drupal. • This uses Drupal itself as a template for the new site. It is the simplest solution but lacks additional configuration that can be helpful.
 
 • drupal-composer/drupal-project. • This open source project acts as a kickstarter for Composer-based Drupal sites. It provides default configuration that otherwise needs to be added manually.
  30. 30. @antonioperic Let’s use composer
  31. 31. @antonioperic Let’s use composer composer create-project drupal/drupal
  32. 32. @antonioperic Let’s use composer composer require drupal/<modulename> for example: composer require drupal/token
  33. 33. @antonioperic Run in browser
  34. 34. @antonioperic Add some content
  35. 35. drupal create:nodes
  36. 36. @antonioperic We have content but something is missing
  37. 37. @antonioperic WebProfiler
  38. 38. @antonioperic composer require drupal/devel
  39. 39. @antonioperic Under the Hood
  40. 40. @antonioperic Request -> Response
  41. 41. @antonioperic Pipeline 1. After the controller returned a render array, the VIEW will be triggered by the HttpKernel, because the controller result is not a Response, but a render array. 2. MainContentViewSubscriber is subscribed to the VIEW event. It checks whether the controller result is an array, and if so, it guarantees to generate a Response. 3. Next, MainContentViewSubscriber checks whether the negotiated request format is supported: 1. Any format for which a main content renderer service exists (an implementation of MainContentRendererInterface is supported. 2. If the negotiated request format is not supported, a 406 JSON response is generated, which lists the supported formats in a machine-readable way (as per RFC 2616, section 10.4.7). 4. Otherwise, when the negotiated request format is supported, the corresponding main content renderer service is initialized. A response is generated by calling MainContentRendererInterface::renderResponse() on the service. That's it
  42. 42. @antonioperic Main Content Renderes HTML: HtmlRenderer (text/html) AJAX: AjaxRenderer (application/vnd.drupal-ajax) Dialog: DialogRenderer (application/vnd.drupal-dialog) Modal: ModalRenderer (application/vnd.drupal-modal)
  43. 43. @antonioperic Routing
  44. 44. @antonioperic Controllers
  45. 45. @antonioperic Services
  46. 46. @antonioperic Events / Listeners
  47. 47. @antonioperic
  48. 48. @antonioperic Registering event subscribers Here are the steps to register an event subscriber: Define a service in your module, tagged with 'event_subscriber' (see the Services topic for instructions). Define a class for your subscriber service that implements SymfonyComponentEventDispatcherEventSubscriberInterface In your class, the getSubscribedEvents method returns a list of the events this class is subscribed to, and which methods on the class should be called for each one. Example: public static function getSubscribedEvents() { // Subscribe to kernel terminate with priority 100. $events[KernelEvents::TERMINATE][] = array('onTerminate', 100); // Subscribe to kernel request with default priority of 0. $events[KernelEvents::REQUEST][] = array('onRequest'); return $events; }
  49. 49. @antonioperic Building Custom Module
 HelloPHPUK
  50. 50. @antonioperic Recap • Symfony components are main building tool for D8 • DIC is backbone of Drupal • DI for controllers is very easy • Events are replacing hooks • Building custom module is easy • Hardest thing is to start • This is just beginning there is a lot to learn about and from D8
  51. 51. @antonioperic Thank you! antonio@locastic.com @antonioperic www.locastic.com

×