如何在现有Symfony项目中正确设置新bundle的路线



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

这些实体是正常的学说实体,从这个问题的角度来看,我认为它们并不重要。HomeController在的文件夹中

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

<?php
namespace MyprojectAppErpBundleController;
use SymfonyBundleFrameworkBundleControllerController;
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

它的服务.yml包含这个

services:
#    erp.example:
#        class: MyprojectAppErpBundleExample
#        arguments: ["@service_id", "plain_value", "%parameter%"]
parameters:
myproject_app_erp.routing_controllers:
home: 'MyProjectAppErpBundleControllerAdminHomeController'

而且,在主文件夹/app/config/routing.yml中,我有这个部分:

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

理论上,这应该运行我需要的HomeController,它反过来会与我描述的服务一起工作,它会对实体做一些事情,但我却得到了以下错误:

必须定义参数"myproject_app_erp.routing_controllers"在erp中(从"/var/www/mainfolder/vendor/myproject/sing/src/myproject/App/ErpBundle/Resources/config/routing.yml")。

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

编辑:

通过实现DependencyInjection,但在ErpBundle中创建了一个名为DependencyInjection的文件夹,并实现了以下两个类,我成功地避免了上述错误:

配置.php

<?php
namespace MyprojectAppErpBundleDependencyInjection;
use SymfonyComponentConfigDefinitionBuilderTreeBuilder;
use SymfonyComponentConfigDefinitionConfigurationInterface;
/**
* 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 MyprojectAppErpBundleDependencyInjection;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentConfigFileLocator;
use SymfonyComponentHttpKernelDependencyInjectionExtension;
use SymfonyComponentDependencyInjectionLoader;
/**
* 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 LoaderYamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
}
}

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

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

最新更新