Подтвердить что ты не робот

Создание ссылки из службы

Как я могу создать ссылку из службы? Я ввел "роутер" внутри моей службы, однако созданные ссылки /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'));
    }
}
4b9b3361

Ответ 1

Итак: вам понадобятся две вещи.

Прежде всего, вам придется иметь зависимость от @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 и используйте параметр shared (введенный в Symfony 2.8) вместо области prototype (подробнее об общих услуг).

Ответ 2

У меня была аналогичная проблема, но с использованием 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 в конструкторе не рекомендуется, поскольку он потенциально может попытаться получить к нему доступ до запрос обрабатывается ядром. Поэтому он может вернуть значение null при попытке получить объект запроса из RequestStack.

Ответ 3

Для Symfony 4.x гораздо проще следовать инструкциям, приведенным в этой ссылке Создание URL-адресов в службах

Вам нужно только ввести UrlGeneratorInterface в службу, а затем позвонить в generate('route_name'), чтобы получить ссылку.

// src/Service/SomeService.php
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class SomeService
{
    private $router;

    public function __construct(UrlGeneratorInterface $router)
    {
        $this->router = $router;
    }
    public function someMethod()
    {
        // ...

        // generate a URL with no route arguments
        $signUpPage = $this->router->generate('sign_up');
    }

    // ...
}