2010-03-05 4 views
3

Comme vous le savez, Zend Framework (v1.10) utilise le routage basé sur des paramètres séparés par des barres obliques, ex.Routage basé sur la chaîne de requête PHP standard

[server]/controllerName/actionName/param1/value1/param2/value2/ 

Queston est: Comment forcer Zend Framework, retrive action et nom contrôleur à l'aide chaîne de requête standard PHP, dans ce cas:

[server]?controller=controllerName&action=actionName&param1=value1&param2=value2 

J'ai essayé:

protected function _initRequest() 
{ 
    // Ensure the front controller is initialized 
    $this->bootstrap('FrontController'); 

    // Retrieve the front controller from the bootstrap registry 
    $front = $this->getResource('FrontController'); 

    $request = new Zend_Controller_Request_Http(); 
    $request->setControllerName($_GET['controller']); 
    $request->setActionName($_GET['action']); 
    $front->setRequest($request); 

    // Ensure the request is stored in the bootstrap registry 
    return $request; 
} 

Mais cela n'a pas fonctionné pour moi.

Répondre

3
$front->setRequest($request); 

La ligne définit uniquement l'instance de l'objet Request. Le frontController exécute toujours la requête via un routeur auquel il est assigné quel contrôleur/action à appeler.

Vous devez créer votre propre routeur:

class My_Router implements Zend_Controller_Router_Interface 
{ 
    public function route(Zend_Controller_Request_Abstract $request) 
    { 
     $controller = 'index'; 
     if(isset($_GET['controller'])) { 
      $controller = $_GET['controller']; 
     } 

     $request->setControllerName($controller); 

     $action = 'index'; 
     if(isset($_GET['action'])) { 
      $action = $_GET['action']; 
     } 

     $request->setActionName($action); 
    } 
}} 

Puis dans votre bootstrap:

protected function _initRouter() 
{ 
    $this->bootstrap('frontController'); 
    $frontController = $this->getResource('frontController'); 

    $frontController->setRouter(new My_Router()); 
} 
+0

Cela a presque fonctionné, j'ai dû étendre My_Router de Zend_Controller_Router_Rewrite ou implémenter les méthodes d'interface restantes. La première solution était plus rapide;) Maintenant, cela fonctionne très bien. THX! – singles

+0

Selon le manuel, vous étiez censé avoir seulement à mettre en œuvre cette méthode. L'API semblait dire le contraire, j'étais confus. Vous pouvez également essayer d'étendre Zend_Controller_Router_Abstract au lieu de Zend_Controller_Router_Rewrite. Ils ont besoin d'un meilleur exemple dans le manuel. – smack0007

1

Avez-vous essayé: $router->removeDefaultRoutes(), puis $request->getParams() ou $request->getServer()?

Questions connexes