6

だから、ここに私が構築したばかりのコントローラーがあります:

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;

class RetrieverController {

    private $jsonResponse;

    private $request;

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

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

DependencyInjection を使用するために、このコントローラーをサービスとして機能させたいと考えています。だから、ここに私のservices.xmlファイルがあります:

<?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>

ただし、コントローラーを実行しようとすると、常に次の例外が発生します。

キャッチ可能な致命的なエラー: MDP\API\ImageBundle\Controller\RetrieverController::__construct() に渡される引数 1 は、Symfony\Component\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ですか?

4

3 に答える 3

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

于 2012-11-15T07:06:57.843 に答える
1

だから、私は私の問題を修正しました。コントローラーでの注釈の使用を停止し、routing.yml を変更して、ルートを直接記述する必要がありました。

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

それは問題全体を修正しました。アノテーションの問題は、Symfony コアの 90 行目のこのクラス (JMS\DiExtraBundle\HttpKernel\ControllerResolver) で、次のコアが表示されることです。

// 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 行目で、null であった返されたデータから call_user_func メソッドを呼び出そうとします。

つまり、アノテーションを使用してコントローラーをサービスとして作成することは、連携して機能しません。この問題のデバッグに 4 時間を費やしたので、これが将来誰かに役立つことを願っています :)

于 2012-09-26T16:43:50.070 に答える
0

ファイルをロードする拡張クラスを書くのを忘れたようです:services.xml

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');
    }
}
于 2012-09-26T06:04:17.823 に答える