2012-10-17 14 views
7

sorry für mein schlechtes Englisch, ich bin aus RusslandArbeiten mit Objekt Zend View Helper URL, von der Steuerung

begann zend framework 2 ... Beispiel in der Steuerung, readAction() zu lernen:

use Zend\View\Helper\Url; 

.... 

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

Als Ergebnis geworfen Ausnahme:

Zend\View\Exception\RuntimeException 

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

Bitte, mir helfen. was mache ich falsch?

Antwort

12

Sie können einen Viewhelper nicht in einem Controller verwenden - und das müssen Sie nicht. Es gibt auch ein Url Controller-Plugin, das ziemlich genau das gleiche tut.

Controller-Plugins sind aufrufbaren Klassen, können Sie sie wie folgt aus (Controller-Aktion Kontext) verwenden können:

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

Alle Parameter sind. Für weitere Informationen, überprüfen Sie den Code in Zend\Mvc\Controller\Plugin\Url oder lesen Sie die docs.

+3

nicht wahr:

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

herzustellen. Sie können View Helper in Controller verwenden, aber ofc ist nicht sehr gute Idee: $ uVH = $ this-> getServiceLocator() -> get ('viewhelpermanager') -> get ('url'); $ routeUrl = $ uvh ('routename', array ('param1' => 'param1')); usw. –

3

Helper und Plugins, obwohl sie direkt instanziiert werden können, sollten dies normalerweise nicht tun, da sie normalerweise von einem PluginManager verwaltet werden. Der PluginManager ist eine Unterklasse des ServiceManagers und bietet daher eine Menge Funktionalität rund um das Erstellen von Plugins, einschließlich der Einbindung von Standard-Mitarbeitern, der Verwendung von Factories zur Bereitstellung von Abhängigkeiten und mehr.

Im Fall des Url-Helfers gibt es eine Fabrik, die dafür sorgt, dass der konfigurierte Router injiziert wird - wenn Sie ihn direkt instanziieren, haben Sie dies nicht, und er wird seine Aufgabe nicht ausführen können wie du bemerkt hast!

Wie Daniel bemerkt, möchten Sie auch sicherstellen, dass Sie ein Plugin erhalten, das für den Kontext geeignet ist. Wenn Sie in einem Controller sind, überprüfen Sie, ob es ein Controller-Plugin gibt, das die Arbeit für Sie erledigt. Daniel verlinkte die Dokumente in seinem Post.

+0

du hast mich vor Kopfschmerzen gerettet :-) –

0

Ich weiß, dass es bereits eine akzeptierte Antwort gibt, aber ich poste das noch, um die Last von Anfängern wie mir zu verringern.

Ich benutze Smarty als View-Renderer und in Smarty können Sie nicht PHP-Codes in den Ansichten verwenden, also muss alles in der Steuerung getan werden, sie in Variablen zuzuteilen und dann an die Ansichten zu übergeben.

Sie diese verwenden können:

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

Wenn Sie das Tutorial von zend 2 folgen, wird es so aussehen:

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

Dieser Wert von haben:

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

Wie Sie sehen können, müssen Sie den Servernamen hinzufügen, den Sie verwenden können, bevor Sie die Route erstellen url:

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

Insgesamt sollte der Code-Schnipsel wie folgt aussehen:

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

hoffe, das hilft Anfänger ZF2 Benutzer

Verwandte Themen