2017-02-25 1 views
0

J'ai cherché toute la journée un moyen d'accéder à une entité de canal dans le ProductType (qui étend AbstractResourceType) dans Sylius. Plus précisément, je dois obtenir l'entité de canal 'US_Web_Store' dans la fonction buildForm() de la classe ProductType (src/Sylius/Bundle/ProductBundle/Forme/Type/ProductType.php)Injecter EntityManager dans AbstractResourceType Sylius

Voici mon code:

src/Sylius/Bundle/ProductBundle/Forme/type/ProductType.php

namespace Sylius\Bundle\ProductBundle\Form\Type; 

use Doctrine\ORM\EntityManagerInterface; 

class ProductType extends AbstractResourceType 
{ 

    private $variantResolver; 
    private $em; 

    public function __construct($dataClass, $validationGroups, ProductVariantResolverInterface $variantResolver, EntityManagerInterface $em) { 
     parent::__construct($dataClass, $validationGroups); 

     $this->variantResolver = $variantResolver; 
     $this->em = $em; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $product = $builder->getData(); 
     $product->addChannel($this->container->get('sylius.repository.channel')->findOneBy(['code' => 'US_Web_Store'])); 

     [...] 
    } 

} 

ensuite dans src/Sylius/Bundle/ProductBundle/Ressources/config/services.xml:

<service id="product.form.type.product" class="Sylius\Bundle\ProductBundle\Form\Type\ProductType"> 
    <argument type="service" id="doctrine.orm.entity_manager"/> 
</service> 

Et l'erreur que je reçois est:

erreur de type: Argument 4 est passé à Sylius \ Bundle \ ProductBundle \ Form \ type \ ProductType :: __ construct() doit mettre en œuvre l'interface Doctrine \ ORM \ EntityManagerInterface, aucune donnée

J'ai aussi essayé passer le dépôt de canal via:

Mais eu le même problème. Rien n'est jamais passé au contrôleur, donc je suis sûr que je manque quelque chose de fondamental ici.

+0

semble que vous avez besoin tous les quatre arguments dans la définition du service. vous n'en avez qu'un. – craigh

+0

Je ne sais pas d'où viennent les 3 autres services, j'ai essayé de les chercher et je suis revenu les mains vides. Mais je suis sûr qu'ils sont injectés d'accord ailleurs, par défaut, je n'ai pas ajouté ceux-ci.Vous remarquerez que l'erreur n'a qu'un problème avec le quatrième argument, et c'est le seul que j'ai ajouté. – carbide20

Répondre

1

Il y a quelques problèmes dans votre code.

  1. Vous utilisez un ProductType de Sylius, ce qui signifie qu'il sera utilisé au lieu du défaut. Cependant, votre identifiant de service est différent de celui de Sylius (vous avez product.form.type.product, en Sylius c'est sylius.form.type.product). En conséquence, vous aurez deux services utilisant le même Sylius\Bundle\ProductBundle\Form\Type\ProductType. L'exception que vous avez est provoquée par le service sylius.form.type.product qui utilise maintenant votre classe qui nécessite le quatrième paramètre, mais il ne l'obtient pas. Événement si vous nommez le service avec la même clé, il lèvera quand même une exception, car vous devez transmettre les 4 paramètres au constructeur dans la définition de service, comme cela a déjà été le cas pour craigh. Si vous ne savez pas ce qu'ils sont, vous devriez regarder la définition du service sylius.form.type.product. Pour connaître la meilleure façon de contourner les formulaires Sylius, consultez le chapitre Customizing Forms de docs.
  2. Si vous souhaitez obtenir le canal par code, vous devez toujours utiliser le référentiel pour ce service (sylius.repository.channel).
  3. Si vous souhaitez simplement définir un canal sur un produit nouvellement créé, pourquoi ne pas simplement utiliser l'usine personnalisée pour cela? C'est plus propre et ne devrait pas entraîner d'erreurs inattendues dans le futur. Encore une fois, consultez proper documentation chapter pour savoir comment le faire correctement.

espère que cela vous aidera;)

+0

Toutes ces informations sont extrêmement utiles. Merci beaucoup d'avoir pris le temps de partager vos connaissances! – carbide20