Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > MVC - Errohandling

Layoutprobleme? - Styleswitcher!

Antwort
 
Themen-Optionen
Alt 15.04.2008, 14:37 Nach oben    #1
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard MVC - Errohandling

Hi,
ich sitz ma wider an meinem Blog, fang aber grad neu an...in den alten code find ich mich nimmer rein

Es geht (mal wieder) um den ErrorController (Exceptionshandler wäre wahrscheinlich passender).

Es geht darum, das er alle Ausnahmen auffangen soll, die irgendwo im Ablauf auftreten. Danach soll eine Fehlerseite Produziert werden.

Mein Prinzipielles Vorgehen wäre so:
Request kommt -> Frontcontroller ---(routet zum Controller)-->View-->Ausgabe

Nur irgendwo muss jetzt gewährleistet werden, das bei einem Fehlerfall nicht das normale Template angezeigt wird, sondern meine Fehlerseite...
Ich steh irgendwie auf'm Schlauch
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.04.2008, 15:39 Nach oben    #2
mepeisen
Martin Eisengardt
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 353
Standard

PHP-Exceptions nutzen und die an geeigneter Stelle im Frontcontroller zu fangen. Anschliessend auf einen speziellen Fehlercontroller verzweigen. Wirft der auch nen Fehler hast nen Problem und gibts beispielsweise
die("Alles kaputt!")
aus. Prinzipiell macht es auch das Zend Framework so.
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.04.2008, 16:01 Nach oben    #3
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard

Also als exceptions_handler nicht eine eigene klasse, sondern den FrontController registrieren. Der das wiederum an ne Errorklasse weitergibt?!
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.04.2008, 16:41 Nach oben    #4
robo47
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.048
Standard

Zitat:
Zitat von kampfgnom Beitrag anzeigen
Also als exceptions_handler nicht eine eigene klasse, sondern den FrontController registrieren. Der das wiederum an ne Errorklasse weitergibt?!

Ne Möglichkeit wäre, der Schnittstelle deiner Module eine eigene Error-Methode zu verpassen, wenn der Frontcontroller dann das Modul instanziert und ausführt (dispatch) und dort ne Exceptions fliegt, wird die im Frontcontroller abgefangen und automatisch die Error-Methode des jeweiligen Moduls aufgerufen (und die Exception mit übergeben).

Dann kannst du in jedem Modul anders reagieren und wenn du eigene Exceptions schmeißt die dort auch für das Modul passend und global in einer Error-Methode verarbeiten.

Wenn du eine Elternklasse für die Module hast, kannst du dort ja eine "Standard-Error-Methode" implementieren, für den Fall, dass du nicht extra für ein Modul eine "andere" ErrorMethode schreiben willst / brauchst

Geändert von robo47 (15.04.2008 um 16:43 Uhr).
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2008, 13:50 Nach oben    #5
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard

Das Problem ist, die Exception wird eigentlich nie in der Controller klasse geworfen, sondern in klassen wie zum Beispiel die verbindung zur DB oder sowas...

da wollt ich einen globalen error handler registrieren, der sich dann um die verarbeitung kümmert. Wenn es ausgegeben werden soll, dann wird statt auf das aufgerufene Template auf ein errortemplate umgeleitet...
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.04.2008, 12:45 Nach oben    #6
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard

Sorry für den Dopplepost, aber das passt in den alten nicht rein!

Ich hab es jetzt erstmal so gelösst, das ich ein Application_Controller dazwischen schalte.
Heißt, der aufruf in der Bootstrapper geht dann so:
PHP-Code:
$application Application_Controller::getInstance();
$application->init();
/**
 * viel Konfigurationsspaß
 *....
 **/
$application->run(); 
so dann der Code des Application Controllers:
PHP-Code:
<?php
class Application_Controller
{
    protected static 
$instance null;

    protected function 
__construct()
    {
    }
    
    public static function 
getInstance()
    {
        if (
self::$instance === null)
        {
            
self::$instance = new Application_Controller();
        }
            return 
self::$instance;
    }
    public function 
init()
    {
        
$FrontController Front_Controller::getInstance();
        
$request $FrontController->getRequest();
        
Debug::Dump($request);
    }
    
    public function 
run()
    {
        
/**
         * @todo 
         */
    
}
    
    public function 
loadController()
    {
     
/**
      * @todo: Code....
      */
    
}
    
    public function 
loadView()
    {
       
/**
      * @todo: Code....
      */
    
}
}
?>
so die unterne methode interresieren erstmal nicht.
Mir geht es um init();
Dort hole ich mir aus dem Front_Controller den Request in Form eines Arrays:
Code:
array(4) {
  ["module"]=>
  string(5) "index"
  ["controller"]=>
  string(4) "test"
  ["action"]=>
  string(3) "lol"
  ["QUERY_STRING"]=>
  array(2) {
    ["GET"]=>
    array(0) {
    }
    ["POST"]=>
    array(0) {
    }
  }
}
sieht im normalfall in etwa so aus...
Wenn jetzt irgendwo eine Exception geworfen wird, dann hab ich einen Error_Controller registriert, der sich um die Verarbeitung kümmert.
Er wiederum manipuliert den Front_Controller, wenn die Exception ausgegeben werden soll. Das sieht dann so aus:
PHP-Code:
$echo Front_Controller::getInstance();
        
$echo->setController('error');
        
$echo->setAction('index');
        
Debug::Dump($echo);
        
$application Application_Controller::getInstance();
        
$application->init(); 
das Debug::Dump(); gibt mir lediglich ein formatiertes var_dump()...

So mein Problem ist jetzt, das der Front controller zwar richtig manipuliert wird, aber in der init(); methode nicht das richtige ankommt.
Ich denke ja, es liegt daran, dass der Application_Controller Singletone ist und dadurch die init() methode nicht wirklich neu aufgerufen wird, und den neuen request bekommt...
hat da jemand ne idee wie ich es schaffe, das der Application_Controller den neuen Request bekommt?
__________________

Geändert von Jann Hendrik (19.04.2008 um 13:42 Uhr). Grund: smily deaktiviert. Bitte beim nächsten Mal selbst drauf achten!
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.04.2008, 23:14 Nach oben    #7
Basti
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 745
Standard

Warum liegt der FrontController hinter dem ApplicationController? Und warum willst du den Request manipulieren?

Mein Vorschlag:
PHP-Code:

set_error_handler
('errorHandler');

function 
errorHandler(...)
{
    die(
'bootstrap error ...');
}

class 
FrontController
{
    protected 
$Context;

    public function 
__construct()
    {
        
$this->Context $this->buildContext();
    }

    public function 
run()
    {
        
$Ac = new ApplicationController($this->Context);
        
$Ac->run();
    }
}

class 
ApplicationController extends Controller
{
    protected function 
init()
    {
        
set_error_handler(array($this'errorHandler'));
    }

    public function 
run()
    {
        
$sController $this->Request->get('controller');
        
$sAction $this->Request->get('action');

        try {

            
$Controller $this->addChild('controller'$sController);
            
$Conroller->execute($sAction);

        } catch (
Exception $E) {

            
$Controller $this->addChild('controller''Error');
            
$Controller->setError($E);
        }

        
$this->display();
    }
}

abstract class 
Controller
{
    protected 
$Request;

    final public function 
__construct(Context $Context)
    {
        
$this->Request $Context->getRequest();
        
$this->init();
    }

    protected function 
init()
    {
    }

Oder so halt…

Basti

Geändert von Basti (19.04.2008 um 23:19 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.04.2008, 09:36 Nach oben    #8
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard

ok, ich bin noch nicht ganz mitgekommen.
Also die buildContext Methode ist dafür da die aufgerufene adresse richtig zu routen? und danach zu entscheiden welcher Controller aufgerufen werden muss, oder wie?

Und in der Run methode setzt du alles in einen try-catch block, da ja alle Exceptions innerhalb dieses blocks geworfen werden...stimmt!
Danke basti!
da kann ich mir was draus basteln!

Vielen Dank!!!
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.04.2008, 19:52 Nach oben    #9
Basti
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 745
Standard

Zitat:
Zitat von kampfgnom Beitrag anzeigen
ok, ich bin noch nicht ganz mitgekommen.
Also die buildContext Methode ist dafür da die aufgerufene adresse richtig zu routen? und danach zu entscheiden welcher Controller aufgerufen werden muss, oder wie?
Nein, das ist bei mit nur ein Objekt, dass Request, Session und Config enthält – z.T. auch gefiltert, damit die Controller nur „ihren“ Request bekommen, unabhängig davon, wo sie wie eingebaut sind (Decorierer).

Die Entscheidung, welcher Controller eingebunden wird trifft hier der ApplicationController aufgrund z.B. der Infos, die er aus dem Request zieht.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.04.2008, 20:23 Nach oben    #10
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
Zitat:
Zitat von kampfgnom Beitrag anzeigen
ok, ich bin noch nicht ganz mitgekommen.
Also die buildContext Methode ist dafür da die aufgerufene adresse richtig zu routen? und danach zu entscheiden welcher Controller aufgerufen werden muss, oder wie?
Nein, das ist bei mit nur ein Objekt, dass Request, Session und Config enthält – z.T. auch gefiltert, damit die Controller nur „ihren“ Request bekommen, unabhängig davon, wo sie wie eingebaut sind (Decorierer).

Die Entscheidung, welcher Controller eingebunden wird trifft hier der ApplicationController aufgrund z.B. der Infos, die er aus dem Request zieht.

Basti
Das ist mir dann beim weiteren auseinandernehmen deines Codes auch aufgefallen.
Mittlerweile funtkioniert es ziemlich gut!
jetzt steh ich nur noch mit den header mehr oder weniger auf kriegsfuss. Aber das ist nur ne stilfrage bzw eine frage der codelänge...
Danke!!

kann man header auch so senden:
PHP-Code:
        $code 404;
        
header("HTTP/1.0 ".$code); 
oder muss ich immer alles mit senden? also auch das Notfound?
Ich mein, wenns nicht geht mach ich mir nen array mit diesen beschriebungen aber das wäre ja mehr arbeit^^
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2008, 17:15 Nach oben    #11
Dennis
Neuer Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 9
Standard

Zitat:
Zitat von kampfgnom Beitrag anzeigen
HEs geht darum, das er alle Ausnahmen auffangen soll, die irgendwo im Ablauf auftreten. Danach soll eine Fehlerseite Produziert werden.

Mein Prinzipielles Vorgehen wäre so:
Request kommt -> Frontcontroller ---(routet zum Controller)-->View-->Ausgabe

Nur irgendwo muss jetzt gewährleistet werden, das bei einem Fehlerfall nicht das normale Template angezeigt wird, sondern meine Fehlerseite...
Ich steh irgendwie auf'm Schlauch
Wo ist das Problem? Ein Fehler tritt auf, d.h. eine Exception wird geworfen. Sofern sie an Ort und Stelle abgefangen werden kann, kein Problem, ansonsten läuft sie durch, bis sie jmd. fängt. Die letzte Instanz wäre der Front-Controller, der JEDE Exception aus den Controllern fangen sollte und diese dann ggf. an einen Error-Controller übergeben. Wirft der Error-Controller auch eine Exception, schreib ein Logfile und kill die Anwendung. Weitere Fehlerbehandlung wäre zwecklos, nun sollten Bugs bereinigt werden.
Dennis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2008, 18:01 Nach oben    #12
kampfgnom
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 378
Standard

Das problem war schon beseitigt^^

aber trzd danke für deine antwort!
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

« Ein sessionbasiertes Loginsystem | MVC-Gedöhns »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge anzufügen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP und das Observer-Pattern (MVC) Ben Anwendungsdesign / Softwarearchitektur 14 26.05.2006 14:47
MVC - Was darf die View NewYork Anwendungsdesign / Softwarearchitektur 2 03.11.2005 22:42
MVC, Strukturierung, Reaktion auf Events... Ben Allgemeine Java-Programmierung 7 17.06.2005 16:34
MVC Programmierung nur mit Klassen mit UI Endung? Java17 Desktop-Applikationen und Grafik 5 14.03.2005 18:12
MVC Architektur, GUI Java17 Desktop-Applikationen und Grafik 3 03.03.2005 06:21


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:39 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.6.7, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44