$30 off During Our Annual Pro Sale. View Details »

Symfony 4: A new way to develop applications #phpsrb

Symfony 4: A new way to develop applications #phpsrb

Symfony4 is here and it is better than ever. With Flex it can be a micro framework and an amazing beast with any feature you want. What changed from version 3, what are new best practices, what are new components and why Symfony is moving PHP world forward once again you can find in this talk.

Antonio Peric-Mazar

May 26, 2019
Tweet

More Decks by Antonio Peric-Mazar

Other Decks in Programming

Transcript

  1. Symfony4: a new way to develop
    applications
    Antonio Perić-Mažar, Locastic
    26.05.2019 - #phpsrb

    View Slide

  2. Antonio
    Perić-Mažar
    CEO @ Locastic
    Co-founder @ Tinel Meetup
    Co-founder @ Blockada
    t: antonioperic
    m: [email protected]

    View Slide

  3. Locastic
    Helping clients create web and mobile apps since 2011
    • UX/UI
    • Mobile apps
    • Web apps
    • Training & Consulting
    www.locastic.com
    @locastic

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. 2005.

    View Slide

  8. php 5.3
    2009.
    2005.

    View Slide

  9. php 5.3
    2009.
    2005. 2015.

    View Slide

  10. php 5.3
    2009.
    2005. 2015. Nov 2017.

    View Slide

  11. View Slide

  12. • Installing bundle is too cumbersome
    • Remove bundle is too cumbersome
    • The standard edition is not good enough
    • You always had a feeling that you have a bunch of code and
    packages that your are not using
    What we can do better?

    View Slide

  13. – Fabien Potencier
    “As a developer, I want to start small, without too many
    dependencies. But I also want to be able to grow my
    application as I see fit. From a micro-framework style app to a
    gigantic monolith. Your choice. The framework should not get
    in the way.”

    View Slide

  14. Composition over
    inheritance

    View Slide

  15. • Starting as micro framework
    • Compose your application
    • Build anything you want; console app, traditional web app, etc
    • Based on a micro-kernel and contain 70% less code and files than
    new Symfony 3 apps
    Symfony4

    View Slide

  16. View Slide

  17. Composer started as a conversation about how to generically install
    bundles/plugins/extensions for Symfony and phpBB.
    Fun fact

    View Slide

  18. Composer started as a conversation about how to generically install
    bundles/plugins/extensions for Symfony and phpBB.
    Fun fact
    Neither Symfony nor phpBB uses Composer as a way to install its
    bundles/plugins/extensions.
    WTF fact

    View Slide

  19. • Composer plugin
    • Auto-configurable via recipes
    • Official and private recipes
    Symfony Flex

    View Slide

  20. View Slide

  21. Decide which package to install
    Run any task to configure them

    View Slide

  22. {
    "bundles": {
    "Symfony\\Bundle\\SwiftmailerBundle\\SwiftmailerBundle":
    ["all"]
    },
    "copy-from-recipe": {
    "config/": "%CONFIG_DIR%/"
    },
    "env": {
    "#1": "For Gmail as a transport, use: \"gmail://
    username:password@localhost\"",
    "#2": "For a generic SMTP server, use: \"smtp://localhost:
    25?encryption=&auth_mode=\"",
    "#3": "Delivery is disabled by default via \"null://
    localhost\"",
    "MAILER_URL": "null://localhost"
    },
    "aliases": ["mailer", "mail"]
    }
    Symfony mailer recipe

    View Slide

  23. • Two repositories
    • symfony/recipies
    • maintained by Symfony core team, contains only recipies for
    components and bundles ‘opinionated’ by core team
    • can use alias
    • symfony/recipies-contrib
    • anyone can contribute
    • cannot use alias
    Symfony Flex Recipies

    View Slide

  24. https://flex.symfony.com/

    View Slide

  25. View Slide

  26. • With composer
    • composer create-project symfony/skeleton
    • composer create-project symfony/website-skeleton
    • composer create-project symfony/demo
    Starting a new project

    View Slide

  27. • With Symfony Client
    • Helps you create new Symfony applications
    • supports multiple PHP versions, different PHP config per directory
    • Provides a local HTTP/2 web server
    • Generates TLS certificates
    • Checks for security vulnerabilities
    • Seamlessly integrates with SymfonyCloud
    • Works on Windows also
    Starting a new project

    View Slide

  28. • With Symfony Client
    • symfony new my_project
    • symfony new ——full my_poject
    • symfony serve
    Starting a new project

    View Slide

  29. View Slide

  30. Configuration

    View Slide

  31. No more different
    controllers for different enviroments

    View Slide

  32. Your code goes
    here

    View Slide

  33. Cache, log…

    View Slide

  34. vendors

    View Slide

  35. .env variables

    View Slide

  36. symfony.lock is used
    by flex to track which recipies are
    installed in the project

    View Slide

  37. • parameters.yaml is gone
    • more flexible but still you need to care about security
    • .env - commit - defaults
    • .env.local - gitignore
    • .env.test - commit - defaults
    • .env.test.local - gitignore
    .env

    View Slide

  38. Don’t put secrets in .env
    file!!!

    View Slide

  39. • Bundle vs no-bundle apps
    • All in src/ folder
    • App/ namespace
    • You should separate, but no need for bundles
    • Moving forward to standardisation
    • Reduces the perceived complexity, makes your code feels more
    decoupled from symfony
    • Bundle inheritance mechanisms are depricated in 3.4, removed in 4.0
    Bundle-less
    applications

    View Slide

  40. Say hi to autowiring

    View Slide

  41. • Introduced in Symfony3
    • Allows you to manage services in the container with minimal
    configuration
    • Reads type-hints on your constructor (or other methods) and
    automatically passes the correct services
    • Designed to be predictable; if it is not absolutely clear which
    dependency should be passed, you will see actionable exception
    Autowiring

    View Slide

  42. # This file is the entry point to configure your own services.
    # Files in the packages/ subdirectory configure your dependencies.
    # Put parameters here that don't need to change on each machine where the app is deployed
    # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
    parameters:
    services:
    # default configuration for services in *this* file
    _defaults:
    autowire: true # Automatically injects dependencies in your services.
    autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
    resource: '../src/Controller'
    tags: ['controller.service_arguments']
    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

    View Slide

  43. By default, all services
    are now private.
    $container->get(‘service_name’)
    is dead

    View Slide

  44. namespace App\Service;
    use App\Util\Rot13Transformer;
    class TwitterClient
    {
    private $transformer;
    public function __construct(Rot13Transformer $transformer)
    {
    $this->transformer = $transformer;
    }
    public function tweet($user, $key, $status)
    {
    $transformedStatus = $this->transformer->transform($status);
    // ... connect to Twitter and send the encoded status
    }
    }

    View Slide

  45. bin/console debug:autowiring

    View Slide

  46. • Webpack Encore is a simpler way to integrate Webpack into your
    application
    • Step forward after AsseticBundle
    • composer require webpack-encore
    • Works outside of Symfony
    Symfony Webpack
    Encore

    View Slide

  47. View Slide

  48. View Slide

  49. • Symfony on PHP 7.2 makes your code quite a bit faster than 7.1
    • Symfony 2.3 is the second fastest Symfony release since 2.0
    • Symfony 3.4 is the slowest release since 2.0 (deprecated features are
    probably one of the reasons);
    • Symfony 4.0 is almost three times faster as Laravel 5.5.
    Performance

    View Slide

  50. Stability and
    predictability

    View Slide

  51. • It is possible, not so complex (depending on project)
    • It will take a little bit of time
    • Upgrade first to Symfony 3.4
    Updating to Symfony4

    View Slide

  52. View Slide

  53. Keep cooding features!
    Symfony4 spirit

    View Slide

  54. • It is a great feeling working with Symfony4
    • Symfony has great community that is moving framework forward
    • Flex is amazing thing
    • New folder structure is more organised and more natural
    • Better standardisation
    A year later

    View Slide

  55. • Symfony is great as microframework
    • Higher level of abstraction is better for prototyping and building
    things faster
    • Very easy to start, but maybe new developers will think there is to
    much magic
    • Symfony as framework should not be a limitation for you
    A year later

    View Slide

  56. Thank you!

    View Slide

  57. Questions?
    Antonio Perić-Mažar
    t: antonioperic
    m: [email protected]

    View Slide