2016-03-25 13 views
3

Genel parametre ekleSymfony2 - Her istek için yönlendirmeye genel bir parametre veya _locale'ye benzer oluşturulan URL nasıl eklenir?

Tüm yollar için parametre ve kernel İstek İşleyicisi'nde parametre ayarı yapmayı deneyin. yönlendirme

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

- varsayılan değeri 0

Güncelleme 1 i kurulum dinleyici maksimum - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } Ben setup

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

ve hala rotalara sahip bu parametreyi deneyin öncelik

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

public function onKernelRequest(GetResponseEvent $event) 
    { 

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

     return ; 

ve hala bu parametre yönlendirme olduğunu gerekmez.

onun tuhaf 2 UPDATE - ı Symfony'nin \ Bileşen \ Yönlendirme \ Yönlendirici dökümü

yöntemde

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

ve

dizisini almak (boyut = 4) ' _controller '=> string' Mea \ TaskBundle \ Controller \ TaskListController :: viewOneAction '(uzunluk = 59) ' _applicationid '=> dize' 1 '(uzunluk = 1) 'kimlik' => dizisi '700' (uzunluk = 3) '_route' => dizisi 'MeaTask_View' (uzunluk = 12)

böylece orada

_applicationid ancak URL'ler i yok bulunmamakta http://crm4.dev/app_dev.php//u/logs/list herhangi bir fikir:

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

burada gibi bağlantıları burada

routing.yml olduğunu var?

GÜNCELLEME 3

burada dinleyici

CrmApplicationRequestListener içinde
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   
------- ---------------------------------------------------------------------------------- ---------- 

:: onKernelRequestInit

i kurulum onKernelRequestInit olduğunu ve artık görünür. {_applicationid: 0}: dinleyici ayarlanan 0 değil geçerli gerçek _applicationid

symfony ürettiği her yolu varsayılan _applicationid sahip

Ama yine ben yönlendirme varsayılan değişmesi gerekir. Her yönlendirme için mevcut _applicationid ekle mümkün değil. Yönelticide varsayılanı değiştirmem gerekiyor.Şu anda problemin açık olduğunu umuyorum.

Ben de özel yönlendirme yükleyici oluşturmaya çalışın 4 GÜNCELLEME - burada soru symfony2 add dynamic parameter for routing, try with custom loader

+0

Yönlendirme parametresini routing.yml içinde tanımlarken, istek sorgu parametrelerine otomatik olarak eklenir. Nitekim bunu niteliklere eklemek ister misiniz? – mblaettermann

+0

** Uygulamanızdaki her bir ** rotayı, her yol yapılandırmasını bir 'kaynağa 'koymadan bu öneklere sahip olmak/izin vermek istiyor musunuz? – nifr

+0

Evet, tüm yollarda _applicationid'i istiyorum. Kernel istek dinleyicisinde var var ama nasıl ayarlanacağını bulamıyorum - $ request-> query-> setini ('_ applicationid', $ appCurrentId); - ama hala yollar var _applicationid = 0 –

cevap

2

Senin sorunun çok net değil dokümantasyon bölümünde bunun için örnek bulabilirsiniz, ancak bunu yönlendirici dinleyici önce çalışır böylece dinleyici öncelik ayarlanır kontrol etmek isteyebilirsiniz.


DÜZENLEME:

Eğer path() kullanarak dal görünümünde _applicationid değerini ayarlamak için çalışmıyoruz varsayarsak - örneğin {{ path('path_name', {'_applicationid': 2}) }} - hangi işe yarayacak ve daha iyi bir seçenek olabilir - hala bir dinleyici kullanarak ayarlayabilmeniz gerekir.

Symfony'nin en LocaleListener kendi incelemeden sonra, deyimi $this->router->getContext()->setParameter('_applicationid', 2); ile 2 için _applicationid değerini ayarlamak başardı. Abonenin önceliği herhangi bir fark yaratmıyor gibi görünmektedir, ancak görünümdeki değeri ayarlamak dinleyiciden önceliklidir.

Çerçeve yönlendirme:

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

Paketi Yönlendirme:

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

Hizmet tanımı:

# 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 } 

Abone:

# 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

yapıyorum ama hala parametrede yok parametre –

+0

Konsolda dinleyici önceliğini ayıklar misiniz?Son zamanlarda bir dinleyici üzerinde önceliği belirleyemediğimi, her zaman 0'da bittiğini buldum. Bunun yerine bir abone yapmalıydım, sonra önceliği ayarlayabildim. – tomchkk

+0

Symfony \ Component \ HttpKernel \ EventListener \ RouterListener'da KernelEvents :: REQUEST => array (array ('onKernelRequest', 32)), = priority 32 yani 255 kullanıyorum, dinleyici ilk önce çalıştırıp çalıştır. Bu parametreyi istekte görüyorum (symfony default Router Listener'da) ancak yönlendirme için kullanılmıyor. Ide neden yok –

0

bu Symfony'nin varsayılan router hizmetini geçersiz kılarak başarmak için en kolay yoludur.

JMSI18nRoutingBundle'daki varsayılan yönlendiriciyi nasıl geçersiz kılacağınızı gösteren bir örnek bulabilirsiniz.

bir I18nRouter bakmak ve SetRouterPass


alternatif tüm öneki güzergahları ekleyen özel bir rota-yükleyici ekleyerek olurdu atın.

Sen How to Create a Custom Route Loader

+0

kolay bir yol değil, ilk önce başka yolları deneyin. Router yapmadan önce belki de get isteğiyle konsepte bir parametre eklemek istiyorum –

+0

Merhaba, özel yükleyiciyi kullanmayı deneyin ama lütfen bakın - http://stackoverflow.com/questions/36237070/symfony2-add-dynamic-parameter Yönlendirme-try-with-özel-loader ile –