如何在现有的 Symfony 项目中正确设置新 Bundle 的路由?

How can I correctly set routes of a new Bundle in an existing Symfony project?

我正在做一个 Symfony 项目,其他开发人员并没有真正提供项目特定的信息,所以这项工作是我过去五年中最糟糕的项目经历之一。我要创建两个 Symfony 包,一个 OrderBundle 和一个 ErpBundle,在 OrderBundle 中创建一些实体以及一个服务和一个控制器到 ErpBundle.

这些实体是正常的 Doctrine 实体,从这个问题的角度来看,我认为它们并不重要。 HomeController 位于

的文件夹中

mainfolder/vendor/Myproject/myfolder/src/Myproject/App/ErpBundle/Controller/Admin/HomeController.php 是这样的:

<?php

namespace Myproject\App\ErpBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HomeController extends AdminController
{
    /**
     * @Route("/home", defaults={
     *     "_format": "html"
     * })
     */
    public function indexAction()
    {
        //some code
    }

    /**
     * @Route(  "/home/menu",
     *          defaults={"_format": "html"})
     */
    public function indexMenuAction()
    {
        //some code
    }
}

其routing.yml包含这个

myproject_app_erp.myproject_admin.controller:
    resource: erp
    type: myproject_admin

及其 sevice.yml 包含此

services:
#    erp.example:
#        class: MyprojectAppErpBundle\Example
#        arguments: ["@service_id", "plain_value", "%parameter%"]
parameters:
    myproject_app_erp.routing_controllers:
        home: 'MyProject\App\ErpBundle\Controller\Admin\HomeController'

而且,在 mainfolder/app/config/routing.yml 里面我有这个部分:

myproject_app_erp:
    resource: '@MyprojectAppErpBundle/Resources/config/routing.yml'

从理论上讲,这应该 运行 我需要的 HomeController,这反过来又可以与我描述的服务一起工作,这将对实体做一些事情,但我得到的不是那个以下错误:

The parameter "myproject_app_erp.routing_controllers" must be defined in erp (which is being imported from "/var/www/mainfolder/vendor/myproject/sing/src/Myproject/App/ErpBundle/Resources/config/routing.yml").

我试图将 service.yml 中的 parameters 部分复制到 routing.yml 中,以便将错误消息遗漏的部分放在那里,但错误消息仍然存在.从昨天开始,我一直在尝试用很多方法来解决这个问题,我的印象是设置工作环境比编写代码更困难。我已经在 Symfony 文档中阅读了有关服务创建的内容,这就是为什么我能够达到我所达到的目的,但我不知道如何解决这个问题。我想我需要检查自动加载是如何工作的,因为 /home 路由似乎在那里被控制,但我不知道我是否正确以及如何实现它。我的问题是:我应该检查什么,在哪里以及如何能够解决这个问题。

编辑:

我已经通过实施 DependencyInjection 设法避免了上述错误,但是在 ErpBundle 中创建了一个名为 DependencyInjection 的文件夹并实施了以下两个 类:

Configuration.php

<?php

namespace Myproject\App\ErpBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * This is the class that validates and merges configuration from your app/config files
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
 */
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('myproject_app_erp');
        return $treeBuilder;
    }
}

MyprojectAppErpExtension.php

<?php

namespace Myproject\App\ErpBundle\DependencyInjection;

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

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */

class MyprojectAppErpExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

现在加载页面时,它仍然使用另一个包的 HomeController 而不是 ErpBundle 中的包。

事实证明,项目中有一个自定义的特定于路由的逻辑,我必须按照我以前不知道的特定于项目的约定进行一些数据库更改。细节如此具体,我不能在这里分享而不侵犯与项目相关的商业秘密,所以我知道答案是什么,但不能与社区分享。