The Twig Recipe
Unless you're building a pure API - and we will talk about returning JSON later in this tutorial - you're going to need to write some HTML. And... putting text or HTML in a controller like this is... ugly.
No worries! Symfony has great integration with an incredible template library called Twig. There's just one problem: our Symfony app is so small that Twig isn't even installed yet! Ah, but that's not really a problem... thanks to the recipe system.
Installing Twig
Head back to https://flex.symfony.com and search for "template". There it is! Apparently Symfony's recommended "template" library is something called twig-pack. Let's install it!
composer require template
This installs a few packages... and yea! 2 recipes! Let's see what they did:
git status
Checking out the Recipe Changes
Whoa, awesome. Okay: we expected changes to composer.json, composer.lock and symfony.lock. Everything else was done by those recipes.
What are Bundles?
Let's look at bundles.php first:
git diff config/bundles.php
Interesting: it added two lines. Go open that: config/bundles.php.
| // ... lines 1 - 2 | |
| return [ | |
| Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], | |
| Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], | |
| Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], | |
| Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], | |
| ]; |
A "bundle" is a Symfony plugin. Pretty commonly, when you want to add a new feature to your app, you'll install a bundle. And when you install a bundle, you need to enable it in your application. A long time ago, doing this was manual. But thanks to Symfony Flex, whenever you install a Symfony bundle, it automatically updates this to enable it for you. So... now that we've talked about this file, you'll probably never need to think about it again.
The templates/ Directory and Config
The recipe also added a templates/ directory. So if you were wondering where your templates are supposed to live... the recipe kinda answered that question! It also added a base.html.twig layout file that we'll talk about soon.
| <html> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>{% block title %}Welcome!{% endblock %}</title> | |
| {% block stylesheets %}{% endblock %} | |
| </head> | |
| <body> | |
| {% block body %}{% endblock %} | |
| {% block javascripts %}{% endblock %} | |
| </body> | |
| </html> |
So... apparently our templates are supposed to live in templates/. But why? I mean, is that path hardcoded deep in some core Twig file? Nope! It lives right in our code, thanks to a twig.yaml file that was created by the recipe. Let's check that out: config/packages/twig.yaml.
| twig: | |
| default_path: '%kernel.project_dir%/templates' |
We're going to talk more about these YAML files in another tutorial. But without understanding a lot about this file, it... already makes sense! This default_path config points to the templates/ directory. Want your templates to live somewhere else? Just change this and... done! You're in control.
By the way, don't worry about this weird %kernel.project_dir% syntax. We'll learn about that later. But basically, it's a fancy way to point to the root of our project.
The recipe also created one other twig.yaml file which is less important: config/packages/test/twig.yaml. This makes a tiny change to Twig inside your automated tests. The details don't really matter. The point is: we installed Twig and its recipe handled everything else. We are 100% ready to use it in our app. Let's do that next.
Hi guys there is best way to create controller with php bin/console make:controller and it ask you a name like PizzaController and it create a controller with a folder and file in template