创建自定义路由器服务

时间:2016-02-08 12:03:16

标签: symfony

我正在创建基于Sf2组件​​的自己的框架,我尝试创建路由器服务。

我需要generateUrl()方法

的服务
protected function generateUrl($route, $parameters = array(), $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
{
    return $this->get('router')->generate($route, $parameters, $referenceType);
}

我试试这个

$container = new ContainerBuilder();

$container->setDefinition('router_loader', new Definition('Symfony\Component\Config\Loader\LoaderInterface'));
$container->setDefinition('router', new Definition('Symfony\Component\Routing\Router', array()));

当我在我的methodAction中执行时

$this->generateUrl('home');

他回复我:

  

可捕获的致命错误:参数1传递给   Symfony \ Component \ Routing \ Router :: __ construct()必须是。的实例   Symfony \ Component \ Config \ Loader \ LoaderInterface,没有给出   第95行的D:\ xampp \ htdocs \ my_fw \ vendor \ symfony \ routing \ Router.php

查看路由器构造函数我看到了。我需要那个界面

   public function __construct(LoaderInterface $loader, $resource, array $options = array(), RequestContext $context = null, LoggerInterface $logger = null)

如何避免服务中的实现?

**New update:** routing.php

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

// Routing
$routes = new RouteCollection();

// Home

$routes->add('home', new Route('/', array(
    '_controller' => 'MyCompany\\Controller\\HomeController::indexAction',
)));

2 个答案:

答案 0 :(得分:0)

您遇到此错误,因为您正在配置没有服务定义的路由器服务,服务定义应该有您的服务参数,这是您的错误的来源,因为容器尝试创建没有参数的路由器check this

为了更好地使用,您可以在service.yml / .xml文件中配置路由器服务

答案 1 :(得分:0)

修改:setting up the routing component有详细的设置说明

尝试将router_loader服务作为参数注入router服务。在这种情况下,您必须使用Symfony\Component\DependencyInjection\Reference类。

使用all in one Router类时,必须使用配置文件配置路由。您必须使用FileLocator和真正的Loader类,例如YamlFileLoader,您不能只使用该接口(服务通常不能成为Symfony中的接口)。

router服务的服务容器设置应如下所示:

use Symfony\Component\DependencyInjection\Reference;

// Loads config files from the current directory, change this to 
// your liking, or add more than one path
$container->setDefinition('router_config_locator', new Definition(
    'Symfony\Component\Config\FileLocator', [[__DIR__]]
));

$container->setDefinition('router_loader', new Definition(
    'Symfony\Component\DependencyInjection\Loader\YamlFileLoader', [
        new Reference('router_config_locator'),
    ]
));

$container->setDefinition('router', 
     new Definition('Symfony\Component\Routing\Router', array(
         'loader' => new Reference('router_loader'),
         // Definition of routes in Yaml form
         'resource' => 'routes.yml',
     ))
);

routes.yml文件包含您的路线定义:

home:
  path: /home
  defaults: {_controller: "MyController:index"}

另请参阅有关{{3}}的此文档页面,其中还讨论了如何在没有所有类和配置文件的情况下设置路由。

相关问题