Infrastructure
Cache, sessions, uploads, filesystem et client HTTP sans coupler l’application aux internals du framework.
Mettre en cache les données reconstructibles
Utilisez CacheManager pour les données qui peuvent être recalculées, comme des listes d’articles ou la navigation. Le cache n’est pas une source de vérité.
use Lemonade\Framework\Cache\CacheManager;
final class ArticleFeed
{
public function __construct(
private readonly CacheManager $cache,
) {}
public function latest(): array
{
return $this->cache->remember('articles.latest', 600, function (): array {
return [];
});
}
}Sessions et messages flash
Dans les controllers, flash() est un moyen pratique d’envoyer des messages ponctuels à travers un redirect. En dehors des controllers, injectez explicitement l’abstraction de session ou de flash.
$this->flash()->set('success', 'Article saved.');
return $this->redirect($this->url()->route('articles.index'));Uploads et filesystem
Utilisez upload() avec des profils configurés pour les uploads et filesystem() pour les opérations sur fichiers. Gardez les limites et répertoires cibles dans la configuration YAML.
$image = $this->upload()->uploadImage('image', 'article_image');
$content = $this->filesystem()->read($this->app()->basePath('README.md'));Client HTTP
Pour les intégrations sortantes, injectez Psr\Http\Client\ClientInterface avec une PSR request factory. Configurez les timeouts et SSL dans HttpClient.yaml.
<?php
declare(strict_types=1);
namespace App\Services;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
final class StatusApi
{
public function __construct(
private readonly ClientInterface $client,
private readonly RequestFactoryInterface $requests,
) {}
public function check(): void
{
$request = $this->requests->createRequest('GET', 'https://status.example.test/health');
$this->client->sendRequest($request);
}
}