Generate a link from a service
So : you will need two things.
First of all, you will have to have a dependency on @router (to get generate()).
Secondly, you must set the scope of your service to "request" (I've missed that).http://symfony.com/doc/current/cookbook/service_container/scopes.html
Your services.yml
becomes:
services: myservice: class: My\MyBundle\MyService arguments: [ @router ] scope: request
Now you can use the @router service's generator function !
Important note regarding Symfony 3.x: As the doc says,
The "container scopes" concept explained in this article has been deprecated in Symfony 2.8 and it will be removed in Symfony 3.0.
Use the
request_stack
service (introduced in Symfony 2.4) instead of therequest
service/scope and use theshared
setting (introduced in Symfony 2.8) instead of theprototype
scope (read more about shared services).
For Symfony 4.x, it's much easier follow the instructions in this link Generating URLs in Services
You only need to inject UrlGeneratorInterface
in your service, and then call generate('route_name')
in order to retrieve the link.
// src/Service/SomeService.phpuse 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'); } // ...}
I had a similar issue, but using Symfony 3.While eluded to in the previous answer, it was a bit tricky to find out how exactly one would use request_stack
to achieve the same thing as scope: request
.
In this question's case, it would look something like this:
The services.yml config
services: myservice: class: My\MyBundle\MyService arguments: - '@request_stack' - '@router'
And the MyService Class
<?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')); } }
Note: Accessing RequestStack in the constructor is advised against since it could potentially try to access it before the request is handled by the kernel. So it may return null when trying to fetch the request object from RequestStack.