7
votes

I try add global parameter

Parameter for all routes, and parameter setup in kernel Request Listener.

routing

mea_crm:
    resource: @Crm4Bundle/Resources/config/routing.yml
    prefix: /{_applicationid}
    defaults:  { _applicationid: 0 }
    requirements:
      _applicationid: |0|1|2|3|4|5|6

in Listener - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } I try setup this parameter

$request->attributes->add(array(
            '_applicationid'=>$appCurrentId
        ));
        $request->query->add(
            array(
                '_applicationid'=>$appCurrentId
            )
        );
$request->query->set('_applicationid',$appCurrentId);

and still have in routes - default value 0

Update 1 i setup listener to max priority

tags:
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }

in listener setup

 public function onKernelRequest(GetResponseEvent $event)
    {

        $event->getRequest()->request->set('_applicationid',1);

        return ;

and still don't have this parameter is routing.

UPDATE 2

its strange - i dump in Symfony\Component\Routing\Router

in method

public function matchRequest(Request $request)
....
var_dump($matcher->matchRequest($request));
        die();

and get

array (size=4) '_controller' => string 'Mea\TaskBundle\Controller\TaskListController::viewOneAction' (length=59) '_applicationid' => string '1' (length=1) 'id' => string '700' (length=3) '_route' => string 'MeaTask_View' (length=12)

so there exist _applicationid

but in urls i dont have it

here is routing.yml

mea_crm:
    resource: @MeaCrm4Bundle/Resources/config/routing.yml
    prefix: /{_applicationid}
    defaults:  { _applicationid: null }
    requirements:
      _applicationid: |1|2|3|4|5|6

i have links like here: http://crm4.dev/app_dev.php//u/logs/list any ideas ?

UPDATE 3

here is my listeners

php app/console debug:event-dispatcher kernel.request

Registered Listeners for "kernel.request" Event
===============================================

 ------- ---------------------------------------------------------------------------------- ---------- 
  Order   Callable                                                                           Priority  
 ------- ---------------------------------------------------------------------------------- ---------- 
  #1      Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure()      2048      
  #2      Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest()     1024      
  #3      Symfony\Component\HttpKernel\EventListener\DumpListener::configure()               1024      
  #4      Mea\Crm4Bundle\Listener\CrmApplicationRequestListener::onKernelRequestInit()       255       
  #5      Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest()    128       
  #6      Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest()     48        
  #7      Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest()       32        
  #8      Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest()       16        
  #9      FOS\RestBundle\EventListener\BodyListener::onKernelRequest()                       10        
  #10     Symfony\Component\HttpKernel\EventListener\TranslatorListener::onKernelRequest()   10        
  #11     Symfony\Component\Security\Http\Firewall::onKernelRequest()                        8         
  #12     Mea\Crm4Bundle\Listener\CrmApplicationRequestListener::onKernelRequest()           0         
  #13     Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest()      0         
 ------- ---------------------------------------------------------------------------------- ---------- 

in CrmApplicationRequestListener :: onKernelRequestInit

i setup onKernelRequestInit and it is visible now.

But still i need change in routing defaults: { _applicationid: 0 }

every path generated by symfony have default _applicationid: 0 not current real _applicationid set in listener. Add current _applicationid for every routing is not possible. I must change default in router. I have hope that problem is clear now.

UPDATE 4 I also try to create custom routing loader - here is question symfony2 add dynamic parameter for routing, try with custom loader

2
When defining the router parameter in the routing.yml it is automatically added to the request query parameters already.Why do you want to add it to the attributes?mblaettermann
you want every route in your application to have/allow this prefix without putting every route configuration into one resource ?Nicolai Fröhlich
Yes i want _applicationid in all routes. I have var in Kernel request listener but cannot find how to setup it - i push $request->query->set('_applicationid',$appCurrentId); - but still have in routes _applicationid = 0Developer

2 Answers

4
votes

Your problem isn't very clear, but you might want to check your listener priority is set so that it runs before the router listener.


EDIT:

Assuming you're not trying to set the value of _applicationid in your twig view using path() – e.g. {{ path('path_name', {'_applicationid': 2}) }} – which will work, and may be the better option – you should still be able to set it using a listener.

After examining Symfony's own LocaleListener, I was able to set the value of _applicationid to 2 with the statement $this->router->getContext()->setParameter('_applicationid', 2);. The priority of the subscriber doesn't seem to make any difference, but setting the value in the view takes precedence over the listener.

Framework routing:

# app/config/routing.yml
acme_test:
    resource: "@AcmeTestBundle/Resources/config/routing.yml"
    prefix:   /{_applicationid}
    defaults:
        _applicationid: 0
    requirements:
        _applicationid: 0|1|2|3|4

Bundle Routing:

# src/Acme/TestBundle/Resources/config/routing.yml
acme_test_home:
    path:     /
    defaults: { _controller: AcmeTestBundle:Default:index }

Service definition:

# src/Acme/TestBundle/Resources/config/services.yml
services:
    acme_test.listener.app_id_listener:
        class: Acme\TestBundle\EventListener\AppIdListener
        arguments:
            - "@router"
        tags:
            - { name: kernel.event_subscriber }  

Subscriber:

# src/Acme/TestBundle/EventListener/AppIdListener.php
namespace Acme\TestBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AppIdListener implements EventSubscriberInterface
{
    private $router;

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

    public function onKernelRequest(GetResponseEvent $event)
    {
        $this->router->getContext()->setParameter('_applicationid', 2);
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
        );
    }
}
0
votes

The easiest way to achieve this is by overriding symfony's default router service.

You can find an example how to override the default router in the JMSI18nRoutingBundle.

Take a look at I18nRouter and SetRouterPass


The alternative would be adding a custom route-loader that adds all the prefixed routes.

You can find examples for this in the documentation chapter How to Create a Custom Route Loader