Frage

Ich habe eine spezielle Frage, dass eine allgemeine Antwort verwenden könnte ... Beim Bau Multi-Tier-Anwendungen in PHP, hat alles in der Business-Logik-Schicht durchgeführt werden, oder kann jede Schicht funktionieren ... Beispiel, Lassen Sie uns sagen ich eine Anwendung baue, die Benutzerinformationen zeigt (aus der Datenbank) auf der Präsentationsschicht. Soll ich die Business-Schicht auf die Daten einfach an die Präsentationsschicht übergeben, oder einfach nur die Informationen aus der Datenbank direkt in der Präsentationsschicht. Sollte die Präsentationsschicht NUR verwendet werden, um die Daten zu präsentieren, verwendet, um die Zugriffsschicht nur die Daten zu bekommen, und die ganze Arbeit in der Business-Schicht durchgeführt werden?

Auch der verschiedenen Schichten zu sprechen, ist es am besten, Dinge prozedural zu tun, oder OOP mit (wie beinhaltet die Verwendung der Vorlagen zeigen vs eine Klasse unter Verwendung der Vorlagen umfassen, Daten prozedural vs mit einer Klasse Validierung oder Funktionen vs Klassen für die Daten aus der Datenbank bekommen, etc.)

Wie Sie sehen können, ich versuche zu verstehen, wie die Dinge funktionieren, und der beste Weg, Dinge zu tun. Davon abgesehen, wenn Sie einen Rat haben oder keine allgemeinen Tipps zum Thema ... Bitten sie verlassen ..

Danke

War es hilfreich?

Lösung

Web-Anwendungen und n-tier ist interessant, vor allem, weil der Begriff des N-Tieres mit der zunehmenden Verbreitung von JSON und AJAX oder Flash und XMLRPC erweitert. Diese Diagramm auf Webopedia eine gestaffelte blaue Linie zeigt, dass dies auch zum Ausdruck bringt. Fassen wir zusammen: Ihr Unternehmen, Accessor und Präsentationslogik konnte nicht nur auf dem Server vorhanden - aber in einigen Fällen direkt im Browser. Die Absicht von N-Tiere ist aber Trennbarkeit . Wenn Sie Ihre UI oder Ihre Datenbank heraus ändern müssen, oder andere UIs hinzufügen, sollten Sie nicht Ihre Geschäftslogik werden zu beeinflussen. Und das ist, was Ihre API bestimmen würde -. Antizipation den Tag auf Ihre HTML und CSS sind für Flex verworfen und MySQL geändert out für Oracle

Dies ist Anforderungen bestimmt und in einigen Web-Anwendungen habe ich verwendet, sind Variationen von N-Tier gleichzeitig verwendet werden. Nehmen Sie zum Beispiel LyrisHQ (E-Mail ASP). Sie haben einen Kunden Web-Anwendung. Vor kurzem haben sie starren ihre Flash-basierte Anwendung schieben. Dies ist eindeutig eine Menge Daten Versand direkt an den Browser, und es ist wahrscheinlich ein bisschen von Business-Logik in dem Flash-UI dupliziert. Sie müssen beide Anwendungen beibehalten, jedoch, da entweder notwendig ist für andere (und überlappend) Anforderungen.

Die häufigsten PHP-Anwendungen erwägen nicht viel unformatierte Daten an den Browser versenden. Aber wenn du wäre, würde dies Ihnen mitteilen, sehr schnell, wie Sie wollen Ihre APIs entwerfen. Sehr wahrscheinlich würden Sie Controller mögen, die XMLRPC, REST oder SOAP ... zusätzlich zu einer ähnlichen internen Controller-Klasse sprechen könnte, dass Ihre PHP-Präsentationsvorlagen verwendet. Dies würde bedeuten, ausschließlich für eine einfache Web-Login-Seite, würden Sie eine PHP-Vorlage für das Login-Formular haben, die zu einer LoginController Klasse gesprochen. Eine XML-Schnittstelle ebenfalls würde die gleiche LoginController Klasse. So wie man annehmen würde, dass Sie bonkers wäre SQL in eine Ajax-Anfrage zu schreiben ... würden Sie streng Schreiben von Abfragen in Ihrer Präsentationsvorlagen zu vermeiden sein.

Handel Schichten können mehr oder weniger streng sein, denn oft gibt es nie eine Anforderung Marken von Datenbank-Backend zu wechseln. In einem strengen Design N-Tieres, wie Sie Ihre Business-Objekte zu Ihrer Datenbank sprechen würden wären, als ob Sie von MySQL zu MS SQL ohne Umschreiben die Business-Ebene wechseln könnten. Manchmal geschieht dies, indem Objekte für jede Tabelle (Tabelle-Gateway) modelliert, wobei jede Zeile (aktive Datensatz), die jeweils beitreten, oder jede Transaktion. Dies ist, wo so etwas wie PDO oder PHP-ADO ist nützlich, aber nicht ausreichend für eine vollständige Isolierung. ORM / Persistence Layer in Java wie Hibernate demonstrieren besser diese Art der Isolierung, die oft durch ein Object Query Language (OQL) bereitstellt.

Ich selbst bin Unternehmen derzeit einen Back-End-Übergang von einer MySQL-basierten PHP-Anwendung über zu einem MS-SQL ein. Die Anwendung hat immer nur direkte SQL-Abfragen verwendet. Stellen Sie sich vor der Auswahl, wie eine Reihe von Abfragen in einer Klasse zu nehmen und entweder abstrahiert sie oder Subklassifizieren, und hoffentlich nicht die Geschäftslogik zu verändern. Ganz am Minimum, werden Sie wollen, machen alle Ihre SQL indirekt aufruft. ( S. O. Post auf PHP ORM .)

Und schließlich, um Ihre Frage zu OOP: Verwenden Sie es, wie Sie müssen Ihre Anforderungen zu erfüllen. Meine persönliche Technik ist mit Logik direkt in einer PHP-Präsentationsvorlage starten für ein paar Minuten den Ball ins Rollen zu bringen, schon bald werde ich in eine Klasse Refactoring und einer Vorlage. Wenn ich gemeinsame Ideen haben, breche ich Routinen in gemeinsamen Klassen aus, strebt das DNRY Prinzip zu wahren. (A veröffentlichen, so auf, dass hier. OOP ist nicht eine grundlegende Voraussetzung für N-Tier-Design. DNRY ist sehr wichtig für Ihren Code wartbar zu halten, tho. Vonzehn Fristen und Umfang-Verschiebung zerstört eine API. Umgestalten es, bis Sie bekommen, was Sie brauchen, um weiterzumachen. Ich wette, OOP wird Ihnen helfen, dorthin zu gelangen.

Andere Tipps

Ich habe einmal gelesen, etwas zu sagen, dass große Modelle (Business Layer) sollten über große Controller (Accessor Schicht) bevorzugt werden.

Außerdem: Es hängt wirklich von dem Projekt. In meinen Augen ist es nicht immer sinnvoll OOP zu verwenden für alles, vor allem in Skriptsprachen wie PHP (wahrscheinlich wird hier nicht jeder zustimmen) oft ist es einfacher, einfach tun Validatoren als Funktionen ...

Ich rate Ihnen, auf jeden Fall nicht Datenbank Anrufe in der Präsentationsschicht zu haben, dass ihr Zweck vereiteln würden.

Es gibt verschiedene Ansätze zur Multi-Tier-Architektur und sie haben unterschiedliche Empfehlungen.

Zend Framework, die ich gearbeitet habe ist in der Regel von der Form Fat Modell / Thin-Controller-Variante.

Wenn Sie diesen Artikel finden Hinweise auf ein PHP-Framework-Auswahl im Vergleich recht gut sein (in diesem Fall) CakePHP Zend Framework.

Der größte Unterschied in meiner opionion ist der Konvention-over-Konfigurationsansatz von CakePHP genommen, die von der Konfiguration Fokus in Zend Framework sehr unterschiedlich ist.

Durch einen Rahmen verwenden, die viel Sinn macht, wenn ein Multi-Tier-Architektur Implementierung Ihrer befinden sich in einer Art und Weise gezwungen oder zumindest geschoben in OOP verwenden, die nicht eine schlechte Sache ist.

Sie könnten natürlich implementieren, sagen eine 3-Tier-Architektur mit rein funktionalen Anrufen, aber es wäre, dass auch nicht maßstab basierend auf meiner Erfahrung.

Für eine Website der MVC-Muster, die eigentlich wegen der Art und Weise ist ganz anders als die Ebene kommunizieren, ist eine gute Wahl.

Der Unterschied zwischen einem „normalen“ 3-Tier-Bogen und dem MVC-Muster ist, dass die Sicht Zugang sowohl zu dem Controller und die Musterschicht aufweist, wobei als die Präsentationsschicht nur Zugriff auf die logischen Schicht des 3-Tieres hat arch.

Ich stimme mit dem, was, sagte Franz, vor allem über größere Modelle über größere Controller bevorzugen .. Sie auch eine Daumenregel verwenden können, um unterscheiden zu helfen, wo Code gehen sollte: wenn es etwas mit dem UI-Struktur / Fluss zu tun, setzen es in dem Controller; wenn es reine Business-Logik, geht es in dem Modell ..

ich das als Java-Entwickler hinzufügen werden, die viel Erfahrung mit Struts hatte, bevor die PHP Wasser erproben, dauerte es eine Weile, um zu verstehen, wie MVC Ideen zu einer Skriptsprache anzuwenden .. Ich persönlich fand, dass die Verwendung ein System wie CodeIgnitor sehr geholfen .. es den Rahmen bietet, ähnlich wie Struts, und fördert die gute MVC-Muster ..

Meine Welt sieht wie folgt aus:

  

DB1 <- Model1 Accessor zu schaffen   Funktionen, Datenintegrität, Business   Regeln für diesen Datensatz DB2 <- Model2   bereitzustellen Zugriffsfunktionen, Daten   Integrität, Geschäftsregeln für diese   Datensatz

     

Controller: Steuert Datenfluss   Ansichten, Filter / organisiert Daten aus   Ansichten. Implementiert Geschäftsregeln für   die angegebenen Anwendung . weiß der   Geschäftsregeln zwischen Modellen.

     

Ansichten: Nicht mehr als Vorlagen   daß die Anzeigedaten, die durch die bereitgestellte   Regler. Geben Sie alle Daten an die   Regler. Hat keine Kenntnis von   Model1 oder Model2 oder das Geschäft   Logik, die sie regiert.

Ich empfehle, einige der Forschung über Design Patterns, da dies das fehlende Stück des Puzzles ist. Es gibt eine Reihe von PHP-spezifischen Büchern, die dieses Thema abdecken (die, die von A Drücken Sie gut ist) sowie die ‚Bibel‘ von Design Patterns: "Designmuster: Elemente wiederverwendbarer objektorientierte Software"

Lassen Sie uns für stabilere Version warten Doctrine2 .

Es wird mit Ausdauer-ignorant Domain-Objekt Philosophie entwickelt. Es wird viel einfacher sein, Multi-Tier-Anwendung dieses Rahmens mit Hilfe zu entwickeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top