Premiers pas avec Symfony 4

Symfony 4 est là. Il n'y a pas de meilleur moment pour commencer à apprendre. Allons-y.

Nous allons créer notre projet en utilisant le symfony/website-skeleton .

Ceci est une approximation proche de ce que vous pourriez avoir eu si vous avez installé Symfony Standard Edition dans Symfony 2 ou Symfony 3.

Ceci est différent du symfony/skeleton qui est plus minimal, et n'inclut pas des choses comme Twig, Doctrine, ou Monolog.

Si vous ne créez pas de site Web complet, vous créez peut-être une application console ou une API simple, vous devriez probablement commencer par ce skeleton .

Cependant, nous créons un site web, alors utilisons le website-skeleton comme point de départ:

composer create-project symfony/website-skeleton lets-explore-symfony-4

Installing symfony/website-skeleton (v4.0.3)
  - Installing symfony/website-skeleton (v4.0.3) Downloading: 100%         
Created project in lets-explore-symfony-4
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 88 installs, 0 updates, 0 removals
  - Installing ocramius/package-versions (1.2.0) Loading from cache
  - Installing symfony/flex (v1.0.61) Downloading: 100%         

Prefetching 9 packages
  - Connecting (100%)
  - Downloading (100%)

  - Installing doctrine/lexer (v1.0.1) Loading from cache
  - Installing doctrine/inflector (v1.3.0) Loading from cache
  - Installing doctrine/collections (v1.5.0) Loading from cache
  - Installing doctrine/cache (v1.7.1) Loading from cache
  - Installing doctrine/annotations (v1.6.0) Loading from cache
  - Installing doctrine/common (v2.8.1) Loading from cache
  - Installing symfony/polyfill-mbstring (v1.6.0) Loading from cache
  - Installing symfony/http-foundation (v4.0.3) Loading from cache
  - Installing symfony/yaml (v4.0.3) Loading from cache
  - Installing symfony/webpack-encore-pack (v1.0.2) Loading from cache
  - Installing psr/link (1.0.0) Loading from cache
  - Installing fig/link-util (1.0.0) Loading from cache
  - Installing symfony/web-link (v4.0.3) Loading from cache
  - Installing symfony/filesystem (v4.0.3) Loading from cache
  - Installing symfony/config (v4.0.3) Loading from cache
  - Installing symfony/http-kernel (v4.0.3) Loading from cache
  - Installing symfony/event-dispatcher (v4.0.3) Loading from cache
  - Installing psr/log (1.0.2) Loading from cache
  - Installing symfony/debug (v4.0.3) Loading from cache
  - Installing psr/container (1.0.0) Loading from cache
  - Installing symfony/dependency-injection (v4.0.3) Loading from cache
  - Installing egulias/email-validator (2.1.3) Loading from cache
  - Installing swiftmailer/swiftmailer (v6.0.2) Loading from cache
  - Installing symfony/swiftmailer-bundle (v3.1.6) Loading from cache
  - Installing symfony/translation (v4.0.3) Loading from cache
  - Installing symfony/validator (v4.0.3) Loading from cache
  - Installing symfony/serializer (v4.0.3) Loading from cache
  - Installing symfony/inflector (v4.0.3) Loading from cache
  - Installing symfony/property-info (v4.0.3) Loading from cache
  - Installing symfony/property-access (v4.0.3) Loading from cache
  - Installing psr/simple-cache (1.0.0) Loading from cache
  - Installing psr/cache (1.0.1) Loading from cache
  - Installing symfony/cache (v4.0.3) Loading from cache
  - Installing webmozart/assert (1.2.0) Loading from cache
  - Installing phpdocumentor/reflection-common (1.0.1) Loading from cache
  - Installing phpdocumentor/type-resolver (0.4.0) Loading from cache
  - Installing phpdocumentor/reflection-docblock (4.2.0) Loading from cache
  - Installing symfony/serializer-pack (v1.0.1) Loading from cache
  - Installing symfony/security (v4.0.3) Loading from cache
  - Installing symfony/security-bundle (v4.0.3) Loading from cache
  - Installing symfony/process (v4.0.3) Loading from cache
  - Installing monolog/monolog (1.23.0) Loading from cache
  - Installing symfony/monolog-bridge (v4.0.3) Loading from cache
  - Installing symfony/monolog-bundle (v3.1.2) Loading from cache
  - Installing symfony/routing (v4.0.3) Loading from cache
  - Installing symfony/finder (v4.0.3) Loading from cache
  - Installing symfony/framework-bundle (v4.0.3) Loading from cache
  - Installing symfony/console (v4.0.3) Loading from cache
  - Installing zendframework/zend-eventmanager (3.2.0) Loading from cache
  - Installing zendframework/zend-code (3.3.0) Loading from cache
  - Installing ocramius/proxy-manager (2.2.0) Loading from cache
  - Installing doctrine/dbal (v2.6.3) Loading from cache
  - Installing doctrine/migrations (v1.6.2) Loading from cache
  - Installing symfony/doctrine-bridge (v4.0.3) Loading from cache
  - Installing doctrine/doctrine-cache-bundle (1.3.2) Loading from cache
  - Installing jdorn/sql-formatter (v1.2.17) Loading from cache
  - Installing doctrine/doctrine-bundle (1.8.1) Loading from cache
  - Installing doctrine/doctrine-migrations-bundle (v1.3.1) Loading from cache
  - Installing doctrine/instantiator (1.1.0) Loading from cache
  - Installing doctrine/orm (v2.6.0) Loading from cache
  - Installing symfony/orm-pack (v1.0.5) Loading from cache
  - Installing symfony/options-resolver (v4.0.3) Loading from cache
  - Installing symfony/intl (v4.0.3) Loading from cache
  - Installing symfony/polyfill-intl-icu (v1.6.0) Loading from cache
  - Installing symfony/form (v4.0.3) Loading from cache
  - Installing symfony/expression-language (v4.0.3) Loading from cache
  - Installing symfony/polyfill-php72 (v1.6.0) Loading from cache
  - Installing symfony/var-dumper (v4.0.3) Loading from cache
  - Installing symfony/phpunit-bridge (v4.0.3) Loading from cache
  - Installing twig/twig (v2.4.4) Loading from cache
  - Installing symfony/twig-bridge (v4.0.3) Loading from cache
  - Installing symfony/web-profiler-bundle (v4.0.3) Loading from cache
  - Installing symfony/twig-bundle (v4.0.3) Loading from cache
  - Installing symfony/stopwatch (v4.0.3) Loading from cache
  - Installing symfony/profiler-pack (v1.0.3) Loading from cache
  - Installing easycorp/easy-log-handler (v1.0.4) Loading from cache
  - Installing symfony/debug-bundle (v4.0.3) Loading from cache
  - Installing symfony/debug-pack (v1.0.4) Loading from cache
  - Installing symfony/asset (v4.0.3) Loading from cache
  - Installing sensio/framework-extra-bundle (v5.1.4) Loading from cache
  - Installing symfony/dom-crawler (v4.0.3) Loading from cache
  - Installing symfony/browser-kit (v4.0.3) Loading from cache
  - Installing symfony/css-selector (v4.0.3) Loading from cache
  - Installing symfony/dotenv (v4.0.3) Loading from cache
  - Installing symfony/maker-bundle (v1.0.2) Loading from cache
Writing lock file
Generating autoload files
ocramius/package-versions:  Generating version class...
ocramius/package-versions: ...done generating version class
Symfony operations: 20 recipes (28dbd00e20d094ab6cb6891380649c4d)
  - Configuring symfony/flex (>=1.0): From github.com/symfony/recipes:master
  - Configuring symfony/framework-bundle (>=3.3): From github.com/symfony/recipes:master
  - Configuring doctrine/annotations (>=1.0): From github.com/symfony/recipes:master
  - Configuring symfony/webpack-encore-pack (>=1.0): From github.com/symfony/recipes:master
  - Configuring symfony/swiftmailer-bundle (>=2.5): From github.com/symfony/recipes:master
  - Configuring symfony/translation (>=3.3): From github.com/symfony/recipes:master
  - Configuring symfony/security-bundle (>=3.3): From github.com/symfony/recipes:master
  - Configuring symfony/monolog-bundle (>=3.1): From github.com/symfony/recipes:master
  - Configuring symfony/routing (>=4.0): From github.com/symfony/recipes:master
  - Configuring symfony/console (>=3.3): From github.com/symfony/recipes:master
  - Configuring doctrine/doctrine-cache-bundle (>=1.3.2): From auto-generated recipe
  - Configuring doctrine/doctrine-bundle (>=1.6): From github.com/symfony/recipes:master
  - Configuring doctrine/doctrine-migrations-bundle (>=1.2): From github.com/symfony/recipes:master
  - Configuring symfony/phpunit-bridge (>=3.3): From github.com/symfony/recipes:master
  - Configuring symfony/web-profiler-bundle (>=3.3): From github.com/symfony/recipes:master
  - Configuring symfony/twig-bundle (>=3.3): From github.com/symfony/recipes:master
  - Configuring easycorp/easy-log-handler (>=1.0): From github.com/symfony/recipes:master
  - Configuring symfony/debug-bundle (>=3.3): From github.com/symfony/recipes:master
  - Configuring sensio/framework-extra-bundle (>=4.0): From github.com/symfony/recipes:master
  - Configuring symfony/maker-bundle (>=1.0): From github.com/symfony/recipes:master
Executing script cache:clear [OK]
Executing script assets:install --symlink --relative public [OK]

Some files may have been created or updated to configure your new packages.
Please review, edit and commit them: these files are yours.

 What's next? 

  * Run your application:
    1. Change to the project directory
    2. Execute the php -S 127.0.0.1:8000 -t public command;
    3. Browse to the http://localhost:8000/ URL.

       Quit the server with CTRL-C.
       Run composer require server for a better web server.

  * Read the documentation at https://symfony.com/doc

 Next: Configuration 

  * Modify your DATABASE_URL config in .env

  * Configure the driver (mysql) and
    server_version (5.7) in config/packages/doctrine.yaml

 How to test? 

  * Write test cases in the tests/ folder
  * Run php bin/phpunit

Commencez par changer dans votre nouveau répertoire:

 cd lets-explore-symfony-4 

Et suivons les conseils donnés pour installer symfony/web-server-bundle :

composer require server

./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing symfony/web-server-bundle (v4.0.3) Loading from cache
Writing lock file
Generating autoload files
ocramius/package-versions:  Generating version class...
ocramius/package-versions: ...done generating version class
Symfony operations: 1 recipe (49f8401ef71615655f92e7820cbc33b9)
  - Configuring symfony/web-server-bundle (>=3.3): From github.com/symfony/recipes:master
Executing script cache:clear [OK]
Executing script assets:install --symlink --relative public [OK]

Some files may have been created or updated to configure your new packages.
Please review, edit and commit them: these files are yours.

Maintenant, allumons le serveur web et regardons notre nouveau site Web Symfony 4:

 php bin/console server:start [OK] Server listening on http://127.0.0.1:8000 

Parcourir, comme indiqué, à http://127.0.0.1:8000 , et ... quelque peu inhabituellement, il y a une page d'erreur 404 .

C'est bien, à certains égards.

Le fait que nous voyons un 404 est bon. Cela signifie que notre serveur Web est opérationnel et répond aux demandes.

Nous pouvons voir que la barre d'outils de débogage web (en bas de l'écran) est installée et fonctionne.

Nous pouvons également voir que pendant qu'une demande a été faite à la racine du site ( / ), une page n'a pas été configurée pour répondre sur cette route.

Vous pourriez avoir attendu une belle page "bienvenue". Mais Symfony 4 est plus minimaliste. Vous auriez presque certainement passé directement à votre code et supprimé immédiatement toute page "bienvenue" préconfigurée. Alors pourquoi le fournir?

Geek Trivia : Si vous êtes habitué à Symfony 2 ou Symfony 3, il y avait une page "bienvenue" avec une nouvelle installation de Symfony Standard Edition. Bien que ce soit maintenant disparu, le nouveau MakerBundle ramène cela, en quelque sorte. Nous explorerons cela un peu plus dans la prochaine vidéo.

Notre première page

Même si Symfony ne nous fournit pas de page d'accueil, commençons par créer quelque chose de similaire.

Nous allons d'abord créer un modèle. Nous utilisons Twig pour créer des modèles, et la convention est d'utiliser le format whatever_name_you_like.html.twig .

Nous appellerons les nôtres hello_page.html.twig .

Créez ce nouveau modèle dans le répertoire des templates :

 touch templates/hello_page.html.twig 

touch est simplement une manière ringarde de créer un nouveau fichier vide à partir de la ligne de commande. N'hésitez pas à créer le fichier depuis votre IDE, ou similaire.

Ajoutez tout ce que vous aimez dans ce modèle. Je vais avec la base:

 Hello, Sehbani Redouane! 

Maintenant, afin de voir cette page dans notre navigateur Web, nous devons faire prendre conscience à Symfony qu'il existe.

Il y a une façon très standard de le faire: utiliser un contrôleur.

Mais, comme notre page est si simple, nous n'avons techniquement pas besoin d'un contrôleur. Ce que nous allons faire est un peu geek, alors ne vous inquiétez pas si vous ne le comprenez pas. Nous allons rendre notre modèle sans contrôleur .

Ouvrez le fichier:

config/routes.yaml

Et ajouter:

hello_page:
    path:         /
    controller:   Symfony\Bundle\FrameworkBundle\Controller\TemplateController::templateAction
    defaults:
        template: hello_page.html.twig

Maintenant, revenez à votre navigateur et actualisez la page.

Vous devriez voir le texte que vous avez mis dans votre template hello_page.html.twig .

Envie, hein?

Eh bien, bien qu'il soit agréable de savoir que vous pouvez le faire, dans 99% des cas, personnellement, je ne rends pas les pages de cette façon.

Ce que nous avons fait ici est de définir notre premier itinéraire.

Rappelez-vous comment l'erreur 404 s'est plaint que 'Aucune route trouvée pour "GET /"'?

Symfony 4 aucun itinéraire trouvé

Et puis nous avons défini une route pour / en définissant l'attribut de path notre hello_page à / .

Nous pouvons vérifier cela à l'aide de la commande de console de debug:router très utile de Symfony:

php bin/console debug:router          
 -------------------------- -------- -------- ------ ----------------------------------- 
  Name                       Method   Scheme   Host   Path                               
 -------------------------- -------- -------- ------ ----------------------------------- 
  _twig_error_test           ANY      ANY      ANY    /_error/{code}.{_format}           
  _wdt                       ANY      ANY      ANY    /_wdt/{token}                      
  _profiler_home             ANY      ANY      ANY    /_profiler/                        
  _profiler_search           ANY      ANY      ANY    /_profiler/search                  
  _profiler_search_bar       ANY      ANY      ANY    /_profiler/search_bar              
  _profiler_phpinfo          ANY      ANY      ANY    /_profiler/phpinfo                 
  _profiler_search_results   ANY      ANY      ANY    /_profiler/{token}/search/results  
  _profiler_open_file        ANY      ANY      ANY    /_profiler/open                    
  _profiler                  ANY      ANY      ANY    /_profiler/{token}                 
  _profiler_router           ANY      ANY      ANY    /_profiler/{token}/router          
  _profiler_exception        ANY      ANY      ANY    /_profiler/{token}/exception       
  _profiler_exception_css    ANY      ANY      ANY    /_profiler/{token}/exception.css   
  hello_page                 ANY      ANY      ANY    /                                  
 -------------------------- -------- -------- ------ ----------------------------------- 

Toutes les entrées commençant par le trait de soulignement (par exemple _profiler_search_bar ) sont incluses dans les routes qui ont été _profiler_search_bar via la configuration de notre projet en utilisant le website-skeleton .

Notre route personnalisée: hello_page est en bas et correspond au path de / . Juste ce que nous avons défini dans config/routes.yaml .

Changez le path pour tout ce que vous aimez:

hello_page:
    path:         /hello
    controller:   Symfony\Bundle\FrameworkBundle\Controller\TemplateController::templateAction
    defaults:
        template: hello_page.html.twig

puis relancez la commande:

php bin/console debug:router
 -------------------------- -------- -------- ------ ----------------------------------- 
  Name                       Method   Scheme   Host   Path                               
 -------------------------- -------- -------- ------ ----------------------------------- 
  _twig_error_test           ANY      ANY      ANY    /_error/{code}.{_format}           
  _wdt                       ANY      ANY      ANY    /_wdt/{token}                      
  _profiler_home             ANY      ANY      ANY    /_profiler/                        
  _profiler_search           ANY      ANY      ANY    /_profiler/search                  
  _profiler_search_bar       ANY      ANY      ANY    /_profiler/search_bar              
  _profiler_phpinfo          ANY      ANY      ANY    /_profiler/phpinfo                 
  _profiler_search_results   ANY      ANY      ANY    /_profiler/{token}/search/results  
  _profiler_open_file        ANY      ANY      ANY    /_profiler/open                    
  _profiler                  ANY      ANY      ANY    /_profiler/{token}                 
  _profiler_router           ANY      ANY      ANY    /_profiler/{token}/router          
  _profiler_exception        ANY      ANY      ANY    /_profiler/{token}/exception       
  _profiler_exception_css    ANY      ANY      ANY    /_profiler/{token}/exception.css   
  hello_page                 ANY      ANY      ANY    /hello                             
 -------------------------- -------- -------- ------ -----------------------------------

Et bien sûr, vous devrez maintenant naviguer vers http://127.0.0.1:8000/hello pour voir la page "Hello".

Ok, c'est avec un tout nouveau site Web Symfony 4 opérationnel dans notre environnement de développement local.

Dans le prochain tutoriel, nous allons jeter un premier coup d'œil à notre propre contrôleur personnalisé.