Własna strona błędu 404 w Kohanie
Ostatnio odkryłem prawdziwy "pałer" frameworków. Zacząłem od CodeIgnitera. Całkiem fajny, w większości miejsc daje wolną rękę programiście. Jednak nie wygląda na to, żeby miał być dalej tworzony. Spróbowałem Kohanę, jedną (to ona jest?
) z jego forków.
Jako że dosłownie zakohałem się w Kohanie, będę co jakiś czas umieszczał tutaj jakieś porady.
Porada na dziś:
Własna strona błędu 404 w Kohanie
(docelowo pisane na Kohanę 2.3.4, ale na 2.4 też powinno działać)
Wbrew pozorom nie jest to takie trudne! Kohana (tak jak CodeIgniter) ma zaimplementowany system tak zwanych Hooków/Eventów (zdarzeń). Mogę zmienić standardową funkcję obsługi błędu 404, i podmienić ja na moją własną.
Na początku musimy się upewnić, czy mamy w naszej aplikacji włączone hooki. W tym celu otwieramy plik application/config/config.php, i prawdopodobnie w linijce 75 będzie znajdować się poniższy kod:
$config['enable_hooks'] = FALSE;
Zmieniamy FALSE na TRUE.
Następnie tworzymy nowy plik application/hooks/error_404.php. Kohana automatycznie wykonuje wszystkie pliki z katalogu application/hooks/, więc nie musimy go jakoś specjalnie włączać ![]()
W tym pliku zadeklarujemy klasę przechwytywania błędu (error_404), oraz podmienimy standardową funkcję obsługi błędu 404, na naszą własną z klasy error_404. Nasza funkcja będzie uruchamiać inny, podany w stałej, kontroler.
<?php
class error_404 {
const error_controller = 'Error404'; // Nazwa kontrolera który chcemy wykonywać podczas błędu. (jeżeli mamy kontroler np. w pliku application/controllers/errors/Error404.php, wpisujemy tutaj errors/Error404)
public static $page = '';
public static function show_404() { // nasza funkcja przechwytująca błąd 404
header("HTTP/1.0 404 Not Found"); // wysyłamy nagłówek ze statusem Not Found.
if(Router::$current_uri != self::error_controller) { // zabezpieczenie, przed zapętleniem się strony, gdy podany kontroler obsługi błędu nie zostanie znaleziony
self::$page = Router::$current_uri; // zapisujemy adres brakującej strony, więc możemy w kontrolerze strony błędu wyświetlić jej adres
Router::$current_uri = self::error_controller; // Przekierowujemy na nasz kontroler
Router::setup(); // i ponownie inicjalizujemy klasę Router.
} else {
Kohana::show_404(self::$page); // gdy nasz kontroler obsługi błędu nie istnieje, wyświetlamy standardową tablicę z Kohany, z adresem strony wcześniej zapisanej do zmiennej $page.
}
}
}
Event::replace('system.404', array('Kohana', 'show_404'), array('error_404', 'show_404')); // Podmieniamy standardową funkcję obsługi eventu "system.404", na naszą.
?>
Potem musimy zdefiniować nasz kontroler w pliku application/controllers/Error404.php. Nie będzie on się różnił specjalnie od innych, więc nie będę się tutaj specjalnie rozpisywał:
<?php
class Error404_Controller extends Controller {
public function index() {
echo '<html><body><b>404 Not Found</b><small> - '.error_404::$page.'</small><br /><br /><small>Powered by KohanaPHP</small></body></html>';
}
}
?>
Stay tuned, następne tutoriale już niedługo!
Marzec 11th, 2010 - 22:53
Zapomniałeś wspomnieć, której wersji Kohany się to tyczy – mi to wygląda na 2.3.4, w 2.4 chyba też powinno działać, ale w 3.x już na pewno nie będzie.
Zgodnie z dokumentacją nazwa pliku, w którym znajduje się jakiś kontroler powinna być napisana małymi literami.
Dodatkowo wypadałoby użyć widoku, bo echo w kontrolerze nie za ładnie wygląda.
I jeszcze: według mnie hook i event to nie to samo – często używa się ich łącznie, tj. w hooku dodaje się event, ale to ciągle dwie różne rzeczy.
PS. Też, już jakiś czas temu, się zakohałem…
Marzec 12th, 2010 - 07:18
No tak, rzeczywiście zapomniałem
Docelowo robiłem to na 2.3.4.
Co do wyświetlania widoku, to to prawda, ale tutaj napisałem to jak najprościej. Równiedobrze możnaby wyświetlać widok bezpośrednio w evencie, ale mi chodziło o wykonanie oddzielnego kontrolera.
Hm.. teoretycznie hook = plik php z katalogów hooks/ wykonywany przy inicjalizacji kohany.
PS. Jednak żałuję, że wcześniej nie poznałem jej, o.
Marzec 13th, 2010 - 19:19
To trzeba było skorzystać z moich rad przesiadki na Kohanę
Marzec 24th, 2010 - 17:04
“Zacząłem od CodeIgnitera. Całkiem fajny, w większości miejsc daje wolną rękę programiście.Jednak nie wygląda na to, żeby miał być dalej tworzony.”
Słucham?! Oj, ktoś tu chyba się mija z faktami. CI ma się całkiem dobrze i powstaje właśnie jego wersja 2.0 (aktualna wersja to 1.7.2).
Więcej tu – http://codeigniter.com/news/
Marzec 24th, 2010 - 17:53
4 dni po publikacji tego posta został dodany ten news. Wtedy jeszcze nie widziałem, żeby się coś tam ruszało
Anyway, jestem ciekaw, co tam nowego wymyślą. Również mam nadzieję, że nie zrobią czegoś takiego, czym jest Kohana3 (która osobiście mi zupełnie nie odpowiada)
Pozdrawiam,
Informatic
Maj 30th, 2010 - 02:36
ehh leszcz programistyczny!