Kohana 3 ile yardıma ihtiyacınız ve bir 404 hata dönüşüyor tüm rotayı yakalamak

2 Cevap php

this documentation dayanarak, hangi bir hata sayfasına yönlendiren bir catch all rotayı uyguladık.

İşte benim bootstrap.php son rota

Route::set('default', '<path>', array('path' => '.+'))
    ->defaults(array(
        'controller' => 'errors',
        'action'     => '404',
    ));

Ben bu istisna ben çalıştığınızda, atılır ve var olmayan bir sayfaya gitmek almaya devam Ancak

Kohana_Exception [ 0 ]: Required route parameter not passed: path

Ben (yani parantez içine sarın) <path> segment isteğe yaparsanız o zaman sadece bir home rotayı yüklemek gibi görünüyor ...

Route::set('home', '')
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

Ev rota ilk tanımlanır.

Ben bu yüzden gibi benim ana isteği yürütmek

$request = Request::instance();


try {

    // Attempt to execute the response
    $request->execute();

} catch (Exception $e) {


   if (Kohana::$environment === Kohana::DEVELOPMENT) throw $e;

    // Log the error
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

    // Create a 404 response
    $request->status = 404;
    $request->response = Request::factory(Route::get('default')->uri())->execute();

}

$request->send_headers();
echo $request->response;

Bu 404 başlık tarayıcınıza gönderilen, ama o benim hataları denetleyicisi kurmak 404 hatası göstermelidir yakalama tüm rotayı isteği göndererek tarafından kabul anlamına gelir.

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Errors extends Controller_Base {

    public function before() {
        parent::before();
    }

    public function action_404() {


        $this->bodyClass[] = '404';

        $this->internalView = View::factory('internal/not_found');

        $longTitle = 'Page Not Found';

        $this->titlePrefix = $longTitle;


    }
}

Neden benim 404 hata sayfası göstermek değil mi?

2 Cevap

Benim projeler için ben 404 için herhangi bir özel ayrılmış yolu belirtilen asla. Ben sadece hayır uygun rota bulunduğu zaman, yönlendirme tarafından atılan özel durumları yakalamak.

İşte ben Kohana keşfedilen istisnalar her türlü işleme ediyorum nasıl. Ben size yardımcı olacağını umuyoruz.

try
{
    try
    {
        $request = Request::instance();
        $request->execute();
    }
    catch (ReflectionException $e)
    {
        Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        $request->response = Request::factory('err/404')->execute();
    }
    catch (Exception404 $e)
    {
        Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        $request->response = Request::factory('err/404')->execute();
    }
    catch (Kohana_Request_Exception $e)
    {
        Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404);
        echo Request::factory('err/404')->send_headers()->execute()->response;
        exit;
    }
    catch (exception $e)
    {
        Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        $request->status = 500;
        $request->response = Request::factory('err/500')->execute();
    }
}
catch (exception $e)
{
        if (!IN_PRODUCTION)
        {
            throw $e;
        }
        echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        </head>
        <body>
        here is the message that everything is veeeery bad
        </body>
        </html>';
        exit;
}

Exception404:

class Kohana_Exception404 extends Kohana_Exception
{
    public function __construct($message = 'error 404', array $variables = NULL, $code = 0)
    {
        parent::__construct($message, $variables, $code);
    }
 }

Ah, bu bir anladım.

Bu hat ...

$request->response = Request::factory(Route::get('default')->uri())->execute();

Sonucuna tepki batıyordu Route::get('default')->uri(). Ayrıca ona baktığımızda, ben yukarıda home rotayı maç olacak olan, boş bir dize döndürür gerçekleşmiştir. Ben aptal hissediyorum ....