php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.09.2010, 11:17  
Neuer Benutzer
 
Registriert seit: 01.09.2009
Beiträge: 12
PHP-Kenntnisse:
Anfänger
Alex04 befindet sich auf einem aufstrebenden Ast
Standard MVC Klasse und Prinzip

Hallo,
ich schreibe derzeit ein Projekt in PhP. Normalerweise bin ich eher von der JAVA und C# Seite und da wird das MVC Pattern etwas anders behandelt.
Soweit so gut, ich habe mir einen FrontController geschrieben, weil ich zu jeder View einen eigenen Controller haben will und nicht den einen großen Controller:
PHP-Code:
<?php
class Controller {

    private static 
$sInstance null;
    
    private 
$controllerPath;
    
    private 
$controller;
    
    private 
$configObject;

    public static function 
getInstance() {
        if(
self::$sInstance==null) {
            
self::$sInstance = new Controller();
        }
        return 
self::$sInstance;
    }

    public function 
__construct() {
        
$this->controllerPath $configObject->webroot."/controller/";
        
spl_autoload_register("Controller::autoload");
        include_once(
$this->webroot."/lib/AutoLoader.php");
        
initConfigurationObject();
    }
    
    private function 
initConfigurationObject() {
        
$configObject ConfigDAO::getConfigurations();
    }

    public static function 
autoload($pClass) {
        
AutoLoader::getInstance($configObject->webroot);
    }
    
    public function 
go() {
        
$this->controller $_GET['page']."Controller";
        
$this->controllerPath.= $_GET['page']."Controller.php";
        require_once(
$this->controllerPath);
        if(!
file_exists$_SERVER['DOCUMENT_ROOT'].$this->controllerPath)) {
            throw new 
Exception("COULD NOT FIND CONTROLLER PATH ".$this->controllerPath);
        } 
        
        if(!
class_exists$_SERVER['DOCUMENT_ROOT'].$this->controller,true)) {
            throw new 
Exception("COULD NOT FIND CONTROLLER CLASS ".$this->controller);
        }
        
        
$controller = new $this->controller($this->configObject->webroot$_GET['action'], $configObject);
        
        
$controller->run();
    }
}

?>
Jeder Controller gehört dabei wie gesagt zu einer View und ist von der BaseController Klasse abgeleitet, die eigentlich nix macht außer die run() Methode vorgeben und 2 Member speichern.

Die Frage ist nun, ob das optimal gelöst ist oder ob es schönere Wege gibt.
Gerade die übergabe der page gefällt mir iwie nicht sonderlich.

Weiter wurde mir gesagt, dass der Zugriff auf die Datenbank von den Modelklassen geregelt wird. Ich finde auch das nicht schön und habe wie in JAVA DAO Klassen dafür geschrieben. Vielleicht hat aber jmd von euch noch bessere Anregungen...

Vielen Dank schonmal im Voraus!

Lg
Alex

Geändert von Alex04 (06.09.2010 um 11:21 Uhr).
Alex04 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.09.2010, 11:55  
Erfahrener Benutzer
 
Registriert seit: 05.02.2009
Beiträge: 1.356
PHP-Kenntnisse:
Fortgeschritten
Destruction ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Symfony
__________________
"Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]
Destruction ist offline   Mit Zitat antworten
Alt 06.09.2010, 12:03  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.629
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

APF
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.09.2010, 12:13  
Erfahrener Benutzer
 
Registriert seit: 23.08.2010
Beiträge: 492
PHP-Kenntnisse:
Fortgeschritten
mimomamu sorgt für eine eindrucksvolle Atmosphäremimomamu sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Alex04 Beitrag anzeigen
... weil ich zu jeder View einen eigenen Controller haben will ...
Ungünstig. Eine klassische Anforderung ist: wenn das Programm die Formulareingaben erfolgreich verarbeitet hat soll auf die Seite weitergeleitet werden, die der Benutzer vor Aufruf des Formulars gesehen hat. Dort soll dann zusätzlich Feedback über die erfolgreiche Formularverarbeitung angezeigt werden. Das ist nicht umsetzbar, wenn der Controller, der ja für die Formularverarbeitung zuständig ist, den angezeigten View nicht frei wählen kann.

Zitat:
Zitat von Alex04 Beitrag anzeigen
... und nicht den einen großen Controller:
Das ist kein Grund, jedem Controller einen festen View zu geben.

PHP-Code:
        if(!file_exists$_SERVER['DOCUMENT_ROOT'].$this->controllerPath)) { 
Es ist sehr ungünstig, zu verlangen das dein Framework unterhalb vom Document Root liegt. PHP kann aus beliebigen Verzeichnissen Dateien einbinden.
__________________
Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden
mimomamu ist offline   Mit Zitat antworten
Alt 06.09.2010, 12:42  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.128
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Das ist nicht umsetzbar, wenn der Controller, der ja für die Formularverarbeitung zuständig ist, den angezeigten View nicht frei wählen kann.
Es spricht nichts dagegen. Für den Erfolgsfall kann es einen separaten Controller geben. Allerdings wäre es hier wirklich sinnvoller, den Controller entscheiden zu lassen, welchen View er benutzen möchte.
xm22 ist offline   Mit Zitat antworten
Alt 06.09.2010, 12:56  
Neuer Benutzer
 
Registriert seit: 01.09.2009
Beiträge: 12
PHP-Kenntnisse:
Anfänger
Alex04 befindet sich auf einem aufstrebenden Ast
Standard

Hallo und schonmal besten Dank für eure Antworten.

Naja Symfony und APF kenn ich bzw bin während meiner Recherchen schon drauf gestoßen, allerdings wollte ich einen Controller selber schreiben. Erstens um mich einzuarbeiten und zweitens weiß ich nicht ob für meine Anwendung ein Framework nicht vielleicht etwas überzogen ist.

Code:
Es ist sehr ungünstig, zu verlangen das dein Framework unterhalb vom Document Root liegt. PHP kann aus beliebigen Verzeichnissen Dateien einbinden.
Shit, stimmt, muss ich ausbessern und sollte natürlich nicht so sein, Danke!

Code:
Ungünstig. Eine klassische Anforderung ist: wenn das Programm die Formulareingaben erfolgreich verarbeitet hat soll auf die Seite weitergeleitet werden, die der Benutzer vor Aufruf des Formulars gesehen hat. Dort soll dann zusätzlich Feedback über die erfolgreiche Formularverarbeitung angezeigt werden. Das ist nicht umsetzbar, wenn der Controller, der ja für die Formularverarbeitung zuständig ist, den angezeigten View nicht frei wählen kann.
Naja das kann ich ja so auch machen. Der Controller kann ja im Falle einer erfolgreichen Formularbearbeitung wieder auf die Ursprungsseite leiten. Das ist denk ich kein Problem.
Weiter heißt ein Controller je View nicht, dass er nur diese eine statische seite anzeigen kann sondern je nach input usw natürlich die Ausgabe variiert.

Beispiel(nur exemplarisch):

PHP-Code:
<?php
class RegisterController extends BaseController{

    public static 
$FULLMODE "FULL";
    public static 
$SHORTMODE "SHORT";
    private static 
$afterRegisterAction "postregister";

    private 
$dialog;
    private 
$registerMode;

    public function 
__construct($pRoot$pAction$pConfigObject) {
        
parent::__construct($pRoot$pAction$pConfigObject);
        
$this->dialog = new RegisterDialog($this->configObject->captchaSecure);
    }

    public function 
run() {
        if (
strcmp($this->actionself::$afterRegisterAction)) {
            
$this->handlePostRegister();
        } else {
            
$this->handlePreRegister();
        }
    }

    private function 
handlePostRegister() {

    }

    private function 
handlePreRegister () {
        if(
strcmp($this->registerModeself::$FULLMODE)) {
            
$this->dialog->showFullRegistrationDialog();
        } else if(
strcmp($this->registerModeself::$SHORTMODE)) {
            
$this->dialog->showShortRegistrationDialog();
        }
    }
}
?>
Will heißen, ein RegisterController könnte auch einen LoginController kennen und den Nutzer dann direkt dorthin weiterleiten usw...
Alex04 ist offline   Mit Zitat antworten
Alt 06.09.2010, 13:48  
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 1.124
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Weiter heißt ein Controller je View nicht, dass er nur diese eine statische seite anzeigen kann sondern je nach input usw natürlich die Ausgabe variiert.
Wenn Du dann trotzdem je Controller eine View hast,
dann verlagerst Du Logik die in den Controller gehört in die View.

Du hattest gefragt ob Deine Lösung optimal ist
und Dir wurde gesagt, daß eine View je Controller nicht optimal ist.

Wenn Du trotztdem auf Deiner "Lösung" beharrst: wieso fragst dann ?

Zitat:
wieder auf die Ursprungsseite leiten.
per header Location oder wie ?

Je nach Request wird der Inhalt generiert
und nicht mit header Location weitergeleitet.
__________________
Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.
Koala ist offline   Mit Zitat antworten
Alt 06.09.2010, 16:41  
Erfahrener Benutzer
 
Registriert seit: 05.02.2009
Beiträge: 1.356
PHP-Kenntnisse:
Fortgeschritten
Destruction ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
hehehe
Dachte mir schon dass das kommt...
__________________
"Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]
Destruction ist offline   Mit Zitat antworten
Alt 06.09.2010, 17:01  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.629
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Na wenn du mir so eine geniale Vorlage bietest!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.09.2010, 23:18  
Neuer Benutzer
 
Registriert seit: 01.09.2009
Beiträge: 12
PHP-Kenntnisse:
Anfänger
Alex04 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Koala Beitrag anzeigen
Wenn Du dann trotzdem je Controller eine View hast,
dann verlagerst Du Logik die in den Controller gehört in die View.

Du hattest gefragt ob Deine Lösung optimal ist
und Dir wurde gesagt, daß eine View je Controller nicht optimal ist.

Wenn Du trotztdem auf Deiner "Lösung" beharrst: wieso fragst dann ?


per header Location oder wie ?

Je nach Request wird der Inhalt generiert
und nicht mit header Location weitergeleitet.
Zuerst mal wieder danke für eure Antworten!!!

@Koala
Naja was heißt
Code:
Wenn Du trotztdem auf Deiner "Lösung" beharrst: wieso fragst dann ?
Naja wenn mir Gründe genannt werden die so nicht richtig sind, dann muss ich ja wohl weiter argumentieren oder nicht?!

Zitat:
per header Location oder wie ?
Nein nicht per headerlocation. Das geht beispielsweise auch indem der Controller mittels des Config objekts, das er Standardmäßig immer beim Erstellen im Ctor bekommt, die location in der Formular action setzt.

Da ist weder headerlocation, noch eine Weiterleitungsview vorhanden...

Versteh mich bitte nicht falsch, ich glaub dir gerne, dass meine Lösung nicht optimal ist. Ich finde sie ja selber noch nicht so toll, nur der genannte Grund leuchtet mir nicht ein.
Bzw. hättest du einen Vorschlag das besser zu lösen ?
Alex04 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Klasse aus einer anderen Klasse aufrufen Tobby PHP-Fortgeschrittene 7 14.07.2010 20:05
[Erledigt] Nur einer bestimmten Klasse Zugriff andere Klasse erlauben Turamisi Software-Design 2 20.02.2010 20:31
Mysql Klasse macht Probleme in verschachtelten / verzweigten SQL Abfragen litterauspirna PHP Tipps 2010 3 16.02.2010 12:54
[Erledigt] variable außerhalb einer klasse definieren - &quot;var $variable&quot; in klasse not taurus PHP Tipps 2009 14 05.12.2009 16:00
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
[Erledigt] Eine klasse einbinden newWorldOrder PHP Tipps 2009 2 23.02.2009 19:32
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Klasse aus externer Klasse aufrufen kostja PHP Tipps 2008 8 07.08.2008 14:13
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
Rückgabewert auf einer Klasse anders als in der Klasse micbur PHP Tipps 2005-2 6 10.06.2005 15:06
Klassenobjet in anderer Klasse benutzen inu PHP Tipps 2004 6 19.09.2004 10:58
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
was bedeutet $this->controllerpath, mvc klasse, mvc php document root, php eigene mvc klasse, zitat mvc

Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum