Stwórz profil

Musisz wpisać swoje imię
Musisz wpisać swoje nazwisko
Musisz wpisać poprawny e-mail
Musisz wpisać hasło (min. 8 znaków)
Musisz zaakceptować regulamin

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
20.11.2009, 17:35

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


:)
20.11.2009, 23:55

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
21.11.2009, 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...
21.11.2009, 22:18

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.
18.07.2010, 17:00

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

19.07.2010, 02:12

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ą.
20.07.2010, 13:44

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.
20.07.2010, 13:55

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.
20.07.2010, 13:59

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 :)
20.07.2010, 14:32

Jan Lipmann likomp.pl - it &
web solutions

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?
28.07.2010, 10:33

Marek Szymczuk Infiltrate. Destroy.
Rebuild.

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

Przykładowy plik bootstrap.php
28.07.2010, 11:19

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
28.07.2010, 13:31

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:

$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
28.07.2010, 16:15



Wyślij zaproszenie do