2012-09-25 9 views
6

तो को पास नहीं कर रहे हैं, यहाँ एक नियंत्रक मैं बस का निर्माण किया है है निर्भरता इंजेक्शन का उपयोग करने के लिए। तो, यहाँ मेरी services.xml फ़ाइल है:Symfony2 में सेवा के रूप में मेरे नियंत्रकों परिभाषित करने के लिए कोशिश कर रहा है तर्क निर्माता

<?xml version="1.0" ?> 

<container xmlns="http://symfony.com/schema/dic/services" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> 


    <services> 
     <service id="mdpapi_image.json_response" class="Symfony\Component\HttpFoundation\JsonResponse" /> 
     <service id="mdpapi_image.request" class="Symfony\Component\HttpFoundation\Request" /> 
     <service id="mdpapi_image.controller.retriever" class="MDP\API\ImageBundle\Controller\RetrieverController"> 
      <argument type="service" id="mdpapi_image.json_response" /> 
      <argument type="service" id="mdpapi_image.request" /> 
     </service> 
    </services> 
</container> 

हालांकि, जब मैं अपने नियंत्रक निष्पादित करने के लिए प्रयास करते हैं, मैं हमेशा इस अपवाद:

Catchable घातक त्रुटि: तर्क 1 MDP के लिए पारित \ एपीआई \ ImageBundle \ नियंत्रक \ RetrieverController :: __ निर्माण() सिम्फनी \ घटक \ HttpFoundation \ JsonResponse का एक उदाहरण होना चाहिए, किसी भी दिए गए, /home/steve/projects/APIs/app/cache/dev/jms_diextra/controller_injectors/MDPAPIImageBundleControllerRetrieverController.php पर लाइन में नहीं दिया जाना चाहिए 13 और /home/steve/projects/ImageAPI/ImageBundle/Controller/RetrieverController.php लाइन 13

में परिभाषित

जब मैं देव मोड में हूँ, मुझे लगता है कि Symfony संचित फ़ाइलें में इस फाइल उत्पन्न ...

class RetrieverController__JMSInjector 
{ 
    public static function inject($container) { 
     $instance = new \MDP\API\ImageBundle\Controller\RetrieverController(); 
     return $instance; 
    } 
} 

मैं इसे कैसे इतना कर सकते हैं कि तर्क नियंत्रक को सही ढंग से जोड़ रहे हैं, में निर्दिष्ट की तरह मेरी services.xml फ़ाइल?

उत्तर

0

लगता है जैसे आप एक extension class कि आपके services.xml फ़ाइल loads लिखना भूल:

namespace MDP\API\ImageBundle\DependencyInjection; 

use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; 
use Symfony\Component\Config\FileLocator; 

class ImageExtension extends Extension 
{ 
    /** 
    * @param array $configs 
    * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $loader = new XmlFileLoader(
      $container, 
      new FileLocator(__DIR__.'/../Resources/config') 
     ); 

     $loader->load('services.xml'); 
    } 
} 
+0

हाँ, मैं भी इस विस्तार के कोड है। अभी भी काम नहीं करता है ... – iRESTful

1

तो, मैं मेरी समस्या तय की। मुझे अपने नियंत्रक में एनोटेशन का उपयोग करना बंद करना पड़ा और अपना रूटिंग.इमएल बदल दिया ताकि मार्ग सीधे लिखें।

image_retrieve: 
    pattern: /image/{amount} 
    defaults: { _controller: mdp_api_image_retriever_retrieve:retrieve } 
    requirements: 
     _method: GET 

यह पूरी समस्या को ठीक करता है।

// If the cache warmer tries to warm up a service controller that uses 
// annotations, we need to bail out as this is handled by the service 
// container directly. 
if (null !== $metadata->getOutsideClassMetadata()->id 
       && 0 !== strpos($metadata->getOutsideClassMetadata()->id, '_jms_di_extra.unnamed.service')) { 
      return; 
} 

फिर लाइन 69 पर, यह विधि कॉल करने की कोशिश करता है: एनोटेशन के साथ समस्या यह है कि इस वर्ग (JMS \ DiExtraBundle \ HttpKernel \ ControllerResolver) लाइन 90 पर पर, Symfony कोर में, तो आप इस कोर देखना है लौटाए गए डेटा से call_user_func, जो शून्य था।

दूसरे शब्दों में, एनोटेशन का उपयोग करके और अपने नियंत्रकों को सेवा के रूप में बनाना एक साथ काम नहीं करता है। मैं इस मुद्दे पर डिबगिंग 4 घंटे खो दिया है, इसलिए मुझे आशा है कि यह भविष्य :)

+0

मेरा जवाब देखें, आप एनोटेशन का उपयोग कर सकते हैं – Matt

3

बस अपने प्रश्न का उत्तर मिल गया में किसी की मदद कर सकते हैं, उम्मीद है कि इस मदद करता है (या अन्य जो इस सवाल लगता है)

<?php 
namespace MDP\API\ImageBundle\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

/** 
* @Route("/image", service="mdpapi_image.controller.retriever") 
*/ 
class RetrieverController { 

    private $jsonResponse; 

    private $request; 

    public function __construct(JsonResponse $jsonResponse, Request $request) { 
     $this->jsonResponse = $jsonResponse; 
     $this->request = $request; 
    } 

    /** 
    * @Route("/{amount}") 
    * @Template("MDPAPIImageBundle:Retriever:index.json.twig") 
    */ 
    public function retrieve($amount) 
    { 
    } 
} 

सूत्रों का कहना है:

http://richardmiller.co.uk/2011/10/25/symfony2-routing-to-controller-as-service-with-annotations/

http://symfony.com/doc/current/cookbook/controller/service.html

संबंधित मुद्दे