symfony - Symfony2 FormType Dependency Injection -


i have used di in controller, repository. repository extend baserepository. when using formtype gives error. error message:

contexterrorexception: catchable fatal error: argument 2 passed personal\sitebundle\repository\baserepository::__construct() must instance of memcache, instance of doctrine\orm\mapping\classmetadata given, called in /home/personal/www/vendor/doctrine/orm/lib/doctrine/orm/repository/defaultrepositoryfactory.php on line 75 , defined in /home/personal/www/src/personal/sitebundle/repository/baserepository.php line 22 

how think? structure follows

adminbundle/services.yml

personaladmin.towncontroller:     class: personal\adminbundle\controller\towncontroller     arguments: ["@personalsite.townrepository", "@doctrine.orm.entity_manager", "@personalsite.townformtype"]     parent: "personaladmin.basecontroller" 

sitebundle/services.yml

services: memcache:     class: memcache     calls:         - [addserver , [127.0.0.1, 11211]] personalsite.baserepository:     class: personal\sitebundle\repository\baserepository     arguments:         entitymanager: "@doctrine.orm.entity_manager"         memcacheprovider: "@memcache" personalsite.cityrepository:     class: personal\sitebundle\repository\cityrepository     parent: personalsite.baserepository personalsite.townrepository:     class: personal\sitebundle\repository\townrepository     parent: personalsite.baserepository  personalsite.townformtype:         class: personal\sitebundle\form\towntype         arguments: ["@personalsite.cityrepository"] 

baserepository.php

    <?php namespace personal\sitebundle\repository;  use doctrine\orm\entitymanager; use \memcache;  class baserepository {      protected $_memcacheprovider;      /**      * connection      *      * @var \doctrine\orm\entitymanager      */     protected $_em;      public function __construct(         entitymanager $entitymanager,         memcache $memcachedprovider     )     {         $this->_memcacheprovider = $memcachedprovider;         $this->_em  = $entitymanager;     }  } 

towncontroller.php

<?php  namespace personal\adminbundle\controller;  use doctrine\orm\entitymanager; use symfony\bundle\frameworkbundle\controller\controller; use sensio\bundle\frameworkextrabundle\configuration\route; use sensio\bundle\frameworkextrabundle\configuration\template;   use symfony\component\httpfoundation\request; use personal\adminbundle\controller\basecontroller; use personal\sitebundle\form\towntype; use personal\sitebundle\entity\town; use personal\sitebundle\repository\townrepository;  /**  * @route("/town", service="personaladmin.towncontroller")  */ class towncontroller extends basecontroller {      protected $_townrepository;     protected $_entitymanager;      public function __construct(         townrepository $townrepository,         entitymanager $entitymanager,         towntype $towntype     )     {         $this->_townrepository  = $townrepository;         $this->_entitymanager   = $entitymanager;         $this->_towntype        = $towntype;     }      /**      * @route("/list", name="managerv3_town_list")      * @template()      */     public function townsaction()     {         $contents = $this->_townrepository->getall();          return $this->render('personaladminbundle:town:list.html.twig', array('contents' => $contents));     }      /**      * @route("/add", name="managerv3_town_add", defaults={"id" = null})      * @route("/edit/{id}", name="managerv3_town_edit", defaults={"id" = null})      * @template()      */     public function townaction(request $request, $id)     {         if( is_null($id) )         {             $content = new town();         }         else         {             $content = $this->_townrepository->getsingle(array( 'id' => $id ));         }         $form = $this->createform($this->_towntype, $content);          if($request->getmethod() == 'post')         {             $form->bind($request);             if($form->isvalid())             {                 $this->_entitymanager->persist($content);                 $this->_entitymanager->flush();                 return $this->redirect( $this->generateurl('managerv3_town_list') );             }         }          return $this->render('personaladminbundle:town:form.html.twig', array('form' => $form->createview()));     } 

townrepository.php

<?php  namespace personal\sitebundle\repository;  use doctrine\orm\entityrepository; use personal\sitebundle\repository\baserepository; use doctrine\orm\query;  /**  * townrepository  *  * class generated doctrine orm. add own custom  * repository methods below.  */ class townrepository extends baserepository {     function getall( $orderby = array('town.title' => 'asc'), $hydratemode = false )     {         $towns =             $this->_em                 ->createquerybuilder()                 ->select('town,city')                 ->from('personalsitebundle:town', 'town')                 ->leftjoin('town.city','city');          foreach( $orderby $okey => $oval )         {             $towns->orderby($okey, $oval);         }          $result = $towns->getquery()             ->getresult();          return $result;     }      function getsingle( $where = array(), $hydratemode = null )     {         $content =             $this->_em                 ->createquerybuilder()                 ->select('town,city')                 ->from('personalsitebundle:town', 'town')                 ->leftjoin('town.city', 'city');          foreach( $where $condkey => $condval )         {             $parameterkey = 'town_' . $condkey;              $content->andwhere("town.{$condkey} = :{$parameterkey}");             $content->setparameter($parameterkey, $condval);         }          $result = $content->getquery();          if( $hydratemode )             return $result->getsingleresult(query::hydrate_array);          return $result->getsingleresult();     }  } 

towntype.php

<?php  namespace personal\sitebundle\form;  use personal\sitebundle\repository\cityrepository; use symfony\component\form\abstracttype; use symfony\component\form\formbuilderinterface; use symfony\component\optionsresolver\optionsresolverinterface; use personal\sitebundle\entity\city;  class towntype extends abstracttype {     private $_cityrepository;     public function __construct(cityrepository $cityrepository)     {         $this->_cityrepository = $cityrepository;     }       /**      * @param formbuilderinterface $builder      * @param array $options      */     public function buildform(formbuilderinterface $builder, array $options)     {         $builder             ->add('title', 'text', array(                 'label' => 'İlçe adı',                 'horizontal_label_class' => 'col-lg-2',                 'horizontal_input_wrapper_class' => 'col-lg-6',                 'widget_type' => 'inline'             ))             ->add('slug')             ->add('city', 'entity', array(                 'empty_value'   => 'Şehir seçiniz',                 'class' => 'personalsitebundle:city',                 'query_builder' => function(){                     return $this->_cityrepository->getall();                 },                 'property' => 'title',                 'label' => 'Şehir',                 'horizontal_label_class' => 'col-lg-2',                 'horizontal_input_wrapper_class' => 'col-lg-3',             ))         ;     }      /**      * @param optionsresolverinterface $resolver      */     public function setdefaultoptions(optionsresolverinterface $resolver)     {         $resolver->setdefaults(array(             'data_class' => 'personal\sitebundle\entity\town'         ));     }      /**      * @return string      */     public function getname()     {         return 'personal_sitebundle_town';     } } 

thanks help.

so baserepository needs extend doctrinereposotory. doctrine creates repositories using factory getrepository method. there no easy way coax pass memcache along. instead need use setter injection.

use doctrine\orm\entityrepository; class baserepository extends entityrepository {     // no constructor needed      // setter injection     setmemcachedprovider(memcache $memcachedprovider)     {         $this->_memcacheprovider = $memcachedprovider;     } 

in services.yml file rid of baserepository services , edit repository services:

personalsite.cityrepository:     class: personal\sitebundle\repository\cityrepository     factory_service: 'doctrine.orm.default_entity_manager'     factory_method:  'getrepository'     arguments:           - 'personal\sitebundle\entity\city'     calls:          - [setmemcachedprovider, ['@memcache']] 

that should trick.

i little bit curious why injecting memcache. assuming have custom repository code uses it? doctrine ignore it. if trying configure doctrine use memcache different process altogether.


Comments

Popular posts from this blog

user interface - How to replace the Python logo in a Tkinter-based Python GUI app? -

objective c - Greedy NSProgressIndicator Allocation -

how to set an OCR language in Google Drive -