Console Colors True color support via Hex CSS colors https://github.com/symfony/symfony/pull/36802 $color = new Color('black', 'white'); echo $color->apply("foo"); $color = new Color('#000000', '#ffffff');
https://symfony.com/blog/new-in-symfony-5-1-cursor-control namespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Cursor; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class SomeCommand extends Command { protected static $defaultName = 'app:some-command'; protected function execute(InputInterface $input, OutputInterface $output) { // ... $cursor = new Cursor($output); // argument for left/right is "number of columns" (1 by default) // argument for top/bottom is "number of rows" (1 by default) $cursor->moveUp(2)->moveRight(); $cursor->moveDown(); // move to an arbitrary (column, row) position $cursor->moveToPosition(7, 15); // you can show/hide the cursor, save/restore its position, etc. $cursor->savePosition()->hide(); } }
Default Command vs Single Command Applications #!/usr/bin/env php use Symfony\Component\Console\SingleCommandApplication; require __DIR__.'/vendor/autoload.php'; (new SingleCommandApplication()) ->setCode( function (InputInterface $input, OutputInterface $output) { // add here the code of your console command... } ) ->run(); #!/usr/bin/env php use Dbu\SnakeBundle\Command\SnakeCommand; use Symfony\Component\Console\Application; require __DIR__.'/vendor/autoload.php'; $app = new Application(); $app->add(new SnakeCommand()); $app->setDefaultCommand('game:snake'); $app->run(); 5.1
$invitation = '{organizer_gender, select, female {{organizer_name} has invited you for her party!} male {{organizer_name} has invited you for his party!} other {{organizer_name} have invited you for their party!} }'; // prints "Ryan has invited you for his party!" echo $translator->trans($invitation, [ 'organizer_name' => 'Ryan', 'organizer_gender' => 'male', ]); Translation: Standard ICU message format https://github.com/symfony/symfony/pull/37371
Uid: Better framework integration https://symfony.com/components/Uid Support in Serializer (via a dedicated Normalizer) - Just works Uid Doctrine types and generators Help needed - https://github.com/symfony/symfony/issues/36102 Uid constraint and more 5.1
Skeleton code simplification HTTP Cache in public/index.php framework: http_cache: true No more PHP to enable PHP HTTP caching ❤ https://github.com/symfony/symfony/pull/37351
Semaphore Component A semaphore allows N processes to access a resource A lock allows only 1 process to access a resource https://github.com/symfony/symfony/pull/35780
RateLimiter Component use Symfony\Component\RateLimiter\Storage\InMemoryStorage; use Symfony\Component\RateLimiter\Limiter; $limiter = new Limiter([ 'id' => 'login', 'strategy' => 'token_bucket', // or 'fixed_window' 'limit' => 10, 'rate' => ['interval' => '15 minutes'], ], new InMemoryStorage()); // blocks until 1 token is free to use for this process $limiter->reserve(1)->wait(); // ... execute the code // only claims 1 token if it's free at this moment if ($limiter->consume(1)) { // ... execute the code } RateLimiter Lock ??? Cache https://github.com/symfony/symfony/pull/37546
Security Authenticators unlock a lot of features Magic login link authentication https://github.com/symfony/symfony/pull/38177 2fa authentication https://github.com/scheb/2fa Help needed - https://github.com/symfony/symfony/issues/30914 Sudo mode and more
Security Bootstrap a new project the fast way $ symfony new --version=next demo $ composer req maker profiler orm validator form security $ vi docker-compose.yml $ docker-compose up -d $ symfony server:start -d $ symfony open:local version: '3' services: database: image: postgres:12-alpine environment: POSTGRES_USER: main POSTGRES_PASSWORD: main POSTGRES_DB: main ports: [5432] mailer: image: schickling/mailcatcher ports: [1025, 1080]
The name of the security user class (e.g. User) [User]: > Do you want to store user data in the database (via Doctrine)? (yes/no) [yes]: > Enter a property name that will be the unique "display" name for the user (e.g. email, username, uuid) [email]: > Will this app need to hash/check user passwords? Choose No if passwords are not needed or will be checked/hashed by some other system (e.g. a single sign-on server). Does this app need to hash/check user passwords? (yes/no) [yes]: > $ symfony console make:user
What style of authentication do you want? [Empty authenticator]: [0] Empty authenticator [1] Login form authenticator > 1 The class name of the authenticator to create (e.g. AppCustomAuthenticator): > AppAuthenticator Choose a name for the controller class (e.g. SecurityController) [SecurityController]: > Do you want to generate a '/logout' URL? (yes/no) [yes]: > $ symfony console make:auth
Creating a registration form for App\Entity\User Do you want to add a @UniqueEntity validation annotation on your User class to make sure duplicate accounts aren't created? (yes/no) [yes]: > Do you want to send an email to verify the user's email address after registration? (yes/no) [yes]: > [WARNING] We're missing some important components. Don't forget to install these after you're finished. composer require symfonycasts/verify-email-bundle symfony/mailer What email address will be used to send registration confirmations? e.g. [email protected]: > [email protected] What "name" should be associated with that email address? e.g. "Acme Mail Bot": > Demo Bot Do you want to automatically authenticate the user after registration? (yes/no) [yes]: > $ symfony console make:registration-form
--- a/src/Security/AppAuthenticator.php +++ b/src/Security/AppAuthenticator.php @@ -96,8 +96,7 @@ class AppAuthenticator extends AbstractFormLoginAuthenticator implements Passwor return new RedirectResponse($targetPath); } - // For example : return new RedirectResponse($this->urlGenerator->generate('some_route')); - throw new \Exception('TODO: provide a valid redirect inside '.__FILE__); + return new RedirectResponse($this->urlGenerator->generate('app_login')); } protected function getLoginUrl() $ symfony console make:registration-form
PHP 8 Attributes use Symfony\Component\Routing\Attribute\Route; class ActionPathController { #[Route('/{name}', name: 'hello')] public function action() { } } class AutowireSetter { #[Required] public function setFoo(Foo $foo): void { } } https://github.com/symfony/symfony/pull/37545 https://github.com/symfony/symfony/pull/37474
PHP 8 Attributes We need your help https://github.com/symfony/symfony/issues/38096 https://github.com/symfony/symfony/pull/38162 Add support for Constraints Think of new possibilities Replace SensioFrameworkExtraBundle public function searchAction( #[RequestQuery] string $q, #[RequestQuery] int $page = 1 ) {