【问题标题】:Overwrite controller from vendors覆盖供应商的控制器
【发布时间】:2013-08-16 09:25:13
【问题描述】:

我在我的项目供应商中有捆绑包。必要的覆盖 EditController 类。我的供应商捆绑包在 CedricLambardot AdminGeneratorBundle 的帮助下构建。我覆盖 *-generator.yml 并指出 params.bundle_name 名称我的供应商包。 Owerrite 控制器也是,但他不工作,所有相同的 symfony 使用供应商的控制器。

来自供应商的EditController.php:

namespace Acme\ProductBundle\Controller\Product;

use Admingenerated\AcmeProductBundle\BaseProductController\EditController as BaseEditController;
// ...

class EditController extends BaseEditController
{
    // ...
}

覆盖的 EditController.php

namespace Acme\AnniProductBundle\Controller\Product;

use Acme\ProductBundle\Controller\Product\EditController as BaseEditController;
// ...

class EditController extends BaseEditController
{
    // ...
}

我覆盖的 *-generator.yml:

generator: admingenerator.generator.doctrine_odm
params:
  model: Acme\AnniProductBundle\Document\Product
  namespace_prefix: Acme
  bundle_name: ProductBundle
  object_actions:
        delete: ~
  fields:
    name:
      label: Name
    # ...
  # ...

我的路线:

Acme_ProductBundle_Product_list:
    path:      /product/
    defaults:  { _controller: AcmeAnniProductBundle:Product\List:index }

Acme_ProductBundle_Product_filters:
    path:      /product/filter
    defaults:  { _controller: AcmeAnniProductBundle:Product\List:filter }

Acme_ProductBundle_Product_edit:
    path:      /product/{pk}/edit
    defaults:  { _controller: AcmeAnniProductBundle:Product\Edit:index }

Acme_ProductBundle_Product_update:
    path:      /product/{pk}/update
    defaults:  { _controller: AcmeAnniProductBundle:Product\Edit:update }

Acme_ProductBundle_Product_object:
    path:      /product/{pk}/{action}
    defaults:  { _controller: AcmeAnniProductBundle:Product\Actions:object }

Acme_ProductBundle_Product_new:
    path:      /product/new
    defaults:  { _controller: AcmeAnniProductBundle:Product\New:index }

Acme_ProductBundle_Product_create:
    path:      /product/create
    defaults:  { _controller: AcmeAnniProductBundle:Product\New:create }

我做错了什么?

【问题讨论】:

    标签: php symfony admin-generator


    【解决方案1】:

    几个选项。

    1. 检查路由的设置位置。可能在某个地方的 routes.yml 文件中。调整路线以指向您的控制器。

    2. 如果步骤 1 不可行,请尝试捆绑继承:http://symfony.com/doc/current/cookbook/bundles/inheritance.html

    如果这些方法都不起作用,那么我们可能需要更多细节。还可以检查捆绑文档以获取提示。控制器也可能会发送事件,这反过来可能意味着您根本不必覆盖它们。

    【讨论】:

    • 我覆盖了所有路由,但使用旧控制器都一样
    • 您需要将路由指向您的控制器。如果您认为有,请使用您的覆盖路线之一更新您的问题。请记住,最后加载的路由将覆盖以前的路由,因此顺序可能很重要。您可能想使用 app/console route:debug 来检查。调整方法以验证您的更改是否有效。
    • 我猜它们要么不在,要么在标准路线之前被加载。在 app/config/routes.yml 中,你所有的资源行都在你的路由之前吗?
    • 所有路线都是正确的。如果我没有指出路线,symfony 会显示错误,找不到路线...
    • 这不是找到路线的问题,而是找到正确路线的问题。如果您在两个不同的文件中定义了两条同名的路由,则使用最后一个加载的路由。因此,有关路由文件加载顺序的问题。考虑将 app/config/routes.yml 添加到您的问题中。
    【解决方案2】:

    注释问题:

    父控制器:

    namespace Acme\ProductBundle\Controller\Product;
    
    use Admingenerated\AcmeProductBundle\BaseProductController\EditController as     BaseEditController;
    use JMS\DiExtraBundle\Annotation as DI;
    // ...
    
    class EditController extends BaseEditController
    {
        /** @DI\Inject("doctrine_mongodb.odm.document_manager") */
        private $dm;
    
        // ...
    }
    

    如果在被覆盖的控制器中写入:

    /** @DI\Inject("doctrine_mongodb.odm.document_manager") */
    private $dm;
    

    所有作品

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多