2010-11-22 8 views
0

Dies ist eine Frage ohne wirkliches Problem hinter, nur ein Produkt meines kranken Geistes und treibt die Dinge etwas seltsam :)PHP: Code-Design Dilemma

So zu machen, ich habe diese PHP-Anwendung auf meinem bauen eigener MVC-orientierter Rahmen (ja, ich habe meinen eigenen gemacht, anstatt den bestehenden zu verwenden). Und es wird durch das Buch gemacht, also haben wir Modell (Daten und Datenbankmanipulation), Ansicht (Vorlagen gefüllt mit Daten und Rendering-Ausgabe) und Controller (behandelt Anfragen, erhält geeignete Daten vom Modell, legt Daten in Sicht). Klassisches und langweiliges Szenario mit Request-Routing mit .htaccess-Regeln.

Gestern habe ich einige Änderungen in meinem Code, Bugfixes, paar Verbesserungen, etc. und ich fühlte mich stark drängen, den Code der Controller neu zu ordnen. Sie fühlen sich etwas schwer und aufgebläht an und die Anzahl der Methoden macht es schwierig, durch die Datei und solche Sachen zu navigieren. Ich bin mir sicher, dass jeder weiß, wovon ich rede.

Ich denke darüber nach, meine Controller-Klasse in viele Klassen zu zerlegen, von denen jede nur eine Art von Anfrage wie Login oder Registrierung oder showProfile oder killMe behandelt.

Jetzt Controller-Klasse hat öffentliche Methoden entsprechend Teile von benutzerfreundlichen (oder vielleicht SEO freundlich) URLs und Routing-Klasse ruft richtige Controller und es ist Methode nach URL-Inhalt.

Änderung, über die ich denke, würde ein wenig Routing-Mechanismus in den Aufruf bestimmter Controller und es Execute() -Methode verschieben.

Zum Beispiel für url = "www.example.com/users/login" jetzt sieht es wie folgt aus:

$controller = new url[0](); 
$method = url[1]; 
echo $controller->$method(); 

und jetzt URL ändern würde zu "www.example.com/login" und Routing-Code würde so aussehen:

$controller = new url[0](); 
controller->Execute(); 

I Teile weggelassen, wo ich Urls analysieren und extrahieren Informationen von ihnen Routing, wie es irrelevant für meine Frage ist.

Welche Vorteile sehe ich in dieser Änderung?

  • eine spezielle Klasse pro Anfrage
  • kleinere Dateien
  • kleinen Code
  • einfache Wartung
  • begrenzte Bruchgefahr Controller zu arbeiten, wenn das Hinzufügen neue Funktionen (neue Arten von Anfrage) oder Fehler zu beheben

Nachteile?

  • möglicherweise viele Klassen
  • mögliche Leistung getroffen
  • ???

Und meine Frage ist, was denken Sie über diese Idee und macht es überhaupt Sinn. Und natürlich bin ich mehr daran interessiert, warum ich es nicht tun sollte, als warum.Also, wenn Sie können aus irgendwelchen Gründen ein, warum diese schreckliche Idee wäre und Gräuel bitte jetzt sprechen, bevor es zu spät sein wird :)

EDITED Klärung einer Frage:

ich, ob ich frage sollte meinen einzelnen großen Controller brechen, der viele Arten von Anfragen durch seine Methoden in viele kleine Controller behandelt, von denen jeder nur einzelne Art von Anfrage bearbeitet.

Jetzt habe ich Controller-Benutzer, die Anfragen wie "Login", "ShowLoginForm", "registrieren", "aktivieren" usw. behandelt. Refactored Code würde aus separaten Controllern für jede dieser Anfragen bestehen.

+0

Fragen Sie, ob [FrontController] (http://martinfowler.com/eaaCatalog/frontController.html) [Transaktionsskripten] (http://martinfowler.com/eaaCatalog/transactionScript.html) oder Methoden in aufrufen sollte a [PageController] (http://martinfowler.com/eaaCatalog/pageController.html) oder etwas anderes? Ich verstehe nicht ganz, wonach genau du suchst. – Gordon

+0

Ich habe eine Erklärung hinzugefügt, worüber ich frage :) – grapkulec

Antwort

0

Ein Nachteil, den ich für die alte und die neue Methode denken kann, ist, dass Sie URLs direkt auf Klassennamen abbilden. Wenn Sie die URL ändern möchten, müssen Sie den Klassennamen ändern. Wenn Sie verschiedene URLs für verschiedene Sprachen haben möchten, müssen Sie eine Ebene hinzufügen, die URLs ohnehin Klassennamen zuordnet. Das ist, warum ich lieber eine Routing-Klasse haben würde, URLs zu Klassennamen abzubilden, die Ihnen eine Naht bietet, Dinge zu ändern.

+0

guter Punkt. Ich sollte wahrscheinlich darüber nachdenken, URLs von tatsächlichem Code zu trennen, der sie handhabt. Das aktuelle Mapping ist nicht sehr flexibel. – grapkulec

+0

Ich akzeptiere diese Antwort, weil das genau das ist, was ich in meinem Code getan habe und es löste alle meine Zweifel und Probleme, die ich hatte schreibe diese Frage :) – grapkulec