Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

2005.

Slide 8

Slide 8 text

php 5.3 2009. 2005.

Slide 9

Slide 9 text

php 5.3 2009. 2005. 2015.

Slide 10

Slide 10 text

php 5.3 2009. 2005. 2015. Nov 2017.

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

• 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?

Slide 13

Slide 13 text

– 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.”

Slide 14

Slide 14 text

Composition over inheritance

Slide 15

Slide 15 text

• 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

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Decide which package to install Run any task to configure them

Slide 22

Slide 22 text

{ "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

Slide 23

Slide 23 text

• 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

Slide 24

Slide 24 text

https://flex.symfony.com/

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

• 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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

Configuration

Slide 31

Slide 31 text

No more different controllers for different enviroments

Slide 32

Slide 32 text

Your code goes here

Slide 33

Slide 33 text

Cache, log…

Slide 34

Slide 34 text

vendors

Slide 35

Slide 35 text

.env variables

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

• 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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

• 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

Slide 40

Slide 40 text

Say hi to autowiring

Slide 41

Slide 41 text

• 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

Slide 42

Slide 42 text

# 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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

transformer = $transformer; } public function tweet($user, $key, $status) { $transformedStatus = $this->transformer->transform($status); // ... connect to Twitter and send the encoded status } }

Slide 45

Slide 45 text

bin/console debug:autowiring

Slide 46

Slide 46 text

• 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

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

• 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

Slide 50

Slide 50 text

Stability and predictability

Slide 51

Slide 51 text

• 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

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

Keep cooding features! Symfony4 spirit

Slide 54

Slide 54 text

• 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

Slide 55

Slide 55 text

• 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

Slide 56

Slide 56 text

Thank you!

Slide 57

Slide 57 text

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