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
Post a Comment