2012-09-11 15 views
12

ho definito un percorso nel mio file di routing app:percorso di ricerca in symfony 2

RouteName: 
    pattern: /some/route 
    defaults: { _controller: MyAppBundle:Controller:action } 

In un controller posso usare:

$this->get('router')->generate('RouteName'); 

Come dovrei semplicemente accedere a tale da una fresca classe I creare, ad esempio una classe di visualizzazione che non si estende nulla:

namespace My\AppBundle\View; 

class ViewClass { 
    public function uri() 
    { 
     return getTheRoute('RouteName'); 
    } 
} 
+0

puoi spiegare di più sul 'ViewClass' si sta creando? Qual è la connessione tra 'ViewClass' e template? –

risposta

34

è necessario iniettare il servizio "router" nelle vostre ViewClass. Per esempio. nel luogo in cui il vostro definire il servizio ViewClass:

viewclass.service: 
    class: Namespace\For\ViewClass 
    arguments: 
     router: "@router" 

e poi nel costruttore:

public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router) 
{ 
    $this->router = $router; 
} 
+0

Non sono sicuro di averlo capito davvero, quindi dovrei passare attraverso il router ovunque chiami VewClass? 'nuovo ViewClass (nuovo Router())'? –

+1

Non esattamente. Perché ovunque nel tuo progetto hai bisogno di istanza di ViewClass, ne otterrai uno tramite il contenitore di iniezione delle dipendenze. Ad esempio se definisci il servizio ViewClass come nella mia risposta, nel tuo controller lo ottieni in questo modo: $ viewClass = $ this-> get ('viewclass.service') e non ti interessa creare un nuovo oggetto da solo. Definirlo in service.yml è sufficiente – Cyprian

+0

Grazie, ora è un piacere! –

1

L'indizio è nel modo in cui il metodo $this->generateUrl() funziona in Controller. Vedi:

/** 
* Generates a URL from the given parameters. 
* 
* @param string $route  The name of the route 
* @param mixed $parameters An array of parameters 
* @param Boolean $absolute Whether to generate an absolute URL 
* 
* @return string The generated URL 
*/ 
public function generateUrl($route, $parameters = array(), $absolute = false) 
{ 
    return $this->container->get('router')->generate($route, $parameters, $absolute); 
} 

Quindi è necessario definire la classe come servizio e iniettare il servizio @router. In alternativa, o chiedi alla tua classe di implementare ContainerAwareInterface, ma il primo metodo sarebbe sicuramente migliore.

+0

Non sono sicuro che creare un servizio sia la cosa migliore per me, dato che sto creando un ViewClass per ogni vista del mio sito (molto). Pertanto, ogni ViewClass normalmente verrà utilizzato solo in un posto solo e quindi non è realmente un servizio. Puoi dare qualche informazione in più sull'implementazione di ContainerAwareInterface.È l'unica classe che devo caricare? –

+0

In realtà penso che sarà necessario definire la classe come servizio per utilizzare ContainerAwareInterface. Tutto ciò che farebbe è chiamare automaticamente 'setContainer' sulla tua classe prima di fornirlo, permettendoti così di accedere a qualsiasi servizio nel contenitore. Non dovresti preoccuparti di creare un servizio, è un'operazione molto economica. – RobMasters

1

È necessario registrare la classe come servizio e inserire il router come dipendenza.

Vedere lo chapter on the service container negli eccellenti documenti di symfony2.

Se non si ha familiarità con i concetti del contenitore dei servizi e dell'iniezione delle dipendenze, ci si potrebbe sentire un po 'sopraffatti. Tuttavia, fai del tuo meglio per capirlo perché è una parte essenziale dell'architettura symfony2.

0

È possibile passare l'intero contenitore dal controller alla classe di visualizzazione durante l'istanziazione. Questo è NON MIGLIORE PRATICA e non raccomandato.

class View 
{ 
    protected $container; 

    public function __construct(\Symfony\Component\DependencyInjection\Container $container) 
    { 
    $this->container = $container; 
    } 
} 

Poi nel codice è possibile utilizzare

$this->container->get('router')->generate($route, $parameters, $absolute); 
+3

Perché suggeriresti questo se non è una buona pratica? – theunraveler

+0

Risponde alla domanda, non è il modo in cui dovresti farlo, ma è il modo in cui l'OP avrebbe bisogno di farlo per mantenere lo schema descritto nella sua domanda. –

+0

non farlo .... – user3886650