Timothée Barray
Présentations plus anciennes disponibles sur : https://speakerdeck.com/tyx
Symfony Live 2020 Paris
Pourquoi un monolithe modulaire ?
Comment bien démarrer
id | 123 |
---|---|
username | tyx |
timbarray@gmail.com | |
firstname | Tim |
lastname | Barray |
address | 10 rue rivoli 75001 |
password | mqlsmdqdlkq |
phonenumber | 0606060909 |
role | [ROLE_ADMIN] |
Blog
Identity
Besoin de construire des logiciels qui peuvent être modifiés continuellement.
Aussi important que la construction d’un logiciel qui fonctionne.
Les besoins vont changer c’est sûr !
Agilité = capacité de changer les choses rapidement
La règle :
Aucun appel à une classe
d'un autre module
Une frontière est traversée quand un concept avec le même nom n’a plus la même utilité.
Privé
Public
Contrat
Liberté
Payment propose
Basket contractualise son besoin
PaymentService::pay(int $amount): PaymentResult
PaymentGateway::pay(int $amount): bool
PaymentModuleGateway::pay(int $amount): bool
Basket implémente son besoin via la proposition de Payment
ACL : Anti Corruption Layer
Frontières
Ouvertures
IdentityProvider
Reservation
id | 123 |
username | tyx |
timbarray@gmail.com |
table user
id | 456 |
check_in_at | 2020-09-23 15:00 |
check_out_at | 2020-09-24 10:00 |
nb_guests | 1 |
booker_id | 123 |
table reservation
<?php declare(strict_types=1);
namespace Vendor\Basket\Infra;
use Vendor\Basket\Domain\PaymentGateway;
use Symfony\Contracts\HttpClient\HttpClientInterface;
final class HttpPaymentGateway implements PaymentGateway
{
private HttpClientInterface $httpClient;
public function __construct(HttpClientInterface $httpClient)
{
$this->httpClient = $httpClient;
}
public function pay(int $amount): bool
{
$json = $this->httpClient->request('POST', '/pay', ['json' => [
'amount' => $amount
]])->toArray();
return 'ok' === $json['status'] ?? false;
}
}
<?php declare(strict_types=1);
namespace Gogaille;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
class Kernel extends BaseKernel
{
use MicroKernelTrait;
protected function configureContainer(ContainerConfigurator $container): void
{
$container->import('../config/{packages}/*.yaml');
$container->import("../config/{packages}/{$this->environment}/*.yaml");
$container->import('../config/{services}.yaml');
$container->import('./*/Resources/{services}.yaml');
$container->import("../config/{services}_{$this->environment}.yaml");
$container->import("./*/Resources/{services}_{$this->environment}.yaml");
}
protected function configureRoutes(RoutingConfigurator $routes): void
{
$routes->import("../config/{routes}/{$this->environment}/*.yaml");
$routes->import('../config/{routes}/*.yaml');
$routes->import('../config/{routes}.yaml');
$routes->import('./*/Resources/routes/*.yaml');
}
}
Fréquence de modification
Criticité
critique et changeant
critique et stable
peu critique et changeant
Pas d'urgence
Super pour commencer
Objectif principal
<?php
if ($form['payment_mean'] === 'cb') {
$this->legacyPayment->pay();
} else {
$this->multiPayment->pay();
}
Basket
Paiement
MultiPaiment
Bulle
ACL
ACL
Bulle
MultiPaiment
ACL
ACL
Paiement
nouvelle db
legacy db
By Timothée Barray
Symfony Live 2020 - Paris - 23 septembre 2020
Présentations plus anciennes disponibles sur : https://speakerdeck.com/tyx