2012-04-07 2 views
18

Как создать ссылку из службы? Я ввел «роутер» в свою службу, однако созданные ссылки: /view/42 вместо /app_dev.php/view/42. Как я могу это решить?Создать ссылку из сервиса

Мой код-то вроде этого:

services.yml

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: [ @router ] 

MyService.php

<?php 

namespace My\MyBundle; 

class MyService { 

    public function __construct($router) { 

     // of course, the die is an example 
     die($router->generate('BackoffUserBundle.Profile.edit')); 
    } 
} 
+0

Не могли бы вы вставить код, в котором вы создаете URL-адреса? –

+0

Если вы заходите на свой сайт через 'http: // test/app_dev.php', ссылки будут с app_dev.php. Для 'http: // test' они будут без app_dev.php ... – meze

+0

@kuba: Я отредактировал мой вопрос. –

ответ

28

Итак: вам нужно две вещи.

Прежде всего, вам нужно будет иметь зависимость от @router (для получения generate()).

Во-вторых, вы должны установить объем своей службы на «запрос» (я пропустил это). http://symfony.com/doc/current/cookbook/service_container/scopes.html

Ваш services.yml становится:

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: [ @router ] 
     scope: request 

Теперь вы можете использовать функцию генератора на службе @router в!


Важное замечание по поводу Symfony 3.x: Как doc говорит,

Понятие «контейнер прицелы» объясняется в этой статье была осуждается в Symfony 2.8 и она будет удалена в Symfony 3.0.

Используйте request_stack службу (введен в Symfony 2.4) вместо request службы/Scope и использовать shared параметр (введен в Symfony 2.8) вместо prototype объема (далее об общих услуг).

+0

Я не понимаю. Как это помогло? Область действия не имеет ничего общего с 'app_dev.php'. – meze

+0

Если запрос не доступен, когда используется маршрутизатор, контекст (getContext()) маршрутизатора не будет использовать информацию запроса (например, хост), и путь не будет полностью сгенерирован. Установка области охвата гарантирует, что запрос будет сохранен, когда моя служба будет создана. Обратите внимание, что возникла вторая проблема: я загружал свои службы при загрузке пакета, поэтому запрос еще не был загружен. –

+0

"вам придется иметь зависимость от @router (для получения generate())." Я не понимаю, от чего ваш ответ отличается от вашего вопроса? – Toskan

2

Я имел similar issue, но с использованием Symfony 3. Хотя ускользал в предыдущем ответе, это было немного сложно, чтобы выяснить, как именно можно было бы использовать request_stack для достижения тех же вещей, как scope: request.

В случае на этот вопрос, это будет выглядеть примерно так:

services.yml конфигурации

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: 
      - '@request_stack' 
      - '@router' 

А Класс MyService

<?php 

    namespace My\MyBundle; 

    use Symfony\Component\Routing\RequestContext; 

    class MyService { 

     private $requestStack; 
     private $router; 

     public function __construct($requestStack, $router) { 
      $this->requestStack = $requestStack; 
      $this->router = $router; 
     } 

     public doThing() { 
      $context = new RequestContext(); 
      $context->fromRequest($this->requestStack->getCurrentRequest()); 
      $this->router->setContext($context); 
      // of course, the die is an example 
      die($this->router->generate('BackoffUserBundle.Profile.edit')); 
     } 
    } 

Примечание: Доступ к RequestStack в конструктор advised against, поскольку он может попытаться получить к нему доступ до обработки запроса по ядру. Поэтому при попытке получить объект запроса из RequestStack он может вернуть значение null.

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