Невозможно использовать службы sylius - PullRequest
0 голосов
/ 11 февраля 2019

Служба "sylius.repository.product" не найдена: даже если она существует в контейнере приложения, контейнер внутри "App \ Controller \ Shop \ SubscribeBoxController" - это меньший локатор службы, который знает только о "доктрине", "form.factory "," http_kernel "," parameter_bag "," request_stack "," router "," security.authorization_checker "," security.csrf.token_manager "," security.token_storage "," serializer "," session ","услуги шаблонизаторов и "веток".Попробуйте вместо этого использовать внедрение зависимостей.

Я получил эту ошибку, когда пытался использовать службы sylius на своем контроллере:

public function index(Request $request)
{
    $subscribed = new Subscribed();
    $subscribeForm = $this->createForm(SubscribeType::class, $subscribed);
    $subscribeForm->handleRequest($request);

    if ($subscribeForm->isSubmitted() && $subscribeForm->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($subscribed);
        $entityManager->flush();

        return $this->redirectToRoute('subscribe_details');
    }

    /** @var ProductRepository $productRepository */
    $productRepository = $this->get('sylius.repository.product');
    $product = $productRepository->findAll();

    return $this->render('@SyliusShop/Subscribe/plan.html.twig', [
        'form' => $subscribeForm->createView(),
        'product' => $product,
    ]);
}

Так что, если кто-нибудь знает об этой ошибке, дайте мне знать!:)

1 Ответ

0 голосов
/ 14 февраля 2019

Symfony, похоже, отходит от прямого доступа к контейнеру сервисов и использует инъекцию зависимостей для получения сервисов внутри контроллеров.Кроме того, Sylius полностью поддерживает это - большинство их собственных контроллеров даже не расширяют старые базовые контроллеры Symfony.

Есть две вещи, которые вы можете попробовать.Во-первых, если вы хотите получить доступ к службам непосредственно из контейнера служб (И эти службы являются общедоступными), вы можете внедрить экземпляр контейнера служб в своем конструкторе.

private $fullServiceContainer;
public function __construct(
    \Symfony\Component\DependencyInjection\ContainerInterface $container
) {
    $this->fullServiceContainer = $container;
}

//...
$this->fullServiceContainer->get('sylius.repository.product')

Во-вторых, вы можете внедрить службусебя если служба имеет имя или псевдоним, который выглядит как класс PHP.Я вижу, что служба sylius.repository.product существует в контейнере

$ php bin/console debug:container sylius.repository.product

Information for Service "sylius.repository.product"
===================================================

 ---------------- --------------------------------------------------------- 
  Option           Value                                                    
 ---------------- --------------------------------------------------------- 
  Service ID       sylius.repository.product                                
  Class            Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository  
  Tags             -                                                        
  Public           yes                                                      
  Synthetic        no                                                       
  Lazy             no                                                       
  Shared           yes                                                      
  Abstract         no                                                       
  Autowired        no                                                       
  Autoconfigured   no                                                       
 ---------------- --------------------------------------------------------- 

, но ее класс - Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository, по-видимому, не связан со службой.

$ php bin/console debug:container ProductRepository                                                     
  No services found that match "ProductRepository".  

Это означает, что если вы хотите внедрить репозиторий продукта, вам потребуется создать псевдоним в вашем собственном приложении Symfony, и это начинает выходить за рамки одного ответа переполнения стека.

Две статьи (самостоятельные ссылки), которые могут быть вам интересны, если вы хотите обернуть голову вокруг Sylius / Symfony и сервисного контейнера.

Сервисный контейнер Symfony

Symfony: Услуги по электромонтажу https://alanstorm.com/symfonys-service-container/

...