Slide 1

Slide 1 text

Fabien Potencier @fabpot

Slide 2

Slide 2 text

Have you ever
 used Symfony? 1.x? 2.x? 3.x? 4.x?

Slide 3

Slide 3 text

What is Symfony 4? A new developer experience On a rock solid foundation From micro-style to monolith

Slide 4

Slide 4 text

4 in action…

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

$ symfony new demo # Want to try Symfony 4.3 (dev version)? $ symfony new demo --version=dev-master

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

symfony/skeleton "require": { "php": "^7.1.3", "ext-ctype": "*", "ext-iconv": "*", "symfony/console": "*", "symfony/dotenv": "*", "symfony/flex": "^1.1", "symfony/framework-bundle": "*", "symfony/yaml": "*" },

Slide 9

Slide 9 text

$ symfony new demo --version=dev-master --debug Demo

Slide 10

Slide 10 text

$ symfony new demo --version=dev-master --debug Demo

Slide 11

Slide 11 text

$ 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" ] },

Slide 12

Slide 12 text

$ symfony new demo --version=dev-master --debug Demo

Slide 13

Slide 13 text

$ tree -I vendor $ find . -type f | wc -l Symfony 4 is lightweight Only 16 files vs 31 SE 3300 total vs 8867 SE -65%

Slide 14

Slide 14 text

New directory structure • Less depth, easier to navigate • Non-PHP files in their own directories (assets/, templates/) • Decoupled from Symfony (assets/, src/, templates/, public/)

Slide 15

Slide 15 text

https://github.com/symfony/recipes/
 tree/master/
 symfony/framework-bundle/4.2 Demo

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

$ composer show | wc -l Demo Only 25 deps vs 38 + 50 = 88 SE

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

$ symfony server:start -d $ symfony server:log Demo

Slide 21

Slide 21 text

Demo

Slide 22

Slide 22 text

$ ./bin/console Demo 15 commands vs 57 SE

Slide 23

Slide 23 text

$ git init $ git add . $ git commit -a -m"init" Demo

Slide 24

Slide 24 text

$ composer req maker Demo

Slide 25

Slide 25 text

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, …)

Slide 26

Slide 26 text

Packs • Bundle several dependencies into a consistent set (debug, profiler, api, test, …) $ composer req debug

Slide 27

Slide 27 text

Discover Aliases and Packs https://flex.symfony.com/

Slide 28

Slide 28 text

$ composer req maker $ git diff config/bundles.php Symfony Maker Bundle

Slide 29

Slide 29 text

$ ./bin/console list make Symfony Maker Bundle

Slide 30

Slide 30 text

$ ./bin/console make:controller Symfony Maker Bundle

Slide 31

Slide 31 text

$ composer req annot Symfony Maker Bundle

Slide 32

Slide 32 text

$ ./bin/console make:controller DefaultController Symfony Maker Bundle

Slide 33

Slide 33 text

$ vim src/Controller/DefaultController.php Symfony Maker Bundle src/ is about YOUR code

Slide 34

Slide 34 text

Symfony 4 helps you
 grow your app
 with ease

Slide 35

Slide 35 text

$ composer req twig Adding Twig

Slide 36

Slide 36 text

Never define
 your service again*

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

$ ./bin/console make:twig-extension Adding a Twig Extension Add your logic in the generated class… DONE!

Slide 39

Slide 39 text

Full Automation works for… • Twig extensions • Event listeners • Doctrine repositories • Commands • Voters • Registration form system • …

Slide 40

Slide 40 text

Beyond “Hello World” • Defining some models via Doctrine • Adding an API for my model • Managing data with an admin

Slide 41

Slide 41 text

$ composer req orm admin api Full stack really quick

Slide 42

Slide 42 text

$ composer req orm admin api Full stack really quick

Slide 43

Slide 43 text

$ ./bin/console make:entity Product --api-resource Full stack really quick

Slide 44

Slide 44 text

$ vim config/packages/easy_admin.yaml Full stack really quick

Slide 45

Slide 45 text

$ 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

Slide 46

Slide 46 text

It works! One line config change One annotation added

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

Typical features to the next level

Slide 49

Slide 49 text

I want to send emails
 from my controller

Slide 50

Slide 50 text

$ composer req symfony/mailer Symfony Maker Bundle use Symfony\Component\Mailer\MailerInterface; public function index(MailerInterface $mailer) { $mailer->send( (new Email()) ->from('fabien@symfony.com') ->to('fabien@symfony.com') ->subject('Some subject') ->text('Some text...') ); MAILER_DSN=smtp://localhost

Slide 51

Slide 51 text

I want to send rich emails
 from my controller

Slide 52

Slide 52 text

Symfony Maker Bundle use Symfony\Component\Mailer\MailerInterface; public function index(MailerInterface $mailer) { $mailer->send( (new TemplatedEmail()) ->from('fabien@symfony.com') ->to('fabien@symfony.com') ->subject('Some subject') ->htmlTemplate('@emails/welcome.html.twig') ->context([ 'city' => 'Tunis' ]) ); MAILER_DSN=smtp://localhost

Slide 53

Slide 53 text

I want to send rich and responsive emails
 from my controller

Slide 54

Slide 54 text

$ composer req twig/inky-extension Symfony Maker Bundle MAILER_DSN=smtp://localhost {% apply inky|inline_css(source("@zurb/stylesheets/main.css")) %}

Symfony Connect

Forgot Your Password?

It happens. Click the link below to reset it.

Reset Password

unsubscribe here.

{% endapply %}

Slide 55

Slide 55 text

I want to send rich and responsive emails
 from my controller
 via my provider's API

Slide 56

Slide 56 text

$ composer req symfony/mailgun-mailer MAILER_DSN=http://key:domain@mailgun Symfony Maker Bundle Amazon SES Google Gmail Mandrill Mailgun Postmark Sendgrid

Slide 57

Slide 57 text

I want to send rich and responsive emails
 from my controller
 via my provider's API
 asynchronously

Slide 58

Slide 58 text

$ composer req messenger framework: messenger: transports: email: "doctrine://default" routing: Symfony\Component\Mailer\Messenger\SendEmailMessage: email $ ./bin/console messenger:consume Symfony Maker Bundle

Slide 59

Slide 59 text

I want to send rich and responsive emails
 from my controller
 via my provider's API
 asynchronously with AMQP

Slide 60

Slide 60 text

$ 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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

Why?

Slide 63

Slide 63 text

Featureful and the most downloaded

Slide 64

Slide 64 text

The most advanced API solution https://api-platform.com/

Slide 65

Slide 65 text

The most advanced e-commerce solution

Slide 66

Slide 66 text

Many admin-gen solutions https://github.com/EasyCorp/EasyAdminBundle

Slide 67

Slide 67 text

The foundation of the PHP ecosystem

Slide 68

Slide 68 text

$ 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();

Slide 69

Slide 69 text

• CssSelector • Debug • Dotenv • Finder • Mailer • Mime • sMessenger • Polyfill : APCu, ctype, iconv, intl, mbstring, PHP, … • Process • VarDumper • VarExporter • Yaml • … Truly independent components

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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)

Slide 72

Slide 72 text

Predictable releases and support 3.4 LTS 4.2 Stable https://symfony.com/releases

Slide 73

Slide 73 text

Stability and predictability • Strict semantic versioning • Deprecation/BC policy • Responsible security issue management https://symfony.com/bc https://symfony.com/security

Slide 74

Slide 74 text

The fastest framework around x2 x3 x4 http://www.phpbenchmarks.com/

Slide 75

Slide 75 text

Scale from micro to monolith 13 files 15 dependencies start with … and grow as you see fit via automation

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

https://symfony.com/4

Slide 78

Slide 78 text

Thank you!