2012-12-28 7 views

Antwort

38

Sie können festlegen, dass der Dispatcher dies für Sie erledigt.

Wenn Sie Ihre Anwendung Bootstrap Sie dies tun können ($di ist Ihre DI Werk):

use \Phalcon\Mvc\Dispatcher as PhDispatcher; 

$di->set(
    'dispatcher', 
    function() use ($di) { 

     $evManager = $di->getShared('eventsManager'); 

     $evManager->attach(
      "dispatch:beforeException", 
      function($event, $dispatcher, $exception) 
      { 
       switch ($exception->getCode()) { 
        case PhDispatcher::EXCEPTION_HANDLER_NOT_FOUND: 
        case PhDispatcher::EXCEPTION_ACTION_NOT_FOUND: 
         $dispatcher->forward(
          array(
           'controller' => 'error', 
           'action'  => 'show404', 
          ) 
         ); 
         return false; 
       } 
      } 
     ); 
     $dispatcher = new PhDispatcher(); 
     $dispatcher->setEventsManager($evManager); 
     return $dispatcher; 
    }, 
    true 
); 

Eine ErrorController

<?php 

/** 
* ErrorController 
*/ 
class ErrorController extends \Phalcon\Mvc\Controller 
{ 
    public function show404Action() 
    { 
     $this->response->setStatusCode(404, 'Not Found'); 
     $this->view->pick('404/404'); 
    } 
} 

und eine 404-Ansicht (/views/404/404.volt)

<div align="center" id="fourohfour"> 
    <div class="sub-content"> 
     <strong>ERROR 404</strong> 
     <br /> 
     <br /> 
     You have tried to access a page which does not exist or has been moved. 
     <br /> 
     <br /> 
     Please click the links at the top navigation bar to 
     navigate to other parts of the site, or 
     if you wish to contact us, there is information in the About page. 
     <br /> 
     <br /> 
     [ERROR] 
    </div> 
</div> 
+0

Das war sehr hilfreich für mich (fast exakte Kopie, außer für Controller/Action-Namen). Vielen Dank! – Trenton

+0

funktioniert perfekt. – vee

+0

und was ist, wenn ich 503 Statusseite von einer Aktion zusätzlich zu 404 Seite setzen möchte? Kann ich Statuscode als Parameter usw. setzen und von ErrorController lesen? Wie kann ich das machen ? – alexglue

3

Sie können den Header auch in einem FehlerC setzen ontroller von

mit
class ErrorController extends ControllerBase 
{ 
    public function error404Action() 
    { 
     $this->response->setHeader('HTTP/1.0 404','Not Found'); 
     // $this->response->setHeader(404, 'Not Found'); <- did not work 
    } 
} 

Und bevor, in der Steuerung, in dem ein Fehler occures, können Sie zu diesem Fehler-Controller weiterleiten.

class IndexController extends ControllerBase 
{ 
    public function indexAction() 
    { 
     $id = (int)$this->getId($param); 
     if ($id > 0) { 

      // do you stuff 
     } else { 
      $this->dispatcher->forward(array(
       'controller' => 'error', 'action' => 'error404') 
      ); 
     } 
    } 
} 

, die eine schnelle und schmutzig ist (?) Art und Weise und ist gut, wenn Sie Inhalte aus einer Datenbank erhalten und wollen einen Fehler werfen, wenn nichts gefunden wurde.

5

Die Lösung von Dimopoulos vorgeschlagen funktioniert nicht. Es erzeugt einen zyklischen Zustand.

Die Phalcon Router-Komponente hat ein Standardverhalten, das ein sehr einfaches Routing bietet, das immer einen URI erwartet, der dem folgenden Muster entspricht: /: controller /: action /: params. Dies wird viele Probleme verursachen, da Phalcon einen Controller durchsuchen wird, der nicht existiert, wenn der Server eine Anfrage für eine URL empfängt, die keiner definierten Route entspricht.

Also, zuerst müssen Sie dieses Verhalten deaktivieren. Dies kann FALSE während der Router-Instanz Schaffung erfolgen vorbei, wie folgt:

$router = Phalcon\Mvc\Router(FALSE); 

An dieser Stelle Sie die Lösung von @ Nguyễn Trọng Bằng vorgeschlagen nutzen können.

$router->notFound(
    [ 
    "namespace" => "MyNamespace\Controller" 
    "controller" => "index", 
    "action" => "route404" 
    ] 
); 

Es ist wichtig zu beachten, wenn Sie der Disponent einen Namespace verwenden, wird die Steuerung zu finden nicht in der Lage sein, es sei denn Sie es angeben, wie ich oben tat.

Dies ist nicht nur die einfachste Lösung, sondern die einzige, die funktioniert.

+0

Wenn du disabledest, indem du false an Router übergibst, kann der andere Router nicht gefunden werden und die ganze Seite wird nur auf 404 route gehen. – vee

+2

@vee das ist nicht wahr. Das passiert nur, wenn Sie die Routen nicht definieren: die Zuordnung zwischen einem Pfad und seinem relativen Controller/Aktion. Wie ich oben geschrieben habe, hat der Router ein Standardverhalten, das zu/controller /: action /: params passt, aber Sie können die Verbindung zwischen Ihren Routen und ihren relativen Aktionen frei definieren. Dann können Sie das Standardverhalten deaktivieren. Bevor Sie herunterlesen, lesen Sie die Dokumentation. – noun

+0

Ich wurde gelesen doc. und ich habe Route definiert und bereits getestet, dass dies nicht funktioniert. // Erstelle den Router $ router = new \ Phalcon \ Mvc \ Router (false); $ router-> add ( '/ index/page3/([a-zA-Z0-9 _-] +)/([a-zA-Z0-9 _-] +)/{Seitenname}', Array ( 'controller' => 'Index', 'Aktion' => 'page3', 'roll' => 1, 'Spur' => 2, ) ); $ router-> notFound ( Array ( "Controller" => "Fehler", "Aktion" => "e404" ) ); gehen Sie zu http: // localhost/phalcon /> Seite nicht gefunden gehen Sie zu http: // localhost/phalcon/index/Seite3> Seite nicht gefunden gehen Sie zu jeder Seite in Route definiert> Seite nicht gefunden – vee

Verwandte Themen