[英]override symfony2 bundle controller actions
/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完全被忽略,不知道为什么?
谢谢!
已知并打开了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
弄清楚这个问题。 它似乎不是symfony2特有的。 问题是JMS \\ DiExtraBundle \\ JMSDiExtraBundle会搞乱周围的事情。 只需删除该捆绑包就可以使本书完成所有工作。
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.