Share
Embed
Symfony 4 in action (updated for 4.3)
Fabien Potencier
April 26, 2019
Transcript
78 slides
-
What is Symfony 4? A new developer experience On a
rock solid foundation From micro-style to monolith -
$ symfony new demo # Want to try Symfony 4.3
(dev version)? $ symfony new demo --version=dev-master -
symfony/skeleton "require": { "php": "^7.1.3", "ext-ctype": "*", "ext-iconv": "*", "symfony/console":
"*", "symfony/dotenv": "*", "symfony/flex": "^1.1", "symfony/framework-bundle": "*", "symfony/yaml": "*" }, -
$ symfony new demo --version=dev-master --debug Demo "scripts": { "auto-scripts":
{ "cache:clear": "symfony-cmd", "assets:install %PUBLIC_DIR%": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" ] }, -
$ tree -I vendor $ find . -type f |
wc -l Symfony 4 is lightweight Only 16 files vs 31 SE 3300 total vs 8867 SE -65% -
New directory structure • Less depth, easier to navigate •
Non-PHP files in their own directories (assets/, templates/) • Decoupled from Symfony (assets/, src/, templates/, public/) -
Recipes repositories https://github.com/symfony/recipes Curated recipes by Symfony core team https://github.com/symfony/recipes-contrib
Open to all contributions 370+ recipes -
$ composer show | wc -l Demo Only 25 deps
vs 38 + 50 = 88 SE -
Symfony 2+/3+ Monolog Bundle SwiftMailer Bundle Polyfill Util Polyfill PHP
7.0 Polyfill PHP 5.6 Polyfill Mbstring Polyfill Intl ICU Polyfill APCu PHPUnit Bridge Debug Bundle Framework Bundle Security Bundle Twig Bundle WebProfiler Bundle WebServer Bundle Doctrine Bridge Monolog Bridge Twig Bridge Monolog Doctrine (11) SecurityChecker Generator Bundle ParamHandler FrameworkExtra Bundle Distribution Bundle Asset BrowserKit Cache ClassLoader Config Console CssSelector Debug DependencyInjection DomCrawler Dotenv EventDispatcher ExpressionLanguage Filesystem Finder Form HttpFoundation HttpKernel Inflector Intl Ldap OptionsResolver Process PropertyAccess PropertyInfo Routing Security Serializer Stopwatch Templating Translation Validator VarDumper WebLink Workflow Yaml 4 bridges 15 librairies 11 bundles 42 components SwiftMailer -
Symfony 4+ Polyfill Mbstring Framework Bundle Cache Config Debug DependencyInjection
Dotenv EventDispatcher Filesystem Finder HttpFoundation HttpKernel Routing Yaml 0 bridges 1 library 1 bundle 13 components Flex -
$ git init $ git add . $ git commit
-a -m"init" Demo -
Aliases • Shortcuts for common packages (log, behat, phpunit, …)
• Optimized for Symfony Components (no need to use the symfony/ prefix, just workflow, dom-crawler, …) • Opinionated choices (admin, api, orm, mailer, test, …) -
Packs • Bundle several dependencies into a consistent set (debug,
profiler, api, test, …) $ composer req debug -
Adding a Twig Extension Where do I store the Twig
extension class? Which file do I need to change to register it? Which tag do I need to use? How do I declare a tag in YAML? Which interface/class do I need to implement/ extend? It’s too complex. What about doing it the dirty way and do it in the controller instead? hmm, ok -
$ ./bin/console make:twig-extension Adding a Twig Extension Add your logic
in the generated class… DONE! -
Full Automation works for… • Twig extensions • Event listeners
• Doctrine repositories • Commands • Voters • Registration form system • … -
Beyond “Hello World” • Defining some models via Doctrine •
Adding an API for my model • Managing data with an admin -
$ vim .env DATABASE_URL="sqlite:///%kernel.project_dir%/var/ data.db" $ ./bin/console doctrine:database:create $ ./bin/console
doctrine:schema:update --force Full stack really quick -
$ composer req symfony/mailer Symfony Maker Bundle use Symfony\Component\Mailer\MailerInterface; public
function index(MailerInterface $mailer) { $mailer->send( (new Email()) ->from('[email protected]') ->to('[email protected]') ->subject('Some subject') ->text('Some text...') ); MAILER_DSN=smtp://localhost -
Symfony Maker Bundle use Symfony\Component\Mailer\MailerInterface; public function index(MailerInterface $mailer) {
$mailer->send( (new TemplatedEmail()) ->from('[email protected]') ->to('[email protected]') ->subject('Some subject') ->htmlTemplate('@emails/welcome.html.twig') ->context([ 'city' => 'Tunis' ]) ); MAILER_DSN=smtp://localhost -
$ composer req twig/inky-extension Symfony Maker Bundle MAILER_DSN=smtp://localhost {% apply
inky|inline_css(source("@zurb/stylesheets/main.css")) %} <container> <row class="header"> <columns> <spacer size="16"></spacer> <h4 class="text-center">Symfony Connect</h4> </columns> </row> <row> <columns> <spacer size="32"></spacer> <center><img width="100px" src="{{ email.image("@images/symfony.png") }}"></center> <spacer size="16"></spacer> <h1 class="text-center">Forgot Your Password?</h1> <spacer size="16"></spacer> <p class="text-center">It happens. Click the link below to reset it.</p> <button class="large expand" href="#">Reset Password</button> <hr/> <p><small><center><a href="#">unsubscribe here</a>.</small></center></p> </columns> </row> </container> {% endapply %} -
I want to send rich and responsive emails from my
controller via my provider's API -
$ composer req symfony/mailgun-mailer MAILER_DSN=http://key:domain@mailgun Symfony Maker Bundle Amazon SES
Google Gmail Mandrill Mailgun Postmark Sendgrid -
I want to send rich and responsive emails from my
controller via my provider's API asynchronously -
$ composer req messenger framework: messenger: transports: email: "doctrine://default" routing:
Symfony\Component\Mailer\Messenger\SendEmailMessage: email $ ./bin/console messenger:consume Symfony Maker Bundle -
I want to send rich and responsive emails from my
controller via my provider's API asynchronously with AMQP -
$ composer req messenger framework: messenger: transports: email: "amqp://guest:guest@localhost:5672/%2f/messages" routing:
Symfony\Component\Mailer\Messenger\SendEmailMessage: email $ ./bin/console messenger:consume Symfony Maker Bundle -
Symfony 4 recap • Auto-configuration for any Composer package •
A Maker bundle to simplify creating files • No boilerplate code, just business logic • Controllers and commands as services • From micro to monolith • Meta-packages doing a lot for you out of the box Productivity boost! Better DX -
$ composer require symfony/console Truly independent components (new Console\Application('echo', '1.0.0'))
->register('echo') ->addArgument('foo', Console\Input\InputArgument::OPTIONAL, 'The directory') ->addOption('bar', null, Console\Input\InputOption::VALUE_REQUIRED) ->setCode(function(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) { // output arguments and options }) ->getApplication() ->setDefaultCommand('echo', true) // Single command application ->run(); -
• CssSelector • Debug • Dotenv • Finder • Mailer
• Mime • sMessenger • Polyfill : APCu, ctype, iconv, intl, mbstring, PHP, … • Process • VarDumper • VarExporter • Yaml • … Truly independent components -
Predictable releases and support https://symfony.com/releases •Every month: a patch release
•Every 6 month: a minor release •Every 2 years: a major release •On the go: security releases -
Predictable releases and support Release end of support +8 months
+14 months +36 months +48 months end of security support end of security support end of support Standard Releases (3.3, 4.0) LTS Releases (2.8, 3.4) -
Stability and predictability • Strict semantic versioning • Deprecation/BC policy
• Responsible security issue management https://symfony.com/bc https://symfony.com/security -
Scale from micro to monolith 13 files 15 dependencies start
with … and grow as you see fit via automation -
Community oriented • Code of conduct https://symfony.com/conduct • Enforced by
the CARE team https://symfony.com/care • Respectful Review Comments https://symfony.com/doc/current/contributing/community/review-comments.html Diversity initiative https://symfony.com/diversity