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

时间:2018-06-20 13:03:31

标签: php symfony routes yaml symfony-2.8

我正在开发一个Symfony项目,在该项目中其他开发人员并没有真正提供特定于项目的信息,因此这项工作对我来说是过去五年来最糟糕的项目经历之一。我要创建两个Symfony捆绑包,一个OrderBundle和一个ErpBundle,以便在OrderBundle中创建一些实体,并在ErpBundle中创建一个服务和一个控制器。

这些实体是正常的教义实体,从这个问题的角度来看,我认为它们并不重要。 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,而该{反过来又可以与我描述的服务一起使用,该服务可以对实体进行处理,但是相反,我得到了以下错误:

  

必须定义参数“ 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的文件夹,并实现了以下两个类:

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

1 个答案:

答案 0 :(得分:0)

事实证明,项目中有一个自定义的特定于路由的逻辑,我不得不按照以前对我不熟悉的特定于项目的约定进行一些数据库更改。这些细节是如此具体,以至于我无法在不违反与该项目相关的商业机密的情况下在这里分享它们,所以我知道答案是什么,但无法与社区分享。