Dawid S.

Dawid S. Senior Software
Engineer

Temat: Kohana i obsługa błędu 404

Witajcie!

Chciałbym wiedzieć jak rozwiązujecie obsługę błędu 404. Chodzi dokładniej o własną stronę z tym błędem.

Z moich poszukiwań wynika, że najlepiej jest zastosować hooka, aby podmienić zdarzenie system.404 uruchamiając wybrany kontroler i metodę. Wygląda to tak:


<?php
// application/hooks/error_404.php

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

class error_404{
public static function show_404()
{
$page = new Page_404_Controller();
$page->index();
}
}

//Zamiana zdarzenia system.404
Event::replace('system.404', array('Kohana', 'show_404'), array('error_404', 'show_404'));



<?php
// application/controllers/page_404.php

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

class Page_404_Controller extends Website_Controller{

public function index()
{
$this->template->title = 'Błąd 404';
$this->template->content = new View('pages/page_404.php');
}
}


Próbując wejść na nieprawidłową stronę, otrzymuje błąd aplikacji: Żądany widok, pages/page_404.php, Nie może zostać znaleziony.
Oczywiście w katalogu pages znajduje się plik widoku page_404.php.
Korzystam z Kohany 2.3.4.

Będę wdzięczny za wszelkie podpowiedzi.

Pozdrawiam
Dawid
Marcin Witek

Marcin Witek isido.pl ułatwia
pracę - polski sytem
zarządzania
projekt...

Temat: Kohana i obsługa błędu 404

a przypadkiem nie chodzi o to żeby dać

$this->template->content = new View('pages/page_404');

zamiast

$this->template->content = new View('pages/page_404.php');


:)
Dawid S.

Dawid S. Senior Software
Engineer

Temat: Kohana i obsługa błędu 404

Hej!

Dzięki za odpowiedź:)

Oczywiście powinno być bez rozszerzenia. Jednak po zmianie dostaję pysty ekran. Nic się nie wyświetla. Dodatkowo jak w kontrolerze dodam

echo 'Błąd 404';


to tekst wyświetla się prawidłowo.

Może źle wywołuję kontroler w hooku?

Pozdrawiam
DawidDawid Stępień edytował(a) ten post dnia 21.11.09 o godzinie 11:47
Marcin Witek

Marcin Witek isido.pl ułatwia
pracę - polski sytem
zarządzania
projekt...

Temat: Kohana i obsługa błędu 404

ja bym sprawdził najpierw

$this->template->content->render(true);


na końcu funkcji index. Wygląda że widok się tworzy, ale nie wypluwa do przeglądarki...

konto usunięte

Temat: Kohana i obsługa błędu 404

A w wersji 3 (czyli już bez hooksów) jak najlepiej sprawę załatwić?

Większość przykładów to modyfikacje bootstrap.php tak, by przechwytywać wyjątki i na tej podstawie wysyłać do kontrolera/widoku realizującego/obsługującego błędy typu 404.

konto usunięte

Temat: Kohana i obsługa błędu 404

w wersji 3 zalatwilem sprawe w bootstrap.php tak:



define('IN_PRODUCTION', $_SERVER['SERVER_ADDR'] != '127.0.0.1');

try {
// Attempt to execute the response
$request = Request::instance();
$request->execute();
}
catch (Exception $e) {
if ( ! IN_PRODUCTION) {
// Just re-throw the exception
throw $e;
}

$request = Request::factory('errors/404');
$request->execute();
// Log the error
Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));
}

konto usunięte

Temat: Kohana i obsługa błędu 404

Michał Baniowski:
w wersji 3 zalatwilem sprawe w bootstrap.php tak: (...)

Działa fajnie, ale z jednym ale. Załóżmy, że
http://serwer/a/b

jest poprawnym linkiem prowadzącym do jakiejś podstrony. Jak wychwycić, że już
http://serwer/a/b/x

poprawnym linkiem nie jest i nadaje się do odesłania do errors/404. Link taki nie jest interpretowany jako błąd 404, bo x to parametr akcji b. Jak więc samemu problem obejść, bo sprawdzanie w każdej akcji parametrów jest trochę żmudną robotą.
Michał Płonka

Michał Płonka Programista PHP

Temat: Kohana i obsługa błędu 404

Wyjdź poza framework i odnieś to do sytuacji. Poprawne jest:
http://serwer/a.php

Jak ktoś wpisze:
http://serwer/a.php?cos=tam

to również otrzyma w wyniku stronę, nie można tego traktować moim zdaniem jako błąd.

Można oczywiście sprawdzać parametry (jak pisałeś), ale byłoby to upierdliwe (określiłeś to delikatniej). Mógłbyś ewentualnie napisać sobie hooka (jeśli mówimy o KO2), do którego dostarczałbyś mapę kontroler+akcja -> możliwe parametry i na tej podstawie sprawdzał czy ktoś nie dodał zbyt wiele parametrów. Wg mnie jednak szkoda czasu na takie zabawy, no ale wszystko zależy od konkretnych potrzeb.

konto usunięte

Temat: Kohana i obsługa błędu 404

Przy definiowaniu routingu, możesz zdefiniować reguły, które będą używane przy sprawdzaniu adresu, na przykład:
Route::set('costam', '(<controller>(/<action>(/<lolek>)))'[b], array('lolek' => '(jan|kowalski)')[/b])
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
));

W tym przypadku trzeci parametr może przyjmować tylko dwie wartości -- jan i kowalski.

Innym wyjściem jest sprawdzanie parametru w kontrolerze (na przykład sprawdzasz, czy dany użytkownik istnieje -- jeśli nie, wyrzucasz wyjątek, który będzie przechwycony przez blok try {} catch {} w pliku bootstrap.php.

konto usunięte

Temat: Kohana i obsługa błędu 404

Michał Płonka:
Wyjdź poza framework i odnieś to do sytuacji. Poprawne jest:
http://serwer/a.php

Jak ktoś wpisze:
http://serwer/a.php?cos=tam

No w sumie racja. I na tym poprzestańmy :)
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: Kohana i obsługa błędu 404

Michał Baniowski:
w wersji 3 zalatwilem sprawe w bootstrap.php tak:



define('IN_PRODUCTION', $_SERVER['SERVER_ADDR'] != '127.0.0.1');

try {
// Attempt to execute the response
$request = Request::instance();
$request->execute();
}
catch (Exception $e) {
if ( ! IN_PRODUCTION) {
// Just re-throw the exception
throw $e;
}

$request = Request::factory('errors/404');
$request->execute();
// Log the error
Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));
}

Michał, a w którym miejscu wsadziłeś ten TRY w bootstrap.php?

konto usunięte

Temat: Kohana i obsługa błędu 404

Przykładowy plik bootstrap.php
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: Kohana i obsługa błędu 404

Super,

Właśnie sie zastanawiałem jak ogarnąć wszystkie wyjątki.

Chciałem robic przy każdej akcji try + catch i przekierowanie na 404
Paweł Dymek

Paweł Dymek Full Stack Web &
Mobile Developer

Temat: Kohana i obsługa błędu 404

Patrzę na powyższe przykłady i się zastanawiam: nie uważacie wyświetlania błędu 404 przy każdym wyjątku za niestosowne? Wyjątki w Kohanie mogą przecież pochodzić z różnych klas, nie tylko ReflectionException (gdzie słusznie można by wyświetlić 404), ale np. ErrorException, gdzie userowi wyświetliłbym np. 500, zamiast 404. Czemu? Żeby user miał świadomość, że strona jednak istnieje, ale chwilowo coś nie działa oraz przede wszystkim, żeby nie zwiększać prawdopodobieństwa, że Googlebot zacznie rzadziej odwiedzać stronę i ją szybciej wyindeksuje z uwagi na status HTTP.

Skłaniałbym się raczej ku takiemu rozwiązaniu:

$request = Request::instance($_SERVER['PATH_INFO']);

try
{
// Attempt to execute the response
$request->execute();
}
catch (Exception $e)
{
if (Kohana::$environment === Kohana::DEVELOPMENT)
{
// Just re-throw the exception
throw $e;
}

// Set the error code
if ($e instanceof ReflectionException OR ! $e->getCode())
{
$error_code = 404;
}
elseif ($e instanceof ErrorException)
{
$error_code = 500;
}
elseif ($e->getCode())
{
$error_code = $e->getCode();
}

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

// Check if the error template exists
if (Kohana::find_file('views/errors/', $error_code))
{
$content = View::factory('errors/'.$error_code);
}
else
{
$content = View::factory('errors/default')
->set('message', $e->getMessage());
}

// Create an error response
$request->status = $error_code;
$request->response = View::factory('errors/template')
->set('content', $content);
}
Paweł Dymek edytował(a) ten post dnia 28.07.10 o godzinie 16:31

Następna dyskusja:

Co to jest Kohana?




Wyślij zaproszenie do