Атрибут When
Атрибут When используется для условной
регистрации сервисов в контейнере зависимостей.
Он вешается на класс сервиса и принимает условие,
при котором этот сервис должен быть доступен.
Если условие не выполняется, сервис не попадает
в контейнер. Первым параметром передаётся
условие, вторым - необязательный признак
отрицания.
Синтаксис
#[When(env: env, not: not)]
Пример
Давайте зарегистрируем сервис только для
окружения 'dev':
<?php
namespace AppService;
use SymfonyComponentDependencyInjectionAttributeWhen;
#[When(env: 'dev')]
class ArticleService
{
public function getText(): string
{
return 'hello';
}
}
?>
Теперь сервис ArticleService будет
доступен только в окружении 'dev'.
В других окружениях контейнер не будет его
содержать.
Пример
Давайте используем параметр not, чтобы
зарегистрировать сервис во всех окружениях,
кроме 'test':
<?php
namespace AppService;
use SymfonyComponentDependencyInjectionAttributeWhen;
#[When(env: 'test', not: true)]
class ArticleService
{
public function getText(): string
{
return 'article';
}
}
?>
Теперь сервис ArticleService доступен
в 'dev' и 'prod', но не
в 'test'.
Пример
Давайте проверим наличие сервиса в контейнере в зависимости от окружения:
<?php
namespace AppController;
use AppServiceArticleService;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$has = $this->container->has(ArticleService::class);
return new Response($has ? 'yes' : 'no');
}
}
?>
Результат выполнения кода в окружении
'dev':
"yes"
Результат выполнения кода в окружении
'prod':
"no"