1

/src/Vendor/JobQueueBundle/Controller/DefaultController.php

namespace Vendor\JobQueueBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use JMS\JobQueueBundle\Controller\JobController;

/**
* @Route("/jobs")
*/
class DefaultController extends JobController
{
    /**
    * @Route("/index")
    */
    public function indexAction()
    {
        die();
    }
}

/app/config/routing.yml

vendor_api_job_queue:
    resource: "@VendorJobQueueBundle/Controller/"
    type:     annotation
    prefix:   /

JMSJobQueueBundle:
    resource: "@JMSJobQueueBundle/Controller/"
    type: annotation

/src/Syntetik/API/JobQueueBundle/SyntetikAPIJobQueueBundle.php

namespace Vendor\JobQueueBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class VendorJobQueueBundle extends Bundle
{
    public function getParent()
    {
        return 'JMSJobQueueBundle';
    }
}

当我尝试调用 /jobs/index 时,我得到:

Method "JMS\JobQueueBundle\Controller\JobController::indexAction" does not exist.

DefaultController 被完全忽略,不知道为什么?

谢谢!

4

2 回答 2

3

JMSDiExtraBundle https://github.com/schmittjoh/JMSDiExtraBundle/issues/39是已知和公开的问题,所以问题是如果子类没有至少一个 JMS 注释,DiExtarBundle 不会查找父类的注释,所以代理类是'不在元数据缓存中生成(查看 app/cache/dev/jms_diextra/metadata/)

最快的解决方案是至少留下注释:

父控制器 >>

<?php

namespace Namespace\SiteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

use JMS\DiExtraBundle\Annotation as DI;

class IndexController extends Controller 
{   
    /**
     * @DI\Inject("doctrine.orm.entity_manager")
     * @var \Doctrine\ORM\EntityManager $em
     */
    protected $em;

    /**
     * @DI\Inject("namespace.search.manager")
     * @var Namespace\SearchBundle\Services\SearchManager $searchManager
     */
    protected $searchManager;

    /**
     * @DI\Inject("namespace.product.manager")
     * @var Namespace\ProductBundle\Services\ProductManager $productManager
     */
    protected $productManager;

    /**
     * @Route("/", name="homepage")
     * @Template()
     */
    public function indexAction() { 
        echo "parent!";
        $defaultCategory = $this->searchManager->getDefaultCategory();
        ....
        return $result;
    }
}

儿童控制器 >>

<?php

namespace OtherSpace\SiteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use JMS\DiExtraBundle\Annotation as DI;

use Namespace\SiteBundle\Controller\IndexController as BaseIndexController;


class IndexController extends BaseIndexController
{
/**
 * The temprary solution base on known JMS/DiExtraBundle open issue https://github.com/schmittjoh/JMSDiExtraBundle/issues/39
 * **We need to leave at leat one Inject in child class to get a proxy generated**  
 * 
 * @DI\Inject("doctrine.orm.entity_manager")
 * @var \Doctrine\ORM\EntityManager $em
 */
protected $em;

    /**
     * @Route("/", name="homepage")
     * @Template()
     */
    public function indexAction() { 
        echo "child!";
        $result = parent::indexAction();

        return $result;
    }

}

所以这种方式将为 SpaceOther-IndexController 生成代理类,并且注释将起作用


我也解决了这个问题,您可以查看我的拉取请求 https://github.com/schmittjoh/JMSDiExtraBundle/pull/153

于 2014-01-14T00:15:48.457 回答
1

想通了这个问题。似乎它不是特定于 symfony2 的。问题是 JMS\DiExtraBundle\JMSDiExtraBundle 把事情搞砸了。只需删除该捆绑包即可使一切按本书进行。

谢谢!

于 2013-06-02T07:05:41.173 回答