2012-12-28 36 views

cevap

38

sizin için bunu yapmaya memuru ayarlayabilirsiniz.

Başvurunuzu bootstrap zaman bunu yapabilirsiniz ($di sizin DI fabrika):

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 
); 

bir ErrorController

<?php 

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

ve 404 görünüm oluşturma (/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

Bu (neredeyse tam kopyası, kontrolör/eylem adları için kaydedin) benim için son derece yararlı oldu. Çok teşekkürler! – Trenton

+0

kusursuz çalışıyor. – vee

+0

ve 404 sayfanın yanı sıra bazı eylemlerden 503 durum sayfasını ayarlamak istersem ne olur? Durum kodunu parametre vb. Olarak ayarlayabilir ve ErrorController'dan okuyabilir miyim? Bunu nasıl yapabilirim ? – alexglue

3

Başlığı bir hataya da ayarlayabilirsiniz. Bir hata meydana gelmişse denetleyicisi, içinde,

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 
    } 
} 

Ve önce

kullanarak ontrol, bu hata-denetleyici iletebilir. Eğer bir veritabanındaki içeriği alma ve hiçbir şey bulunduğu takdirde, bir hata atmak istiyorsanız eğer, hızlı ve kirli (?) yoludur ve iyi

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') 
      ); 
     } 
    } 
} 

.

12

Sen 404 işlemek için yönlendirmeyi kullanabilirsiniz sayfa bulunamadı:

$router->notFound(array(
    "controller" => "index", 
    "action" => "route404" 
)); 

Ref: Dimopoulos önerdiği http://docs.phalconphp.com/en/latest/reference/routing.html#not-found-paths

+1

Bu yalnızca bu kodla çalışır: '$ yönlendirici = Phalcon \ Mvc \ Router (YANLIŞ); // $ defaultRoutes = false' –

5

çözüm çalışmaz. Bir bisiklet koşulu oluşturur. /: Kontrolör /: action /: parametreler

phalcon Yönlendirici bileşeni daima aşağıdaki deseni ile eşleşen bir URI beklediğini çok basit yönlendirme sağlayan bir varsayılan davranışı vardır. Bu, birçok soruna neden olacaktır çünkü Phalcon, sunucu tanımlanmış herhangi bir yolla eşleşmeyen bir URL için istek aldığında mevcut olmayan bir denetleyiciyi arayacaktır.

Yani, her şeyden önce, sen bu davranış devre dışı bırakmalısınız.

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

sen @ Nguyễn Trong Bang önerdiği çözümü kullanabilirsiniz Bu noktada şu şekildedir: Bu, Yönlendirici örneği oluşturma sırasında FALSE geçen yapılabilir.

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

Bu nota bir ad alanı kullanıyorsanız memuru yukarıda yaptığım gibi, onu belirtmedikçe, denetleyici bulmak mümkün olmayacaktır önemlidir.

Bu sadece en kolay çözümdür, ama işe yarıyor sadece bir tanesidir.

+0

Router'a false ileterek devre dışı bırakırsanız, diğer tüm routlar bulunamaz ve tüm sayfa 404 yoluna gider. – vee

+2

@vee bu doğru değil. Bu, yalnızca yolları tanımlamazsanız gerçekleşir: bir yol ile onun göreceli denetleyicisi/eylemi arasındaki eşleme. Yukarıda yazdığım gibi, Yönlendirici'nin eşleme /: controller /: action /: params ile eşleşmesi için varsayılan bir davranışı vardır, ancak rotalarınız ile bunların göreli eylemleri arasındaki ilişkiyi tanımlamakta özgürsünüz. Sonra varsayılan davranışı devre dışı bırakabilirsiniz. İndirmeden önce belgeleri okuyun. – noun

+0

Doküman okudum. ve rotayı tanımladım ve zaten bunun işe yaramadığını test ettim. // Yönlendiriciyi oluştur $ yönlendirici = yeni \ Phalcon \ Mvc \ Router (yanlış); $ router-> ekleyin ( '/ göstergesi/sayfa3/([a-z-0-9 _-] +)/([a-z-0-9 _-] +)/{safyaadı}', dizisi ( 'kontrol' => 'endeksi', aksiyon '=> 'sayfa3', 'rulo'=> 1, 'parça'=> 2, ) ); $ router-> NOTFOUND ( dizi ( "kontrol" => "hata", "eylem" => "E404" ) ); http: // localhost/phalcon /> sayfasına git http: // localhost/phalcon/index/page3> sayfasına git rotada tanımlanmış herhangi bir sayfaya gidin> sayfa bulunamadı – vee