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