Dawid
S.
Webmaster,
Programista PHP
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
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.
Webmaster,
Programista PHP
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
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...
Krzysztof Kozłowski na web na shyje
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.
Michał Baniowski Programista PHP
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));
}
Krzysztof Kozłowski na web na shyje
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
Właściciel
Notifero,
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.
Marek
Szymczuk
Infiltrate. Destroy.
Rebuild.
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.
Krzysztof Kozłowski na web na shyje
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
likomp.pl - it &
web solutions
Temat: Kohana i obsługa błędu 404
Michał Baniowski:Michał, a w którym miejscu wsadziłeś ten TRY w bootstrap.php?
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));
}
Marek
Szymczuk
Infiltrate. Destroy.
Rebuild.
Jan
Lipmann
likomp.pl - it &
web solutions
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 Web 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:
Paweł Dymek edytował(a) ten post dnia 28.07.10 o godzinie 16:31
$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);
}
