 Hello everyone Good to see you have the room full. Thank you for coming Today or yesterday and is a special day because we have this vanity metric, you know 500,000 downloads for all symphony components. So that's a huge number. We're very happy to show that with you in a Drupal con Let's proceed it's the symphony track. So we're talking about symphony things in Drupal Okay, um, let's go Today we're gonna okay talk about Symphony inside Drupal because as you know Drupal 8 has symphony many symphony components Inside and uses them to do so many things and core things Quickly so my name is Nicolae Grecois. I'm from Paris Half Greek you may have wondered with my name I'm the Currently second contributor on symphony. So I have a lot of time Working at sensual apps to also hack and do things on symphony. So I'm very happy to work there I also work for blackfire and blackfire is a profiler. So If you want to know how you code behaves in terms of performance consuming resources memory things like that it's a nice tool for that and I worked on these slides and this presentation with Ryan Ryan weaver is the symphony documentation project leader. So really important guy for all new commerce to symphony and Advanced people because he owns the I mean owning he leads the documentation project and this is a huge task That's it for me Okay, so We're going to talk a bit about the fundamentals of every framework Not anymore except Drupal. So now Drupal has the same kind of you know life cycle web request handling than almost all current frameworks So that's the kind of code you used to write with Drupal 7 So some convention a naming function Like you had to do to make it work in Drupal and what that was magic and working fine So that's not the kind the kind of things you do anymore In symphony in Sylex now you have roots controllers request Responses and a service container. So we are going to talk about all of them in this presentation And of course now it's also a Drupal 8 thing. So all of this concept applied to Drupal 8 Sylex who knows Sylex Okay, great So Sylex is a micro framework a micro framework is something that works in a single file So as you can see, this is a single script with the requiring requiring the auto loader first line And then we have the Sylex application at our disposal and we can program a route and the controller. So This is amazing Then to run this you may use Enginix or a pitchy. So who is doing this daily for development using a pitchy or Enginix Okay So and who uses that PHP dash s Okay, so It's a developer's best friend. So you just need to know about let me talk a little bit about that so PHP comes with this PHP server embedded and You start it in the folder where you are the current moment on the command line And this just opens web server that listens on the local host on some port you have to provide it So a thousand in this case and it's really the quick and not that dirty quick and dirty quick and development way to You know start an application It looks for the index of PHP file in the current folder and that's it That's enough to boot a full application and it works with Drupal Which means that if you're in the Drupal folder You just start PHP dash s local host and you don't have to configure any virtual host any Web server or you know or there's something that can be complicated to configure and to get right Just start that in the folder where you are and open the web browser to this year and it should work So that's the kind of experience you have with that. So and that's running the script on the silence application So in this case, so we PHP dash s local host 2001 and then It's listening weapon this URL on the browser and we get the feedback from the application So it's a really a trainers also best friend because when we have I do a few trainings and sometimes when okay It's complicated to have everyone on board with the same setup and PHP dash s is really the common way And I use it almost every day to just hack on something and try it quickly Let's see the general workflow of the request response of that framework deal with so The request comes from the browser usually or some client web client Then the routing maps and reads the URL really to map it to some controller So the controller is the actual function and the code that should be run for this route that the router matched and then the controllers is responsible for Returning a response. So creating a response and give that back to the browser so that's typical workflow and we're going to see this slide a few times again because It's really the core the hot bath of every framework nowadays So back to this this is the roots. So Silux comes with a router embedded and this is the route so slash hello slash name So name is a wild card. We give it just a name When the URL matches it the function should be called so With a parameter so the router looks for this bracket name and gives it to The control release so this function as an argument and then the code is run and that's it We have our response our hello world silux application and basically This is the kind of things or also that Drupal does internally catching the request getting it creating a request object dealing with life cycles so Routing with the router. So it's symphony router. It's not the silux router, but anyway Calling the action so the controller class and providing a response HTML usually json if you do APIs things like that Okay, so let's try with symphony Who knows drush everyone? Okay, of course Who knows Drupal console? Okay, so it's Drupal 8 way of doing drush like comments In symphony we have the kind of same kind of console and the Drupal console is Using the symphony console components to build the experience and the subcommons things and all of that and Symphony is doing exactly the same to build the symphony Installer so the symphony installer is just some glue some helper To download the code so the code is on github and the helper is Because this installer is a common line that downloads the code for you checks that everything is okay in terms of php version extension Things like that and it really makes the installation process Easier even though you don't really need it technically to have a symphony application working so You could use it to create a new project so symphony new my dear name so my project really and this downloads the symphony application and Show you some you know nice A greeting a welcoming message to onboard people easily If you look at the downloaded code you'll see this kind of directory structure, so the app folder is where All the configuration and templates and not code related Files are so config.yaml twig files all of that Then this other very important folder is the SRC so the source folder and this is where you put your classes Just following, you know the psr4 psr0 naming convention So the class app bundle is in the app bundle namespace and this maps to the directory structures And so we have directory for namespaces and file for the class the last part of the class name So this comes empty, of course, except maybe with the app bundle which is the you know the module file in in symphony Then you have okay the test folder. It's up to you to fill it and the var folder where we put cache information generated files Logs and things like that so technical things that are managed by symphony itself usually and We have the vendor Directory which is for libraries third-party code. You have the same in Drupal 8 so you will find the vendor directory in Drupal 8 and this is Created by Composer which is used to manage dependencies In symphony and in Drupal 8 and in I guess most PHP application not as who uses Composer Okay Drupal console symphony console When you install the application there is also the bin folder and in the bin folder you have a local script local PHP script So this is a PHP script and it runs From the command line so you can run the PHP dash s server and just using bin console server run This is just a helper wrapper around you know PHP dash s. I was talking about Previously so you could start PHP dash s with a few common options on the command line and do exactly the same This is just a helper But yet this is really helpful to you know you get into this folder your projects You start the server and you work on it. It's ready. Nothing else to configure on APG and Linux things like that and in the same with Drupal console with Drupal console You can say Drupal server. That's the name of the command on Drupal console And it boots just the PHP dash s server and you can hack on your Drupal installation and on broken models and Things like that everything you need to do really So that's the welcome page of the symphony Default installation application So dress was talking about you know welcoming people with and not that empty Application at the beginning so same for Drupal and next version of Drupal and not providing only empty pages so that so that people can Feel a bit more how it works and what they can do and that at least that it works So here we are. This is a welcoming page If you go to something some other URL so slash nothing flash to see slash here You'll get this kind of exception page This is just the page that is displayed when something went wrong Not in terms of symphony not working because this is symphony working on behind So this is an exception page and it means that symphony tool is working But there's no page here so that the you know error page for nothing there So, okay, that's basically what this means. Hello. I'm the Pac-Man ghost look Things are working. This page does not exist yet in symphony and in Drupal so Everything is hackable. So you you may you may have to you may find some fancy bundles and this is one I wanted to share with you So if you want to replace the ghost you can do that Surely code give exception bundle it takes a random bundle from a website random Okay, so now we installed symphony let's build a page And so the first thing one of the first thing you can do is Creating a route to the new page you want to add to your application. So to do that you print the routing YAML file and In Drupal model, it's called my model dot routing dot YAML and the content is the same So the content is this kind of YAML who? Uses YAML Okay So, you know how it works. So the hello world is the name of the route path is the URL Pattern, you know, because we have the bracket name thing that is not exactly URL, but the placeholder for it And we have defaults and in defaults we define this underscore controller and a class name So the class name is the full Fully qualified class name and the method that should be called whenever this route Is hit buzz by an HTTP client? The route has a name hello world Because we use is we use routes both to match from the browser from browser to the controller and we use this also this we use also this Configuration to generate URLs. So you can set to the URL generator give me the full a URL for the hello world Routes with the name Nicholas and you will get HTTP slash localhost slash my application slash hello slash Nicholas, so That's why roads have names On the controller side We have this function This kind of code. So this is really plain PHP code as you can see there's no No much dependencies. So we have just plain class no extend no Implementation of an interface and a public function say hello action for the name and That's the job of a controller returning a response Saying in this case hello name This class the response class is the same that Drupal hate Drupal 8 uses inside so you can do exactly the same in your own controllers returning a new response And you will take control of the full page if you do that. So if you return, you know the sharp markup array and Sharp markup with the value with HTML content this one in Drupal will be included Inside the default layout so you will have the Drupal layout and in your block You will have the output of your controller, but if you return a response You will take control of the full page from the beginning HTML tag to the end HTML tag And you can do whatever you do there even return non-h not HTML content. So Here we are It works So back to this That's the same exactly the same workflow life cycle that we did with Sylex But now we just did it with symphony and also Drupal 8 because it's exactly the same. So the request came in Broting did a job to map it to the controller the controller created the response and the response was sent back to the browser What about the debugging experience, you know, it's something really important in terms of you know Doing with dealing with code and having things working and all the time is not the case and we are used to you know Have things not working yet and to we need to be able to reflect the state of the application and to Get insights on what happens on how this application is configured So with the symphony we have the debug rotor Command on the console application and this displays all the routes that are Available for this application for the current state of the application So as you can see the last line there is our hello world wrote with a slash hello slash name path It matches all The method so HTTP method get post put delete so we could have restriction there all scams HTTPS or not and All host because you could have different controllers based on the on the host the local host also so on and you have also all the underscore profiler routes Which are just the routes that are required to make this Work so at the bottom of the screen. It's the web profiler toolbar You have exactly the same. It's white and not black. Okay with the devil devil model in Drupal 8 and So you have to and you should in fact if you not doing it already so install the devil model and Install also the in enable it the web profiler model and this will provide you exactly the same experience having Everything at hand in the bottom of the screen. So as you can see the total Generation time so 87 milliseconds for and something megabytes and a few other information. So for example It's a bit cut there, but we have a 200 Which is the response code HTTP response code then the controller. So we know that's okay That's not unexpected, but it's our say hello action and the polite controller The controller class root name. Do we have a session? Yes or no? We also have you know Security tokens security authentication authorization so we can check there Who we are for the application and we can see if did we log in to get this page is the application Knowing us. So in this case, we have a session and we are some anonymous user browsing the application If you click on anything on the toolbar, you'll get this profiler Pages so underscore profiler if you remember the roads and the previous screen So this will show you for the current request the one that was just displayed before The render time the number of template calls of block calls The details on the renderer templates. So in this case we have these four Twig files that were, you know loaded past the renderer and you can click on the other tab and to get a request response details performance log so all the logs can be consulted from this The event routing security twig. So this is for example the view for the profiler panel it's a really an Interesting view when you want to understand and to figure out what happened during this page rendering because you know sometimes it's a bit magic to Have a response and you know that Drupal did things, but you don't know what and in this case You can just look at this and have a quick overview what happened. So what happened there at the beginning there was some Section it's a black section. So it's kernel.request and in fact, that's an event. I will talk about that later So it's Drupal and Symphony work with events So this is the first event that is triggered when a request comes in There is an event that is dispatched and it's called kernel.request and this does call some listeners So as you can see in blue, we have several listeners That did something on the request So we have the debug hunglers, the dump listener, the session listener, the fragment listener, the router listener As you can see this one did most of the job looking at the time it took So that's really the listener executing the router Reading the URL and figuring out Which methods and which class should be executed for this particular route slash hello slash name Then the firewall and the local listener, the listener, the translator So security also is hooked on the kernel.request event And so on so we have the kernel controller and you can okay understand and get an overview That's really helpful not looking at the number because performance This is maybe not the best tool to deal with performance, but just to understand things better Okay, can we do even less work just back to our route and our control definition In symphony because you can use annotation to define routes. So instead of Creating this routing.tml file in symphony You can put configuration and code at the same place using this at route Annotation and using okay the slash the path in fact as first argument on this annotation And this is configuration and this is really useful because you know you have everything in one place and You know just by looking at the single file that the say hello action is mapped on the slash hello slash path name URL next topic services and the container So services services Drupal 8 symphony Have a container and the container holds services services are you know useful objects That do things so not all objects in your application are or should be services Only some of them are services So we are talking about a plain PHP object. So you create a new instance of my thing So anything it could be the URL generator the routing it could be twig it could be so Anything you have in Drupal is a service and services are Object that do things which means that they process Content, but they do not change state which means that you can call them twice Three times four times any time you want and you will get the same results at each time Which is very different from an object that can mutate state for some if you have some painter So an object that paints Some drawing then you can have a set background method on it And if you use that as a service it would be mistake because you could have some first part in your application saying set background red and Then the other part of the application using that but red background whether when they may expect it to be white at the beginning when they start drawing the The painting so services object that only do things and on the other side you have Data objects and data object is the opposite of services data objects are You know Date time so things that have almost no method on them But that they just hold some value and collection of values of properties and they can mutate and they can just hold the state and by splitting your application in you know services on one hand on Data object on the one. It's a really good design pattern and best practice to have clear and clean a code them splitting them So now the container so the container is logically some associative array that hold That holds the services Which means that services are object actually PHP instances and We give them just a nickname so they have an identity and the identity is this nickname so logger in this case It's a string Logger is the string the nickname of the logger object So at some point at some bootstrapping step in Drupal 8 or symphony We created a new logger. We don't know how but that's not our business so there is a logger and Drupal knows how to Instantiate it and this object that it created this new logger Has been stored in the container under the logger You know nicknames or key in the array. Okay, so really this is not an array, of course This is just a logical and technically the container is an object so the object has a method which is Almost the only one yet that you should use which is get so container get logger Which means give me the logger, please Okay, and then you get the logger So in silence there is a container which is not the symphony dependency injection container But which is called pimple which is another project Then in symphony and in Drupal 8 there is the dependency injection component from symphony that is used And he if you have it at hand You can get any service from it. So It's yes really preloaded with many useful features really And on symphony we have being console debug container This shows a map an array table really of all the services that are defined in the application In Drupal console, it's just Drupal container debug and we'll get the same output or almost the same In symphony we have two hundred and twenty built-in services, maybe more it changes a lot In Drupal, I think you have way more So if you want to dig and inspect one specific service You can I give it name the name of the service you want to Get more more therefore and get the details. So in this case we have We are displaying the service configuration for the twig service. So the service ID its nickname is twig the Class of the object is twig environment. So that's the actual PHP class of the twig service The tags is something we're going to talk about in the next talk in the afternoon Is it public or not? So can you fetch it by using get or not? Private services can't be fetched from the container Synthetic, lazy, shared, abstract, auto-wired and things like that. We'll see that in the dependency injection talk in the afternoon Okay, now we know that there is a container somewhere. How Do I get it in my own code because I want the features In symphony there is Property on controllers and if our polite controller extends from some base controller that is provided by symphony framework Then you get a property protected one. So from the parent class that is called Container and that contains the container. So you can use it to you know get twig and This is also a working example. So in this case, we are making our control better and using twig for rendering HTML around our hello message So we say container give me the twig service and we know by looking at the twig template class That there is all the documentation really that there is a render method there and the first argument is a twig File so that's the template and the second argument is the associative array of variables and values that should be you know used to replace the placeholders in the twig file and then we return the New response with the html. We just generated this way. Okay, but the same kind of things Drupal does internally when using twig You know to render things and blocks and things like that That's the kind of twig file You can use and So my name placeholder replaced with the Name from the URL There is no, you know security issue there because twig auto escapes the content So whenever there is some, you know Tricky name with html content there. This won't be displayed as html. It would be just escaped with the proper Cross-size scripting for So back to this We have the request routing the controller and now the controller is really you place to bootstrap and to wire So which mean using all the services you need to just build this page So you have a controller in the controller You have the container and the container has all the features that Drupal 8 provides that symphony provides So we just saw that we were using twig you can use the URL generator You can use the container factory in Drupal 8 to fetch, you know Default or user configured Values from the admin and this administration page on Drupal 8 and Use that to just craft your html and render the response and get back to the browser Okay, so the question is what else does symphony do or what else does Drupal 8 do The answer is not the question should be what lives in the symphony container What lives in the Drupal 8 container because this is really where features are the containers Some it should be something quite abstract, but yet it has a registry of features So some examples the doctrine or M We use it a lot in symphony. So we can get the entity manager from the container it's ready most of the time so doctrine.orm.entity manager and This will provide you the entity manager and you can get a repository for it and you know use that repository to fetch your entities and Persist modify your blog post and flush to you know save and update the database there You can use it also to get the database connection. So container give me the database connection and then we're going raw SQL requests with the connection in Drupal The same service is just called database. So it's not database connection. It's just database and there are a few differences like that Another service a more complex one we won't get into the details there There is a powerful yet complex form system in symphony. So Everything starts with a form factory service and with this form factory We create you know fields email username gender with a choice male female If the form is able to handle the request has been submitted and the data is valid Then we get the data we save it we update our entities so on so on and then at the end we can render You know the tweak templates which can display the form and there are some form helpers So in this case form start for the you know html form start tag from and and some helpers to render the Input tax and the labels and all the different fancy things to generate forms You can also of course do everything yourself So you are the request at hand and you can get the email from the request get the username for the request gender and Do anything one of that so with community vendors and with community so basically a model in Drupal 8 a bundle in symphony is just a way to you know define new services so models provide services and also create a few controllers a few roads That's basically what a model is what a bundle is you know services features and Routes which mean pages a few pages to a You know UX UI to So how do you create now your own services because that's what models do and that's what you Also should may have to do at some point So let's do this exercise So let's say we want to create some random greeting Feature so this one should be able to say hello or hey you or hola or ketal or anything else you want So that's that's the specification So where should we put this logic, you know selecting a random greeting sentence? Put it in the controller or put it, you know in some business logic class So it can be reused or flat function, but maybe not And let's do it In the decoupled way, so let's create a class whose responsibility should be just to you know randomly greet Some name so here is the class So we have a list of greetings that it knows about and then we have a function there and which Returns a string which is hola John or hello John or Get blame. I knew it was John So any greeting really so and then the content is really is easy around to get a random value there and Concatenate the name with the sentence business logic really The way to use that in your controller could be this one So in the controller you instantiate a new greeter and you get a random greeting from it You use twig or the templating service, which is the same in to generate the HTML and so That's it and you get the greeting and you displayed the page Next step now, let's say we'd like to log Which greeting was chosen so we displayed it And we want to log file with all the greetings that were generated over time How do we do that? We have a logger at hand in Drupal It's called logger dot factory and on the factory you have a get method Where you specify and it's your job to tell I want to log to the database and there is logger get database Way to get a real logger something which on which you can call the info of the log method to you know Put messages in the database in this case So in symphony, we just have a logger and the logger is configured somewhere else and the logger provides You know a PSL log log interface, which is a standard way to log messages in PHP and not only Drupal not only symphony really and Let's use it so We ask to the container Give me the logger and log this info message. We created the greeting greeting, okay? so we just use the container in Drupal in symphony to You know get the service and get the feature and log things in Drupal 8 You don't have a property like that. So in Drupal 8 if you want the container You have several ways one and the most low level if you can if you can say that is to Implement it's a container injection interface. So it's a special core interface So you implement this interface and implement it it means creating a public static function That is called create and then this one will be called with the container so the actual you object and in So it's a factory and you can return a new instance of our controller there with everything injected in the constructor I don't have an example. I Can show you later Okay, so now our controller is doing Logging but what if we'd like to have the random gritter itself log Maybe it's not the be the control business to you know log things Maybe we'd like the random gritter to log what it did. So how do you do that? So just copy-pasting the line we used in the controller This is taking the disk container get line and creating, you know, this info message Of course, this won't work because there's no container. This is a plain PHP class. There's no context There's no parent. There's no container property. So of course it won't work. So the way to do that is To use dependency injection so We add a constructor on our random gritter and in the constructor we Require a logger Argument and we store that logger into the property Okay, and that's it now We know and it's not our job there in this class to know how to instantiate this But we know that by contract by definition of this class. We need a logger so then Okay, if you want to be a bit more strict you can add the interface on the construct method so that you are sure that Someone no one will provide you with an array or with some, you know, request response any object that is not a logger So in this case now we are sure That we have a logger a real one that we know how to use and in back in our Controller We can know not back in the random return. We can just use this logger and Info because we have the logger at and now we have the property And then in the controller now we can just instantiate our greater and providing the You know symphony logger as a constructor and everything is, you know wired now and it works Basically Okay, so this is dependency injection. We just injected the the the logger dependency into the random gritter Now you can also tell symphony and Drupal 8 To do this job, you know creating the services injecting a logger there by providing it with recipes so This is a recipe for instantiating. Let's say my random gritter service So this is in service YAML file in app config and in Drupal 8 you'll find it in the You know my module dot service dot YAML file, which you know is there's just the Drupal way to Drupal place to put this Configuration so this configuration creates a new service my random gritter and it says to the container builder that this is This object this service is an instance of the app bundle greater great random gritter class So that the fully qualified class name of our random gritter and it takes one argument which is With a hat symbol which is the logger service that the containers the container knows about already Because of previous definition that we loaded and Drupal and symphony added there So that's enough for the container to create and to generate the code To create do by itself the new random gritter and give it the logger as arguments So if we use the console there, we can see that it worked and it gives us reflection in debug information So our service ID class tax cop container. That's something that doesn't exist anymore. Anyway And this is the way to use it so in comments the old way and now The new way is to call this container get my random gritter Which basically does exactly what the commented lines do but now it's the containers job to instantiate and do the wiring and Then we have our gritter and we can use it as a feature, you know service to randomly great someone Okay in the talk in the afternoon. I'll Show you many ways to you know Configure in sensation. So the previous Slide this one is just a simple one and there are so many ways to add Definition recipes for instantiating things So you can learn more in the afternoon about that Okay, now another topic events So events is really As you saw it's the first thing that happens in the symphony in Drupal life cycle So kernel dot request there are more events It's the hook system really in Drupal 8. So we have evidence hooks in the same So events Provide you a way to say hey when this event happened so cannot request If they execute this function, whatever it is. So let's do one Some events when the request comes so we saw that there is a kernel that request events then On the kernel that's requests. We saw that there is a listener there the routing listener. So this one is doing routing then We have the kernel that controller event which is triggered to resolve the controller Then the controller triggered which uses containers the container services When the controller is done There is the kernel dot view event that is triggered. We just Next let's slice are about the content of view when the response is ready we trigger the kernel dot response event and That's it for the main it are more but that the main event So you have the possibility to hook on each of them To do things at the beginning of the request at the end of the request at any time you need to So for example, what if The controller didn't return a response Let's write so Let's return an array. So let's say this array returns a template and variables so What will happen there? You will get the okay This is the actual error message you can see so the controller must return a response Or it fails you blew it Actually, you can do things with a return value of the controller and you can hook on the kernel of view event and You can have a listener that can you know listen for the return value of the controller and say, okay? I know how to deal with that array And I know I know how to build a response from it. So At the bottom of the screen we have this public static function get subscribed events And this is what is required by the interface on the top. So the event subscriber interface So this is the first step to wire an event listener even subscriber in Drupal 8 and in symphony So returning an array which maps, you know kernel dot view and a method there Which means just basically when the kernel dot view event is fired Please call the on view method on this very class Okay, so now okay, we have the on view event that is not yet wired because we have some definition To tell Drupal 8 and symphony that this should be registered in the container, but let's continue So how do we register that? Let's create a listener give it a name around the array view listener it's a class of Just the class created and it takes a twig The twig service as argument why that's because we know that our array is going to be rendered by twig So we need twig there to turn the array into an actual response using twig and what's missing there is this configuration So by adding a tag in this case the event subscriber tag you're just basically telling the container This is an event subscriber and you should give it to the event dispatcher service Which is something that already exists in Drupal 8 and in symphony And the container at bootstrapping stage will say will tell okay please give me all the definition that have this tag and Wire them in the event dispatcher so that the event dispatcher knows About them and can fire the listeners and the subscribers there, okay So doing so you can create the on view method. So We won't get into the details, but basically this is checking that this is the Result from the controller is the array. We are needing there And if yes, we could we get the template the variables we re we create render on the twig Service and we return a response there. So basically we just you know turned the array into an html response Doing it our way Okay, let's build something Building something is okay nice when you have already a skeleton something that you can look at and that's what symphony provides So we have a symphony demo Application so you can create a demo application using just symphony demo if you have installed at hand so this will download the code and Create this kind of directory structure so Abundant you know with common controllers that are fixed true because there is some model there It's a blog application entities for blog post comments event listener We just thought about them forms repository for you know set of that as twig and some interesting so It shows a lot many features of basic symphony application, but not that basic at all really and this is a kind of view you will get so This is the login page for the back end and there is a show source code so you can keep reading the code in the Demo application I'm almost done. So a few tricks And this may be the most important one Use PHP storm. I'm not PHP storm a researcher Yet, it's really great It provides if you enable the symphony plugin It will provide you with you know auto completion auto discovery for so many things It knows how services are defined so it's able to you know if you do container Get and it will provide you an auto completion for the list of existing services And if you select twig it knows by looking at the you know all the configuration there that this twig service has a render method So it's so helpful You don't have to you know, browse the code to figure out how it's Coded there There is this URL which provides a few introduction You know tutorial to Have more details on how to use that Okay, so summary use Salex of two servers use Salex to do simple applications really surely easy Use the plate Use Salex and Drupal 8 and symphony all together you can What did we saw in this talk? So What was all that about So terms to repeat in your head route controller response That's the life cycle we have services and services are provided by the container and we have evidence and listeners Listening for them. That's really the core of you know, Drupal 8 and symphony What symphony and Drupal 8 share they share the request and the response objects Which mean also the definition the class that's exactly the same code For roots controller response same again So same router same response and the control system is the same the event listener system is the same So this is the event dispatcher from symphony the dependency injection Component is used for container and so the definition of services is the same really The list of services so you can have the console and call debug container or container debug in Drupal Same thing for roots. So root or debug and the web debug toolbar is also Drupal 18 If you enable the devil and the web profile of models, which you should if you're developing and doing things like we just try to do Okay, you can use silence to learn Drupal. You can use Salex to use a tool on symphony. You can use symphony to learn Drupal. You can use. Okay. No and Finally we have More tools to solve problems. That's the point. Thank you You know if we have time for question almost no if you have a question yeah, and No, they don't need to in fact the container is able to you know Instance yet the container when you need it. Yes, it's lazy loading. Yeah, just use This subset and the container will instantiate this subset only. That's it. That's lazy loading. Yeah Okay, thank you You