Download - Drupal8 for Symfony Developers
Drupal8 for Symfony Developers
Antonio Perić-Mažar17.02.2017 @ #phpuk
@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 • [email protected] • @antonioperic
@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
@antonioperic
Inside Locastic
@antonioperic
Almost 25% of our team are women
@antonioperic
Questions?• Any Drupal experts/developers here? • Symfony developers? • Symfony developers without Drupal knowledge
@antonioperic
Drupal 101 for SF developers
@antonioperic
Before we start, small disclaimer
@antonioperic
My world is Symfony (still)
@antonioperic
♥
@antonioperic
@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)
@antonioperic
Who is it for?
• Content strategist • Site Administrators • Content editors • “Build stuff without writing code”
• Professional developers • Bespoke applications • “Make writing code easier”
@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.
@antonioperic
@antonioperic
@antonioperic
@antonioperic
@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
@antonioperic
Symfony Components• ClassLoader • Console • CssSelector • DependencyInjection • EventDispatcher • HttpFoundation • HttpKernel
• Process • Routing • Serializer • Translation • Validator • Yaml
@antonioperic
• HTTP Kernel
• Request / Response
• Controllers
• Event Dispatching
• Listeners / Subscribers
Depe
nden
cy in
ject
ion
cont
aine
r
@antonioperic
Development environment
@antonioperic
Or just use your Symfony development environment• PHP built-in server • Vagrant • Docker • …
@antonioperic
Tools
@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
@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
@antonioperic
Installation
@antonioperic
How to install Drupal8• Drush
• drush dl drupal • Composer • Download zip file
@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.
@antonioperic
Let’s use composer
@antonioperic
Let’s use composer
composer create-project drupal/drupal
@antonioperic
Let’s use composercomposer require drupal/<modulename>
for example: composer require drupal/token
@antonioperic
Run in browser
@antonioperic
Add some content
drupal create:nodes
@antonioperic
We have content but something is missing
@antonioperic
WebProfiler
@antonioperic
composer require drupal/devel
@antonioperic
Under the Hood
@antonioperic
Request -> Response
@antonioperic
Pipeline1. 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
@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)
@antonioperic
Routing
@antonioperic
Controllers
@antonioperic
Services
@antonioperic
Events / Listeners
@antonioperic
@antonioperic
Registering event subscribersHere 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 \Symfony\Component\EventDispatcher\EventSubscriberInterface 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; }
@antonioperic
Building Custom ModuleHelloPHPUK
@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