2016-02-08 9 views
0

Создание собственной структуры на основе 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'); 

он вернулся со мной:

Catchable fatal error: Argument 1 passed to Symfony\Component\Routing\Router::__construct() must be an instance of Symfony\Component\Config\Loader\LoaderInterface, none given in D:\xampp\htdocs\my_fw\vendor\symfony\routing\Router.php on line 95

глядя на конструктор маршрутизатора, которого я вижу. Мне нужен этот интерфейс

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', 
))); 
+1

Имейте в виду, что класс Router - это все в одном классе типа менеджера с очень специфическими требованиями: http://symfony.com/doc/current/components/routing/introduction.html#the-all-in-one -router. Если вы не хотите или не нуждаетесь в такой сложности, просто используйте класс UrlGenerator напрямую: http://symfony.com/doc/current/components/routing/introduction.html#the-all-in-one-router – Cerad

ответ

0

Вы испытываете эту ошибку, потому что вы настраиваете службы маршрутизатора, без определения службы определения услуг должны иметь свои аргументы службы, которая является источником вашей ошибки, поскольку контейнер пытается создать маршрутизатор без аргументов check this

Для лучшего использования вы можете настроить службу маршрутизатора в service.yml/.xml файл

+0

Ссылка просто описать, как проверить, зарегистрирована ли какая-либо услуга или нет. И несколько вспомогательных методов.Я не вижу, как вводить интерфейс, например аргумент – Ivan

+0

, он описывает также заданные аргументы http://symfony.com/doc/current/components/dependency_injection/definitions.html#constructor-arguments –

0

Edit: documentation page for the Routing component содержит подробные инструкции по установке

Попробуйте ввести услугу router_loader в качестве аргумента в службу router. Для этого случая вы должны использовать класс Symfony\Component\DependencyInjection\Reference.

Маршруты должны быть настроены с конфигурационным файлом при использовании всего в одном классе Router. Вы должны использовать и настоящий класс 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"} 

также посмотреть на этой странице документации о setting up the routing component, который также говорит о настройке маршрутизации без всех в одном классе и файле конфигурации.

+0

hm этот звук хорош, но я не использую компонент конфигурации , Я использую один файл 'routing.php', где я кладу коллекции. Проверьте мое обновление! Могу ли я оптимизировать это без '.yml' и использовать по умолчанию' .php' – Ivan

+0

@Zend Если вы хотите использовать все в одном классе маршрутизатора, вы должны использовать компонент конфигурации. Если вы просто хотите использовать .php-файлы, посмотрите [Документацию компонента маршрутизации] (http://symfony.com/doc/current/components/routing/introduction.html#generate-a-url). Тогда вы должны использовать класс 'UrlGenerator'. – chh

+0

Так что мне нужно использовать компонент конфигурации. Спасибо, я проверю больше в документах – Ivan

Смежные вопросы