Я портирую пользовательский пакет, который был изначально создан для symfony 2, на Symfony 5. Внутри пакета есть прослушиватель с этой функцией:
public function onEarlyKernelRequest(RequestEvent $event)
{
if (!$tenant = $this->tenantStrategy->getTenant()) {
$this->dispatcher->dispatch($tEvent = new TenantEvent(null, $event), TenantEvents::TENANT_NOT_FOUND);
if (!$tEvent->getTenant()) {
return;
}
}
$this->dispatcher->dispatch(new TenantEvent($tenant, $event), TenantEvents::TENANT_FOUND);
//$this->container->set('synd_multitenant.tenant', $tenant);
}
Когда я удаляю комментарий из последняя строка, в которой я получаю эту ошибку: служба "synd_multitenant.tenant" уже инициализирована, вы не можете заменить ее. С этой строкой, закомментированной, когда я пытаюсь получить службу от контроллера, я получаю это сообщение:
Service "synd_multitenant.tenant" not found: even though it exists in the app's container, the container inside "App\Controller\DefaultController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services. Try using dependency injection instead.
И в случае, если это уместно, мне пришлось перейти на RequestEvent от GetResponseEvent, потому что GetResponseEvent не поддерживается больше. Вот контроллер, где я пытаюсь использовать службу:
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Repository\ClientRepository;
class DefaultController extends AbstractController {
function index() {
//$entityManager = $this->getDoctrine()->getManager();
//$clientRepository = $entityManager->getRepository('App\Entity\Client');
//$client = $clientRepository->findOneBy(array('domain' => 'someclient.mysymfony.local'));
$client = $this->get('synd_multitenant.tenant');
return new Response(
'<html><body>Welcome to My Symfony 5 demo!'.
'<br>Client: ' . $client->getDomain() .
'</body></html>'
);
}
}
Вот вывод консольной отладки:
$ php bin/console debug:container synd_multitenant.tenant
Information for Service "synd_multitenant.tenant"
=================================================
---------------- -----------------------------------------------
Option Value
---------------- -----------------------------------------------
Service ID synd_multitenant.tenant
Class Synd\MultiTenantBundle\Entity\TenantInterface
Tags -
Public yes
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired yes
Autoconfigured yes
---------------- -----------------------------------------------
Полный код доступен в этом репозитории github: https://github.com/karimmtl/Mysymfony5
Спасибо