Apprendre Symfony 3

Créer son Bundle

Programme

  1. Présentation
  2. Créer son Bundle
  3. Configurer son application
  4. Créer sa première page
  5. Créer sa première entité
  6. Insérer quelques éléments en BDD à partir d'un formulaire

C'est quoi un Bundle ?

Présentation

  • Element principal du framework : tout est un bundle
  • Similaire à un plugin ou un module
  • Représente une fonctionnalité
  • Doit être facile à
    • construire
    • distribuer
    • réutiliser

Un bundle contient :

  • des fichiers PHP
  • des fichiers de configuration
  • des fichiers de templates
  • des fichiers CSS
  • des fichier JS

Structure de dossier

Créer son Bundle

Facile !


						php bin/console generate:bundle
						
Règles pour les noms de bundle
  • CameCase !
  • 2 mots
  • Suffixer avec Bundle (ex: FirstBundle)

Regardons le fichier composer.json

Une nouvelle ligne est apparu


                    {
                        "autoload": {
                            "psr-4": {
                                "Acme\\Bundle\\BlogBundle\\": "src/Acme/Bundle/BlogBundle"
                            },
                            "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
                        }
                    }
                

PSR-0 et PSR-4 : Les autoloaders

  • Un seul fichier qui référence tous les espaces de noms (namespace)
  • Charge automatiquement toutes les classes
  • Symfony met en cache la localisation des classes afin d'optimiser les performances

PSR-0 et PSR-4 : Les autoloaders


                    // autoload_psr4.php @generated by Composer
                    return array(
                        'Twig\\' => array($vendorDir . '/twig/twig/src'),
                        'Tests\\' => array($baseDir . '/tests'),
                        'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'),
                        'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
                        'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'),
                        'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
                        'Symfony\\Component\\' => array($vendorDir . '/symfony/symfony/src/Symfony/Component'),
                        'Symfony\\Bundle\\SwiftmailerBundle\\' => array($vendorDir . '/symfony/swiftmailer-bundle'),
                        'Symfony\\Bundle\\MonologBundle\\' => array($vendorDir . '/symfony/monolog-bundle'),
                        'Symfony\\Bundle\\' => array($vendorDir . '/symfony/symfony/src/Symfony/Bundle'),
                        'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/symfony/src/Symfony/Bridge/Twig'),
                        'Symfony\\Bridge\\Swiftmailer\\' => array($vendorDir . '/symfony/symfony/src/Symfony/Bridge/Swiftmailer'),
                        'Symfony\\Bridge\\ProxyManager\\' => array($vendorDir . '/symfony/symfony/src/Symfony/Bridge/ProxyManager'),
                        'Sensio\\Bundle\\GeneratorBundle\\' => array($vendorDir . '/sensio/generator-bundle'),
                        'Sensio\\Bundle\\FrameworkExtraBundle\\' => array($vendorDir . '/sensio/framework-extra-bundle'),
                        'Sensio\\Bundle\\DistributionBundle\\' => array($vendorDir . '/sensio/distribution-bundle'),
                    );
                

Les espaces de noms (namespace)

  • Sortie avec PHP 5.3
  • Permet d'éviter des noms de classe à rallonge
  • Permet d'éviter les collisions de nom de classe
  • Beaucoup plus efficace que
    require_once "....";

Les espaces de noms (namespace)

L'exemple du controller


                    // src/AppBundle/Controller/LuckyController.php
                    namespace AppBundle\Controller;

                    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
                    use Symfony\Component\HttpFoundation\Response;

                    class LuckyController
                    {
                        /**
                         * @Route("/lucky/number")
                         */
                        public function numberAction()
                        {
                            $number = mt_rand(0, 100);

                            return new Response(
                                'Lucky number: '.$number.''
                            );
                        }
                    }
                

Les bundles contributaires

Bundle de la communauté

  • Plus de 3096 bundles
  • Très souvent libre et réutilisable
  • La plupart hébergé sur Github
  • Standardisé

Quelques bundles que même ton chat peut utiliser

FOSUserBundle

SonataAdminBundle

MopaBootstrapBundle

GenemuFormBundle

  • https://github.com/genemu/GenemuFormBundle
  • Améliorer vos back-office grâce à des champs de formulaire comme :
    • Captcha GD, Recaptcha
    • Tinymce
    • JQueryDate
    • JQueryAutocomplete
    • JQuerySlider
    • JQueryFile
    • JQueryImage

BazingaFakerBundle

WebProfilerExtraBundle

Où trouvez des bundles ?

Héritage de Bundle

  • Permet de surcharger des fichiers d'un autre bundle
  • Principales surcharge :
    • Controllers
    • Templates
    • Routes

Ex : FosUserBundle

Définir le Bundle parent dans le fichier de définition du Bundle


                     // src/UserBundle/UserBundle.php
                    namespace UserBundle;

                    use Symfony\Component\HttpKernel\Bundle\Bundle;

                    class UserBundle extends Bundle
                    {
                        public function getParent()
                        {
                        return 'FOSUserBundle';
                        }
                    }
                

Ex : FosUserBundle

Ajouter un fichier qui correspond à un fichier du Bundle parent


                    // src/UserBundle/Controller/RegistrationController.php
                    namespace UserBundle\Controller;

                    use FOS\UserBundle\Controller\RegistrationController as BaseController;

                    class RegistrationController extends BaseController
                    {
                        public function registerAction()
                        {
                            $response = parent::registerAction();

                            // ... do custom stuff
                            return $response;
                        }
                    }
                

Des questions ?

Merci !