2012-10-17 8 views
7

dispiace per il mio cattivo inglese, io sono dalla RussiaLavorare con oggetto Zend Visualizza Helper Url, dal controller

ha cominciato a imparare Zend Framework 2 ... campione nel regolatore, readAction():

use Zend\View\Helper\Url; 

.... 

$helperUrl = new Url(); 
$address = $helperUrl('news', array('action' => 'index')); 

di conseguenza, eccezione generata:

Zend\View\Exception\RuntimeException 

File: 
    W:\home\zf2\vendor\zendframework\ 
     zendframework\library\Zend\View\Helper\Url.php:80 
Message: 
    No RouteStackInterface instance provided 

Per favore, aiutatemi. cosa sto facendo male?

risposta

12

Non è possibile utilizzare un viewhelper in un controller e non è necessario. C'è anche un plug-in del controller Url che fa più o meno la stessa cosa.

plugin controller sono classi invokable, è possibile utilizzarli come (contesto d'azione del controller) questo:

$url = $this->url()->fromRoute($route, $params, $options, $reuseMatchesParams); 

Tutti i parametri sono opzionali. Per ulteriori informazioni, controllare il codice in Zend\Mvc\Controller\Plugin\Url o leggere lo docs.

+3

non è vero. puoi usare view helper nel controller, ma ofc non è una buona idea: $ uVH = $ this-> getServiceLocator() -> get ('viewhelpermanager') -> get ('url'); $ routeUrl = $ uvh ('route-name', array ('param1' => 'param1')); ecc –

3

Aiutanti e plug-in, mentre possono essere istanziati direttamente, di solito non dovrebbero, in quanto sono gestiti da un PluginManager. PluginManager è una sottoclasse di ServiceManager e, come tale, fornisce molte funzionalità per la creazione di plugin, tra cui l'iniezione di collaboratori standard, l'uso di fabbriche per fornire l'iniezione di dipendenza e altro ancora.

Nel caso dell'heler Url, c'è una fabbrica che garantisce l'iniezione del router configurato, se lo installi direttamente, non lo avrai, e non sarà in grado di fare il suo lavoro , come hai notato!

Come notato da Daniel, si desidera anche assicurarsi di ottenere un plug-in appropriato per il contesto. Se sei in un controller, controlla se c'è un plug-in del controller che farà il lavoro per te. Daniel si è collegato ai documenti nel suo post.

+0

mi hai salvato dal mal di testa :-) –

0

So che esiste già una risposta accettata, ma la inserirò ancora per ridurre il peso dei principianti come me.

Io uso smarty come visualizzatore di rendering e in smarty non è possibile utilizzare i codici php nelle viste, quindi, tutto deve essere eseguito nel controller, allocandolo in variabili e poi passandole alle viste.

È possibile utilizzare questo:

$url = $this->url()->fromRoute('route',array('name'=>'route-name')); 

Se si sta seguendo il tutorial di Zend 2, sarà simile a questo:

$url = $this->url()->fromRoute('album',array('action'=>'add')); 
$url = $this->url()->fromRoute('album',array('action'=>'edit')); 
$url = $this->url()->fromRoute('album',array('action'=>'delete')); 

questo avrà un valore di:

/zf2/index.php/album/add 
/zf2/index.php/album/edit 
/zf2/index.php/album/delete 

Come si può vedere, è necessario aggiungere il nome del server ad esso, che è possibile fare utilizzando questi prima della generazione del percorso url:

$url = $uri = $this->getRequest()->getUri(); 
$url = sprintf('%s://%s', $uri->getScheme(), $uri->getHost()); 

Nel complesso, il frammento di codice dovrebbe essere simile a questo:

$url = $uri = $this->getRequest()->getUri(); 
$url = sprintf('%s://%s', $uri->getScheme(), $uri->getHost()); 
$url .= $this->url()->fromRoute('album',array('action'=>'add')); 

produrre:

http://yourservername/zf2/index.php/album/add 

Spero che questo aiuti gli utenti principianti ZF2

Problemi correlati