Сервис недоступен в контейнере контроллера и не может заменить его из Listener - PullRequest
1 голос
/ 19 апреля 2020

Я портирую пользовательский пакет, который был изначально создан для 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

Спасибо

1 Ответ

0 голосов
/ 19 апреля 2020

обнаружил, что имя класса обслуживания палатки -

\ Synd \ MultiTenantBundle \ Entity \ TenantInterface

в файле комплектов service.yaml.

Попробуйте изменить контроллер так, чтобы вы вводили услугу:

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Repository\ClientRepository;
use Synd\MultiTenantBundle\Entity\TenantInterface;

class DefaultController extends AbstractController 
{

    function index(TenantInterface $client) 
    {
        return new Response(
            '<html><body>Welcome to My Symfony 5 demo!'.
            '<br>Client: ' . $client->getDomain() .
            '</body></html>'
            );
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...