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