I did my own URLGenerator (Symfony\Component\Routing\Generator\UrlGenerator) extending the original URLGenerator. I want to access the Symfony2 session from there, but I can't.
use Symfony\Component\Routing\Generator\UrlGenerator as BaseUrlGenerator;
class UrlGenerator extends BaseUrlGenerator
{
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens)
{
$url=parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens);
**//Here I want to access to session**
return $url;
}
}
I read the documentation but I dont know how to acess. Only can access to session from a controller? I searched here, but I want to invoke a Symfony Object to the session.
\Resoruces\config\services.yml
parameters:
router.options.generator_base_class: Ex\Bundle\ExBundle\Routing\Generator\UrlGenerator
UPDATE 1: I added:
ex.service:
class: Ex\Bundle\ExBundle\Routing\Generator\UrlGenerator
arguments: [@session]
and:
private $session;
public function __construct($session, RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null)
{
$this->routes = $routes;
$this->context = $context;
$this->logger = $logger;
$this->session = $session;
}
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens)
{
$url=parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens);
$this->session->set($url,$url);
return $url;
}
** ERROR here on ->set (: Call to a member function set() on a non-object in )
As Maerlyn said maybe you should use a construct to implement this. Have a look on how to use arguments in service: http://symfony.com/doc/current/book/service_container.html
Update 1 : Check the second answer. It could be helpful How do you access a users session from a service in Symfony2?
Update 2 :
For me this code works but Idon't know if my override of Symfony\Component\Routing\Generator\UrlGenerator is a good practice.
app/config/config.yml
ex.service:
class: Test\YourBundle\Service\UrlGenerator
arguments: [@router]
calls:
- [setSession, ["@session"]]
src/Test/YourBundle/Service/UrlGenerator.php
namespace Test\YourBundle\Service;
use \Symfony\Component\Routing\Generator\UrlGenerator as BaseUrlGenerator;
use \Symfony\Component\Routing\RequestContext as RequestContext;
class UrlGenerator extends BaseUrlGenerator {
private $session;
public function __construct(\Symfony\Component\Routing\Router $routes, \Psr\Log\LoggerInterface $logger = null) {
parent::__construct($routes->getRouteCollection(), new RequestContext(), $logger);
}
public function setSession($session) {
$this->session = $session;
}
public function getSession() {
return $this->session;
}
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens)
{
$url=parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens);
$this->session->set($url,$url);
return $url;
}
}
src/Test/YourBundle/Controller/DefaultController.php
class DefaultController {
// ...
public function indexAction()
{
// Retrieve my service
$service = $this->get('ex.service');
echo $service->generate('_demo');
}
// ...
}
try this solution
use Symfony\Component\HttpFoundation\Session\Session;`
$session = new Session();
$session->get('variable');