Christian Flothmann
Symfony Core Team &
Documentation Team
work at SensioLabs Germany
github.com/xabbuh
@xabbuh
Slide 3
Slide 3 text
The Symfony
Release Cycle
Slide 4
Slide 4 text
No content
Slide 5
Slide 5 text
• one patch release a month
• minor releases twice a year
• new major releases every two years
• N.4 at the same time as (N+1).0
• N.4 is an LTS release
The Symfony Release Cycle
http://symfony.com/roadmap
Slide 6
Slide 6 text
Symfony 3.3
Slide 7
Slide 7 text
Workflow
Slide 8
Slide 8 text
• new Twig function:
workflow_has_place()
• new Event: workflow.entered
Workflow
Slide 9
Slide 9 text
Dotenv
Slide 10
Slide 10 text
• new component
• reads .env files
• makes them available through getenv(),
$_SERVER, and $_ENV
Dotenv
Slide 11
Slide 11 text
An example .env file
# Database credentials
DB_USER=root
DB_PASS=pass # the DB password
Slide 12
Slide 12 text
Loading a .env file
$loader = require __DIR__.'/../app/autoload.php';
use Symfony\Component\Dotenv\Dotenv;
if (file_exists(__DIR__.'/../.env')) {
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/../.env');
}
Debug::enable();
$kernel = new AppKernel('dev', true);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
Slide 13
Slide 13 text
Cache
Slide 14
Slide 14 text
• compatible with PSR-16
o simple caching Layer
o support to convert PSR-16 caches to PSR-6 adapters
and vice versa
• Memcached Support
Cache
Slide 15
Slide 15 text
Cache – PSR-6
interface CacheItemInterface
{
public function getKey();
public function get();
public function isHit();
public function set($value);
public function
expiresAt($expiration);
public function
expiresAfter($time);
}
Slide 16
Slide 16 text
Cache – PSR-6
interface CacheItemPoolInterface
{
public function getItem($key);
public function getItems(array $keys = array());
public function hasItem($key);
public function clear();
public function deleteItem($key);
public function deleteItems(array $keys);
public function save(CacheItemInterface $item);
public function saveDeferred(CacheItemInterface
$item);
public function commit();
}
Slide 17
Slide 17 text
Cache – PSR-16
interface CacheInterface
{
public function get($key, $default = null);
public function set($key, $value, $ttl = null);
public function delete($key);
public function clear();
public function getMultiple($keys, $default = null);
public function setMultiple($values, $ttl = null);
public function deleteMultiple($keys);
public function has($key);
}
Slide 18
Slide 18 text
Cache – Using PSR-16 Caches
use Symfony\Component\Cache\Simple\FilesystemCache;
$cache = new FilesystemCache();
$cache->set('stats.num_products', 4711, 3600);
if (!$cache->has('stats.num_products')) {
// ... item does not exists in the cache
}
$numProducts = $cache->get(
'stats.num_products‘,
100
);
$cache->delete('stats.num_products');
$cache->clear();
Slide 19
Slide 19 text
Cache – PSR-16 to PSR-6
use Symfony\Component\Cache\Simple\FilesystemCache;
use Symfony\Component\Cache\Adapter\SimpleCacheAdapter;
$psr16Cache = new FilesystemCache();
$psr6Cache = new SimpleCacheAdapter($psr16Cache);
Slide 20
Slide 20 text
Cache – PSR-6 to PSR-16
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Simple\Psr6Cache;
$psr6Cache = new FilesystemAdapter();
$psr16Cache = new Psr6Cache($psr6Cache);
Importing config files using glob patterns
imports:
- { resource: "*.yml" }
- { resource: "common/**/*.xml" }
- { resource: "/etc/myapp/*.{yml,xml}" }
- { resource:
"bundles/*/{xml,yaml}/services.{yml,xml}" }
Support for double star (**) in glob patterns is part of the Finder component in 3.3.
Slide 24
Slide 24 text
• class is optional, falls back to id
• support for default values per file
• inheritance of tags from parent
definition
Configuration improvements
• component is to be removed
• use Composer instead
• (or any other PSR-4 compatible
autoloader package)
ClassLoader
Slide 43
Slide 43 text
DependencyInjection
Slide 44
Slide 44 text
• service identifiers are case sensitive
• invalid options (YAML format) lead to
exceptions
• private services are not accessible
through Container::has() or
Container::get(), inject them if needed
DependencyInjection
• choices_as_values option removed
• part of BC layer of Symfony 2.7
• deprecated since Symfony 3.1
ChoiceType
Slide 49
Slide 49 text
• dropped support to pass callables as
strings to choice_value/choice_label
ChoiceType
Slide 50
Slide 50 text
Callable as string, before Symfony 4
public function buildForm(
FormBuilderInterface $builder,
array $options
) {
$builder->add(
'categories',
ChoiceType::class,
[
'choice_label' => 'strtolower',
]
);
}
Slide 51
Slide 51 text
Callables in Symfony 4
public function buildForm(
FormBuilderInterface $builder,
array $options
) {
$builder->add(
'categories',
ChoiceType::class,
[
'choice_label' => function ($choice) {
return strtolower($choice);
},
]
);
}
Slide 52
Slide 52 text
• isValid() cannot be called for not
submitted forms
Form
Slide 53
Slide 53 text
Before Symfony 4
$form = $this->createForm(
UserType::class,
$user
);
$form->handleRequest($request);
if ($form->isValid()) {
// do something with
// the submitted data
}
Slide 54
Slide 54 text
Symfony 4
$form = $this->createForm(
UserType::class,
$user
);
$form->handleRequest($request);
if (
$form->isSubmitted() && $form->isValid()
) {
// do something with
// the submitted data
}
Slide 55
Slide 55 text
HttpFoundation
Slide 56
Slide 56 text
• lots of methods are final
• don‘t override them in custom response
classes
Response
Slide 57
Slide 57 text
• isMethodSafe() doesn‘t check for
cacheable methods
• HEAD and GET are cacheable
• OPTIONS and TRACE are safe too
Request
Slide 58
Slide 58 text
Cacheable methods check before 4.0
if (
$request->isMethodSafe()
) {
// true for GET, HEAD
}
Slide 59
Slide 59 text
Cacheable methods check with Symfony 4
if (
$request->isMethodCacheable()
) {
// true for GET, HEAD
}
Slide 60
Slide 60 text
Check for safe methods
// note: true necessary only for
// BC in Symfony 3.x
if (
$request->isMethodSafe(true)
) {
// true for GET, HEAD,
// OPTIONS, and TRACE
}
Slide 61
Slide 61 text
Security
Slide 62
Slide 62 text
• RoleInterface removed
• use strings for roles
• not recommend: extending the Role
class
o Role class likely to be removed too
Security
Slide 63
Slide 63 text
Validator
Slide 64
Slide 64 text
• base class for validator tests located in
Symfony\Component\Validator\Test (not
Tests)
AbstractConstraintValidatorTest