CakePHP im Test bei Adventure-PHP-Framework

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden.

Moderator: dr.e.

CakePHP im Test bei Adventure-PHP-Framework

Beitragvon nosch » 30.12.2007, 16:40:10

TEIL I

Hallo liebe Leute,

ich bin auf Eure Testberichte zu den PHP-Frameworks gestoßen und habe sie mit großem Interesse gelesen:
(http://www.adventure-php-framework.org/Seite/FrameworkVergleich).
Dankeschön für die Mühe ein paar der bekanntesten Frameworks miteinander zu vergleichen. Das Ganze ist sehr erhellend.

Ich selbst bin seit einigen Jahren beruflich in Sachen Webentwicklung mit PHP unterwegs und in dieser Zeit auch mit dem einen oder anderen Framework in Berührung gekommen. Entweder waren es in den Agenturen selbst entwickelte Frameworks oder auf dem Open-Source-Markt erhältliche Fertigprodukte.
Unter den Fertigprodukten habe ich mich vor allem mit dem ZendFramework (http://framework.zend.com/) und CakePHP (http://cakephp.org/) intensiver beschäftigt und bin schließlich bei CakePHP hängen geblieben.

Warum habe ich mich für CakePHP entschieden?
Es bietet Scaffolding an (unverzichtbar für meine Entwicklungsarbeit), stellt u.a. im Rahmen des ActiveRecord-Patterns fantastische Model-Methoden zur Verfügung, räumt insgesamt dem Datenbankdesign und der Datenmodellierung einen großen Stellenwert ein (vor jeder Konfiguration und der Controller-Programmierung) und wird von einer recht agilen Entwickler- und User-Gemeinde getragen.

Lange Vorrede kurzer Sinn:
Ich bin ein Cake-Fan und mit einigen der Schlussfolgerungen aus Eurem CakePHP-Test-Bericht unzufrieden.
(http://www.adventure-php-framework.org/Seite/FrameworkVergleich3)

Dies betrifft zunächst
(1) Eure Vorstellung von der grundlegenden Organisation der Templates mit dem PagesController und
(2) Eure Darstellung des URL-Layout.

Dabei beziehe ich mich nur auf die Ausführungen unter http://www.adventure-php-framework.org/Seite/FrameworkVergleich3.
Um es einfach zu machen nehme ich zunächst alle dort zu lesenden Ausführungen wörtlich und gehe nicht von begrifflichen/konzeptionellen Missverständnissen aus (die es aber schließlich mit Sicherheit gibt).

(1) Der PagesController
Der PagesController unter /cake/libs/controller sorgt dafür, wie Ihr richtig anmerkt, dass eine Template-Datei (*.thtml), die im Ordner app/view/pages abgelegt ist, über eine URL mit dem Muster /pages/templateName (ohne Datei-Endung) gerendert wird.
Dann fügt Ihr aber noch hinzu:
Um diese Funktion sicherstellen zu können muss allerdings der PagesController um jeweils eine der Seite gleichnamige
Action-Methode ergänzt werden.

Das ist nicht richtig. Einfach eine Template-Datei im Ordner 'pages' zu speichern genügt völlig.
Also würde (entgegen jedem gesunden Menschenverstand) eine Website lediglich aus statischen Seiten bestehen, dann könnten diese Seiten mit CakePHP ohne eine Zeile PHP-Code zu schreiben, geschweige denn einen PagesController anzupassen, angezeigt werden.

(2) URL-Layout
Im Zusammenhang mit Eurer Darstellung des PagesController geht Ihr auch auf das Layout der URLs in Cake ein und schließt dann daraus:
[...] um dasselbe URL-Layout wie in der vorliegenden Webseite generieren zu können, [muss] ein neuer Controller mit dem Namen SeiteController angelegt werden.

Das Cake-Routing macht aber solch eine Vorgehensweise völlig unnötig. In der Datei app/config/routes.php muss nur folgender Code eingefügt werden:

Code: Alles auswählen
$Route->connect('/Seite/*', array('controller' => 'pages', 'action' => 'display'));

Somit würden alle Anfragen nach dem Muster /Seite/templateName auf den (bereits unter /cake/libs/controller existierenden)
PagesController umgeleitet werden. Ein neuer SeiteController mit diesem (aus der Sicht von CakePHP sehr merkwürdigem) 'require()' muss also bestimmt nicht angelegt werden.


Allerbeste Grüße und einen guten Rutsch ins neue Jahr,
Norbert
Zuletzt geändert von nosch am 02.01.2008, 10:51:12, insgesamt 8-mal geändert.
nosch
 
Beiträge: 6
Registriert: 30.12.2007, 14:33:43
Wohnort: Berlin

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon nosch » 31.12.2007, 18:57:19

TEIL II

Hallo,

bevor ich in das neue Jahr stürze stelle ich noch meinen nächsten Beitrag zu Eurem CakePHP-Test zur Diskussion. Auch hier berufe ich mich nur auf Eure Ausführungen unter http://adventure-php-framework.org/Seite/FrameworkVergleich3.

Eure Darstellung der View-Elemente In CakePHP
Eines Eurer Statements zu diesem Thema hat mich besonders verwirrt:

Statische Bereiche wie Menü und Top-Menü hingegen können über Elements eingebunden werden, die jedoch nur statischen
HTML-Code erzeugen können. Eine Art 'Controller für Elements', mit dem weiterer dynamischer HTML-Code generiert werden kann - um beispielsweise ein Menü aus einem Model-Objekt darzustellen - ist nicht vorgesehen.

Diese Formulierung ist leider unklar und kann so verstanden werden: View-Elemente in CakePHP sind statisch und können z.B. bei der Darstellung eines dynamisch generierten Menüs nicht helfen.

Mit Sicherheit liegt hier ein Missverständnis vor und ich vermute stark, dass Euch ein weitaus komplexeres Problem umgetrieben hat ("Controller für Elements"). Ich werde darauf später in einem weiteren Beitrag zu sprechen kommen.
Jetzt will ich kurz die einfachste Art der Darstellung eines datenbankgestützten Menüs mithilfe eines View-Elements vorstellen, die im Rahmen von CakePHP existiert. Zu beachten ist hier vor allem die Rolle des so genannten AppControllers:

a) Datenbanktabelle 'navigations' anlegen (mit den Feldern id, title, url und sequence).
b) Model 'Navigation' in app/models/navigation.php erstellen:

Code: Alles auswählen
class Navigation extends AppModel {
      var $name = 'Navigation';
   }

c) Gemäß dem Cake-Manual die Datei /app/app_controller.php anlegen (siehe: http://manual.cakephp.org/chapter/controllers) und dort die Klasse AppController einfügen. Ein Prototyp dieser Klasse liegt bereits unter /cake/. Im AppController können controller-übergreifende Methoden definiert werden, weil AppController die Mutter von allen Controllern ist. Und Hier wird folgender Code geschrieben:

Code: Alles auswählen
class AppController extends Controller {
      var $uses = array('Navigation');
   
      function beforeFilter() {
         $navigation = $this->Navigation->findAll(null, array('title', 'url'), 'sequence ASC');
         $this->set('navigation', $navigation);
      }
   }

Per $uses wird das passende Model eingebunden und mit beforeFilter() wird Code vor jeglichen Controller-Anweisungen ausgeführt.
d) Unter app/views/elements die Datei 'navigation.thtml' erstellen. Sie beinhaltet im einfachsten Fall:

Code: Alles auswählen
<?php for($i = 0; $i < count($navigation); $i ++) : ?>
<?php echo '&raquo'; ?>
<?php echo '<a href="' .$navigation[$i]['Navigation']['url']. ' " title="' . $navigation[$i]['Navigation']['title'] . '" class="menu_links">' . $navigation[$i]['Navigation']['title'] . '</a>'?>
<?php echo '<br />'; ?>
<?php endfor; ?>

e) Im Haupt-Template app/views/layouts/default.thtml an einer passenden Stelle den folgenden Code-Schnippsel einfügen:

Code: Alles auswählen
<?php echo $this->renderElement('navigation'); ?>

f) Fertig!


Schöne Grüße,
Norbert
Zuletzt geändert von nosch am 02.01.2008, 03:10:04, insgesamt 1-mal geändert.
nosch
 
Beiträge: 6
Registriert: 30.12.2007, 14:33:43
Wohnort: Berlin

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon nosch » 02.01.2008, 03:06:47

TEIL III.

Frohes neues Jahr!

In diesem Teil meiner Auseinandersetzung mit Eurem CakePHP-Test komme ich auf das von Euch aufgeworfene Kern-Problem zur Sprache:
Problematisch ist das Bauen von beliebig tief verschachtelten Templates, was sich bei der Einbindung weiterer dynamischer Bereiche in die Seite zeigt.

Nach diesem Satz folgen die bereits in meinem vorangegangenem Beitrag erörterten Aussagen zu den View-Elementen (Beispiel: Menü). Daraufhin kommt Ihr auf das Thema der Auslagerung von Business-Logik kurz zu sprechen (Beispiel ist immer noch das Menü) und erwähnt dann in diesem Zusammenhang wieder kurz die in CakePHP vorhandene Möglichkeit der Programmierung und Einbindung von Komponenten.

Ich hätte mir an dieser zentralsten Stelle Eurer gesamten Argumentation gewünscht, dass man mir zunächst kurz, aber präzise erklärt
(1) wie denn z.B. ein dynamisches Menü mit CakePHP standardmäßig umgesetzt werden kann
(2) wie Templates (Layouts, Views und Elemente) mit diesem Framework generell verschachtelt werden und
(3) wie eine Einbindung und Verschachtelung dynamischer View-Bereiche prinzipiell mit CakePHP erfolgen kann, denn Komponenten stellen hier nicht das Prinzip dar.

Ich halte meine Fragen für relevant, weil es doch bei Eurem Test im Kern um das konkrete Projekt einer Mini-Test-Website ging. Und um das mit CakePHP zu bewerkstelligen, muss ich (1), (2) und (3) doch wissen.


(1) Dynamisches Menü
Die erste meiner Fragen habe ich mir bereits im vorangegangenen Beitrag selbst beantwortet, indem ich kurz und knapp die Implementierung eines dynamischen Website-Menüs mit CakePHP dargestellt habe (http://forum.adventure-php-framework.org/de/viewtopic.php?f=5&t=20#p52).

Fazit:
Will man mit CakePHP Logik implementieren die controller-übergreifend wirken soll, wie im Fall eines Webite-Menüs, dann regelt man so etwas standardmäßig, quasi offiziell, in der Klasse AppController (app/app_controller.php). Hierzu stehen einem die Callback-Funktionen beforeFilter(), afterFilter() und beforeRender() zur Verfügung (siehe: http://manual.cakephp.org/chapter/controllers).


(2) Verschachtelung von Templates mit renderElement()
Nur zur Erinnerung möchte ich wiederholen, dass in CakePHP Templates generell mit der View-Methode renderElement() miteinander verbunden werden können. Man übergibt an diese Methode den Pfad und Namen der View-Datei ohne Datei-Endung.
So schreibt man z.B. in der default.thtml (dem Main-Template) an passender Stelle:

Code: Alles auswählen
<?php echo $this->renderElement('header'); ?>

Damit würde man die Datei /app/views/elements/header.thtml einbinden die den HTML-Dokumentenkopf beinhalten könnte.
Falls man im Main-Template ein weiteres Element benötigt, dann fügt man hier wiederum ein renderElement() ein. Zum Beispiel wird diesmal ein Menü benötigt. Und wenn in einem Element ein Subelement eingebettet werden muss, z.B. soll im Header-Element ein CSS-Style-Block aus einem separaten View-Element aufgerufen werden, dann wird eben in der header.thtml geschrieben:

Code: Alles auswählen
<?php echo $this->renderElement('header/css.thtml'); ?>

Der Ordner /header bietet sich hier als Unterordner von /elements an um die Subtemplates für den Header aufzunehmen.
Das Ganze lässt sich natürlich beliebig erweitern und verschachteln.

Fazit::
Möchte man lediglich statische Seiten und Elemente organisieren, dann bietet bereits renderElement() die Möglichkeit tief verschachtelte Layouts mit CakePHP zu verwirklichen.


(3) Verschachtelung von dynamischen Elementen mit requestAction()
Jetzt will ich aber ganz bestimmt nicht nur statische HTML-Seiten mit CakePHP zu einer ordentlichen Website verbinden, sondern natürlich bestimmte Bereiche mit dynamischen Inhalten füllen. Auch möchte ich auf einer Seite gleichzeitig mehrere dieser dynamischen Bereiche vom Browser rendern lassen.

Mit der Methode requestAction() aus der Object-Klasse, der Basis-Klasse von CakePHP, kann das starre Ein-Request-Ein-Controller-Muster aufgelöst und flexibel neugestaltet werden. Dieser Methode können zwei Parameter übergeben werden: string $url, array $extra.
Im CakePHP-Handbuch steht hierzu folgendes (http://manual.cakephp.org/chapter/controllers):
This function calls a controller's action from any location and returns the rendered view. The $url is a Cake URL (/controllername/actionname/params). If the $extra array includes a 'return' value, AutoRender is automatically set to true for the controller action.


a) Mit requestAction() lassen sich in einem Controller andere Controller aufrufen:

Code: Alles auswählen
class NewsController extends AppController {
   (...)
   function index() {
      $newsData = array(
         0 => array(
            'topic' => 'RequestAction - voll der Knaller!',
            'author' => 'Norbert Schmidt'
         )
      );
      
      // Wurde dieser Controller mit requestAction() aufgerufen?
      if(isset($this->params['requested'])) {
         return $newsData;
      } else {
         $this->set('newsData', $newsData);
      }
      
      // Aufruf des UsersControllers mit requestAction() innerhalb von NewsController
      $usersOnline = $this->requestAction('/users/index');
      $this->set('usersOnline', $usersOnline);
   }
}

Über $this->params['requested'] kann übrigens ermittelt werden, ob ein Controller per URL oder per requestAction() aufgerufen wurde. So lassen sich z.B. je nach Art des Requests Daten direkt zurückgeben, oder Daten einem View zuweisen und dieses View dann rendern.

b) Mit requestAction() lassen sich direkt in einem Template (Layout, View oder Element) Rückgabewerte beliebiger Controller-Actions diesem Template zuweisen:

Code: Alles auswählen
<!-- direkter Aufruf des UsersControllers z.B. in topmenu.thtml -->
<?php $usersOnline = $this->requestAction('/users/index'); ?>
<div>User Online: <? echo $usersOnline['firstname']; ?> <?=$usersOnline['lastname']; ?></div>

c) Mit requestAction() lassen sich im AppController applikationsweit weitere Controller aufrufen:

Code: Alles auswählen
class AppController extends Controller {
   (...)
   // applikationsweiter Aufruf des NewsControllers im AppController
   function beforeRender() {
      $hotNews = $this->requestAction('/news/index');
      $this->set('hotNews', $hotNews);
   }
}

Der Aufruf des fremden Controllers im AppController ist hier in die Callback-Funktion beforeRender() eingebettet.

Fazit:
Mit requestAction() verfügt CakePHP über ein Konzept mit dem sich, wie Ihr Euch ausgedrückt habt, ein "Controller für Elements" realisieren lässt. Somit konnte ein Ansatzpunkt für das Umsetzen von "komplexen Layouts" mit CakePHP gefunden werden.


Die besten weiterführenden Infos zu requestAction() sind hier zu finden:
- http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction
- http://bakery.cakephp.org/articles/view/using-requestaction-custom-layouts-to-add-xhr-functionality
- http://groups.google.com/group/cake-php/search?group=cake-php&q=requestAction&qt_g=Diese+Gruppe+durchsuchen
- http://www.cakephpforum.net/index.php?showtopic=19


Allerbeste Grüße,
Norbert
nosch
 
Beiträge: 6
Registriert: 30.12.2007, 14:33:43
Wohnort: Berlin

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon dr.e. » 02.01.2008, 13:48:37

Hallo Norbert,

danke für deine Beiträge, die viel Information über die Praxis mit CakePHP enthalten. Die Schwierigkeit beim Artikel bestand ja u.a. darin, dass Alex und ich blutige Anfänger in Sachen CakePHP sind. Ich komme leider heute nicht mehr dazu deine Beiträge komplett nachzuvollziehen, werde das aber Morgen/Übermorgen machen und mich wieder melden.
Viele Grüße,
Christian
Benutzeravatar
dr.e.
Administrator
 
Beiträge: 1431
Registriert: 04.11.2007, 16:13:53

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon nosch » 02.01.2008, 16:41:20

Hallo Christian,

ich freue mich, wenn wir ein wenig über Euren CakePhp-Test, Euren Framework-Test insgesamt und über meine Beiträge diskutieren könnten.

Vielleicht habe ich zum Thema CakePHP zu viel geschrieben, dies ist schließlich kein Cake-Forum. Aber wenn man nach Formulierungen sucht, dann stolpert man schreibend immer weiter, bis letztendlich drei Beiträge entstanden sind. Im Nachhinein betrachtet ist aber der letzte Beitrag der wichtigste, denn hier geht es um die (wenn ich richtig verstanden habe) von Euch völlig zu Recht aufgeworfene Kernfrage:
Mit welchen Konzepten und Methoden unterstützt mich ein Framework bei der Umsetzung von komplexen, modernen Website-Layouts (mit oder ohne Ajax)?

Wenn Du schreibst, dass "Alex und ich blutige Anfänger in Sachen CakePHP sind" (was mit Sicherheit übertrieben ist), dann ändert das aber nichts an meinem ehrlichen Respekt vor Eurer Arbeit: dem Aufbau eines eigenen Frameworks (!) und dem Anzetteln von notwendigen Diskussionen in der Community - neben der täglichen Erwerbsarbeit.

Grüße,
Norbert
nosch
 
Beiträge: 6
Registriert: 30.12.2007, 14:33:43
Wohnort: Berlin

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon dr.e. » 04.01.2008, 01:13:18

Hallo Norbert,

ich antworte mal in einzelnen Posts und beziehe mich auf deine Teile. Denke, das macht die Sache übersichtlicher.

Teil I:
Hier ging es um die Gestaltung der URL, was im Fall von CakePHP durch das Konfigurieren des Routings beeinflusst werden kann. Ich habe mir deine Hinweise genau angesehen und im Artikel wäre tatsächlich deine Lösung die einfachste gewesen. Das erreiche ich einfach dadurch - wie auch schon von dir beschrieben - dass ich in der Routing-Konfiguration die Standard-Routen auskommentiere und statt dessen ein

Code: Alles auswählen
   $Route->connect('/', array('controller' => 'pages', 'action' => 'display','Startseite'));
   $Route->connect('/Seite', array('controller' => 'pages', 'action' => 'display','Startseite'));
   $Route->connect('/Seite/FormularTest', array('controller' => 'Seite', 'action' => 'FormularTest'));
   $Route->connect('/Seite/*', array('controller' => 'pages', 'action' => 'display'));


dort platziere. Bedingung ist allerdings, dass die Inhaltsdateien aus dem Ordner /caketest.de/app/views/demosite in den Ordner /caketest.de/app/views/pages umgezogen werden. Lokal konnte ich das einwandfrei nachvollziehen und auch das Anzeigen der "FormularTest"-Seite funktioniert weiterhin.

Das require() ist an dieser Stelle lediglich ein Stilmittel der objektorientierten Programmierung. Überlegung dazu war, dass ich die Funktionen der Klasse PagesController verwende und durch die Klasse SeiteController spezialisiere. Diese Vorgehensweise ist meiner Meinung nach auch legal und im Fall des dritten Routing-Eintrags auch notwenig. Lösche ich das

Code: Alles auswählen
require_once('../../cake/libs/controller/pages_controller.php');


aus der Datei seite_controller.php wird mir die (berechtigte) Fehlermeldung

Fatal error: Class seitecontroller: Cannot inherit from undefined class pagescontroller in ***\caketest.de\app\controllers\seite_controller.php on line 4


angezeigt. Lasse ich den Controller nicht von der zentralen Basis-Klasse AppController erben beschwert sich der PHP-Parser zu recht mit:

Notice: Undefined property: autoLayout in ***caketest.de\cake\dispatcher.php on line 212 Fatal error: Call to undefined method: seitecontroller->_initcomponents() in ***\caketest.de\cake\dispatcher.php on line 223


Die Lösung ohne require(), die ich laut Manual verwenden sollte ist, den SeiteController von AppController erben zu lassen, da diese Klasse zentral zur Verfügung gestellt wird.
Viele Grüße,
Christian
Benutzeravatar
dr.e.
Administrator
 
Beiträge: 1431
Registriert: 04.11.2007, 16:13:53

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon dr.e. » 04.01.2008, 02:38:21

Hallo Norbert,

hier nun zu Teil II:

Hier ging es uns in der Tat um eine weitaus komplexere Logik als aufgezeigt wird. Daher ist es verständlich, dass es missverständlich beschrieben ist, welche Anforderung genau gestellt werden. Die in deinem Beispiel aufgeführten Interface-Methoden

  • beforeFilter()
  • afterFilter()
  • beforeRender()

waren - insbesondere mir - nicht als Methoden bewusst, die man für das Laden von Daten für dynamische Elemente verwenden kann. Ein Grund für diese Annahme war auch, dass das Objekt-Modell, das zur Laufzeit von den CakePHP-Core-Libs generiert werden nicht wirklich klar ist. Ich habe keine Quelle gefunden, die beschreibt, welche Objekte zur Laufzeit wann, wie und vor Allem mit welchen Beziehungsinformationen zu anderen Objekten generiert werden.

Deine Ausführungen beleuchten das Thema mit praktischem Hintergrund, was der Generierung von dynamischen und wiederverwendbaren Teilen der Anwendung eine neue "Glanz" gibt. Die Methoden lassen sich ganz gut mit dem Timing-Modell des FrontControllers vergleichen. Dieser stellt dem Entwickler auch die Möglichkeit zur Verfügung Actions

  • vor der Erstellung des DOM-Baumes
  • nach der Erstellung des DOM-Baums
  • vor der Transformation des Baumes und
  • nach der Transformation

auszuführen. Um die Beispiele vergleichbar zu machen, kann man im Fall des Menüs davon sprechen, dass in einer "pre-rendering" Action das Model der Anwendung aufgebaut wird. Im Fall von CakePHP wird hier ein Daten-Objekt geladen, im Fall des Adventure-PHP-Frameworks könnte man in einer "prepagecreate" ein Applikationsmodel füllen und diesem mitteilen, in welchem Navigationsknoten der Benutzer sich gerade befindet um hinterher den Menübaum mit Hilfe einer Business-Komponente zu laden.


Was mir, unabhängig von deinen Ausführungen, an der von dir beschriebenen Methode nicht gefällt ist, dass der Entwickler gezwungen ist, das Laden der Daten und das Befüllen des Views im Controller vorzunehmen. Angenommen ich entwickle eine komplexe Applikation, in der ich sehr viele Controller zur Darstellung benötige, so muss ich in jedem dieser Controller diese Funktion implementieren oder zum Mittel der Vererbung greifen. Verwende ich sehr viele dynamische Views, muss ich nicht nur innerhalb eines Controllers das dynamische Verhalten implementieren, sondern auch die Abhängigkeiten der einzelnen Elemente auflösen. Bestes Beispiel ist eine Newsbox auf einer Wetter-Vorhersage-Seite. Navigiere ich zuerst auf eine Unterseite, page dann auf dieser Unterseite in der Newsbox, dann erwarte ich, dass ich die Newsbox auf der gewählten Seite sehe und nicht etwa auf die Startseite weitergeleitet werde und dort die zweite Seite der Newsbox bestaunen darf. Genauso wenig möchte ich auf der gewählten Seite bleiben, ohne dass die Newsbox auf die zweite Seite spingt.
Werden mehrere dieser Abhängigkeiten innerhalb der GUI aufgebaut, muss ich alle diese beachten bzw. auflösen, was ein Verwirrspiel der besonderen Art wird. An dieser Stelle wird die Vorderung nach einem modularerem GUI-Design laut. Zugegeben, diese weitere Abstraktion zieht weitreichende Konsequenzen mit sich, jedoch kann eine komplexe Anwendung nicht in einfachem Quellcode abgebildet werden. Idee dahinter ist, dass ein View komplett separiert vom anderen existieren kann, solange die Bedingung erfüllt ist, dass diese alle vom selben Basis-Objekt abstammen und in einem DOM-Baum strukturiert sind. So ist es beispielsweise möglich einen eigenständigen Controller für Content, Menü, Teaser ... zu erstellen und diese alle während eines Requests (mehr oder weniger) parallel ablaufen zu lassen. Die PageController-Implementierung des Adventure-PHP-Frameworks sieht dazu mehrer Methoden der dynamischen Generierung eines Views vor, die ich hier nicht komplett disktieren möchte. Eine von diesen ist es, einen Document Controller (Controller im Sinne des MVC-Pattern) zu definieren, der als Controller für genau seinen View zuständig ist. Da der Controller ein Teil der Präsentationsschicht ist (gemäß 3-Schicht-Architektur-Pattern) wird dieser seine Daten konsequenterweise von einer Business-Komponente beziehen, die sich zur Daten-Accquise wiederum einer Daten-KOmponente bedient. Die Business-Komponente kann dabei als gemeinsame Basis ein oder mehrere Views gesehen werden, je nach Komplexität einer Anwendung. Im Beispiel des Gästebuchs (siehe http://www.adventure-php-framework.org/Seite/GaesteBuch) wird die Klasse GuestbookManager von zwei Views zur Programmabwicklung herangezogen. Wird die Anwendung komplexer und erfordert diese die Definition von Programmabläufen und Zuständen kommt der FrontController in's Spiel. Mit Hilfe dieser Implementierung kann ich vor dem Aufbau der Präsentationschicht Programmabläufe und Zustände generieren und in einem Model-Objekt (was eigentlich das "echte" Model im Sinne einer 3-Schicht-Architektur ist. Model im Jargon von CakePHP & Co. sind eigentlich "nur" Domain-Objekte) gespeichert werden. Diese können anschließend dem Controller zur Orientierung hinsichtlich GUI-Verhalten oder zur Parametrisierung der Business-Komponente beim Laden von Daten dienen.

FAZIT: CakePHP sieht nicht vor, dass zur Zeit des Dispatchens mehrere Controller ausgeführt werden und somit ist eine generische Seperation von Views IMHO nur sehr bedingt möglich.
Viele Grüße,
Christian
Benutzeravatar
dr.e.
Administrator
 
Beiträge: 1431
Registriert: 04.11.2007, 16:13:53

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon dr.e. » 04.01.2008, 02:40:26

... für Teil III bin ich nun schon zu müde. Mehr von mir Morgen! ;)
Viele Grüße,
Christian
Benutzeravatar
dr.e.
Administrator
 
Beiträge: 1431
Registriert: 04.11.2007, 16:13:53

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon dr.e. » 04.01.2008, 14:00:47

Hallo Norbert,

im aktuellen Post möchte ich nun auf Teil III deines Posts zu sprechen kommen:

Ich halte meine Fragen für relevant, weil es doch bei Eurem Test im Kern um das konkrete Projekt einer Mini-Test-Website ging. Und um das mit CakePHP zu bewerkstelligen, muss ich (1), (2) und (3) doch wissen.

Idee war es - wie unter http://www.adventure-php-framework.org/ ... kVergleich, 1.4. Erstellen einer Webseite beschrieben - mit Hilfe der zur Verfügung stehenden Bibliotheken eine Webseite mit den dort beschriebenen Teilen zu erstellen. Es wurde dazu bewusst darauf verzichtet, genau vorzugeben, wie dieses zu bewerkstelligen sein muss, da man sich sonst u.U. den Fall produziert, dass die Vorgehensweise aus Gründen des Designs des Frameworks nicht möglich ist und damit die daraus resultierende schlechte Bewertung als ungerechtfertigt angefochten wird. Ziel der Betrachtung war es also eine Webseite mit jedem Probanden zu implementieren, die aus Benutzersicht den Anforderungen, die aufgezeigt wurden entspricht. Das ist auch letztlich das, was den Kunden interessiert. Ich weiß, dass ich in der letzten Aussage die "non-functional requirements" wie beispielsweise Performance unterschlagen habe, diese sind aber in einem eigenen Abschnitt bewertet worden. Aus meiner Erfahrung heraus interessiert sich der Benutzer herzlich wenig für das interne Softwaredesign und ist - sofern voll funktionsfähig und performant - auch mit einer Bastellösung zufrieden.
Anders sieht das natürlich dann aus, wenn man eine Basis für viele Applikationen und Webauftritte zu verantworten hat und die Anforderung besteht, dass Modul A sowohl in Projekt 1 als auch in Projekt 2 integrierbar und lauffähig sein soll und die Daten möglichs Projekt- und Applikations-übergreifend und nutzbar sein müssen. Ist das der Fall muss natürlich auf das Design der Gesamt-Software sehr wohl Acht gegeben werden.

Kommen wir also auf deine konkreten Fragen zurück. Ich beantworte die Fragen erst mal ohne Beachtung deiner weiteren Ausführungen um dir ein Gefühl für die Idee der Betrachtungen zu geben.
(1) wie denn z.B. ein dynamisches Menü mit CakePHP standardmäßig umgesetzt werden kann

Als Möglichkeit wurden hier Layouts, Views und Elemente genannt. Nach CakePHP-Philosophie ist das Standard und gilt somit auch für den Test. Würde das anders zu bewerkstelligen sein, würde sich der Test an diesen Standard angepasst haben. Ziel war es definitiv nicht, an das Framework-Core Funktionen hinzufrickeln, nur um ein Verhalten zu generieren, das man von einem anderen Kandidaten kennt. Anpassungen sollten lediglich im "user space"-Bereich passieren dürfen.

(2) wie Templates (Layouts, Views und Elemente) mit diesem Framework generell verschachtelt werden und

Das Verschachtelungsthema habe ich im Bereich des zentralen Layouts mit einem

Code: Alles auswählen
<?php
  echo $this->renderElement('menu');
?>


gelöst, was meiner Meinung nach einem Standard-Vorgehen von CakePHP entspricht. Das Generieren eines dynamischen Menüs wäre an dieser Stelle ein Ausflug wert gewesen. Hier gilt jedoch das bereits oben gesagte.

(3) wie eine Einbindung und Verschachtelung dynamischer View-Bereiche prinzipiell mit CakePHP erfolgen kann, denn Komponenten stellen hier nicht das Prinzip dar.

Für diesen Hinweis aus der Praxis bin ich dankbar, verstehe aber noch nicht so recht, warum. Wenn ich ein Gästebuch implementiere, dann muss dieses mit ein und der selben Code-Basis - natürlich anpassbar durch Konfigurationen - in einem anderen Projekt 1:1 lauffähig sein. In diesem Zusammenhang sind mir die Komponenten von CakePHP in's Aufe gefallen. Sollte es hier andere Möglichkeiten geben, so bin ich gespannt welche...
Anforderung dabei wäre, dass ich - in CakePHP-Logik gesprochen - einfach ein

Code: Alles auswählen
<?php
  echo $this->renderModule('guestbook');
?>


in eine Datei, die unter /app/views/pages liegt einbaue und mein Modul beim Aufruf der entsprechenden URL funktioniert, ohne dass ich in einen Controller eingreifen oder andere implementierungstechnische Handstände vollführen muss.

Zu deinen Lösungen:
Nachdem ich die Ideen und die damit verbundenen Fragestellungen nun dargestellt habe, möchte ich noch etwas zu den Beispielen - die ich im Übrigen sehr gut finde - noch einige Worte los werden: mir gefällt nach oben gesagtem die Möglichkeit (3) b) mit Abstand am besten, da ich an dieser Stelle genau die Möglichkeit zur Abstraktion habe, die sich ein Programmierer wünscht. Die Frage, die sich mir stellt ist jedoch, wie ich die Dateien, die mir das Newsmodul generieren strukturiere. Sinnvollerweise lege ich mir doch dafür unter /app/views und unter /app/controller eigene Unterverzeichnisse an um zu kennzeichnen, dass die dort aufbewahrten Dateien zum Modul News gehören. Oder wird hier vom vendors-Thema Gebrauch gemacht und die Dateien, die zum News-Modul gehören dort abgelegt?


Vielleicht habe ich zum Thema CakePHP zu viel geschrieben, dies ist schließlich kein Cake-Forum. Aber wenn man nach Formulierungen sucht, dann stolpert man schreibend immer weiter, bis letztendlich drei Beiträge entstanden sind.

Nein, nein. Ich finde es sehr spannend die unterschiedlichen Konzepte zu diskutieren. Keinesfalls möchte ich hier Sitten einreissen lassen, die in anderen einschlägigen Foren Gang und Gäbe sind, nämlich Fremdprodukte ohne Sinn und Verstand vernichten oder schlecht reden zu wollen. Diese Art der Anfeindung ist mir an anderer Stelle (Zend Framework-Forum) wiederfahren, als ich während des Tests eine Diskussion eben über das Thema dynamische Inhalte, generische Strukturierung von Views u.s.w. führen wollte. Das wiederum wird hier nicht der Fall sein und vor Allem nicht werden, da es schließlich darum geht mit den geeigneten Mitteln die Wünsche der Kunden zu befriedigen.

Im Nachhinein betrachtet ist aber der letzte Beitrag der wichtigste, denn hier geht es um die (wenn ich richtig verstanden habe) von Euch völlig zu Recht aufgeworfene Kernfrage:
Mit welchen Konzepten und Methoden unterstützt mich ein Framework bei der Umsetzung von komplexen, modernen Website-Layouts (mit oder ohne Ajax)?

Richtig, das unterschreibe ich mit. Webseiten leben von der Präsentationsschicht und einem ganzheitlichen Konzept eines Frameworks, wie ich diese generieren kann.

Wenn Du schreibst, dass "Alex und ich blutige Anfänger in Sachen CakePHP sind" (was mit Sicherheit übertrieben ist), dann ändert das aber nichts an meinem ehrlichen Respekt vor Eurer Arbeit: dem Aufbau eines eigenen Frameworks (!) und dem Anzetteln von notwendigen Diskussionen in der Community - neben der täglichen Erwerbsarbeit.

Danke für die herzlichen Worte! Es freut mich, dass es so ehrliche und offene Leute in der Szene gibt, die sich offen über ein Thema austauschen und eine sachliche Diskussion führen. Merci beaucoup!
Alex und ich sind sicher Anfänger im Bereich von CakePHP, haben jedoch fundiertes Wissen, was Software-Design im Allgemeinen und in Bezug auf das Design eines Frameworks angeht. Ich behaupte an dieser Stelle auch mal, dass ein Anfänger sicher nicht im Stande ist einen Vergleich zu ziehen, da er weder mehrere Alternativen noch allgemeine Software-Design-Richtlinien und OO-Konzepte kennt und versteht. Bei CodeIgniter oder dem Zend Framework würde ich das mit dem Anfänger aber auch wieder behaupten. ;-) BTW: Warum bist du von CodeIgniter abgekommen?
Viele Grüße,
Christian
Benutzeravatar
dr.e.
Administrator
 
Beiträge: 1431
Registriert: 04.11.2007, 16:13:53

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon nosch » 05.01.2008, 14:33:07

Hallo Christian,

ich werde noch kurz etwas zum Thema CakePHP hinzufügen.

Mit dem Satz,
[...] wie eine Einbindung und Verschachtelung dynamischer View-Bereiche prinzipiell mit CakePHP erfolgen kann, denn Komponenten stellen hier nicht das Prinzip dar [...]

wollte ich nicht ausdrücken, dass Komponenten in CakePHP keine Methode der Auslagerung und Kapselung von Businesslogik darstellen. Wie Du völlig richtig dargestellt hast sind Komponenten genau dafür zuständig, auch in CakePHP. Und ein einigermaßen komplexes Menü ist natürlich in einer Komponente bestens aufgehoben. (Eine andere Möglichkeit der Auslagerung bieten Plugins und über vendors() lassen sich Lösungen von Drittanbietern integrieren.)

Hier wollte ich einfach nur sagen, dass ich an dieser Stelle der Darstellung (es ging um das Problem der tief verschachtelten dynamischen Templates) nicht in erster Linie Komponenten angesprochen, sondern die Methode requestAction() vorgestellt hätte.

Insgesamt wäre ich anders an die Vorstellung von CakePHP herangegangen, auch das wollte ich transportieren:
Auf den ersten Blick ist in CakePHP alles recht starr. Ein Controller, ein Model, ein View und alle müssen irgendwie ähnlich benannt sein, sonst funktioniert gar nichts. Der zweite Blick offenbart einem aber bereits die Tatsache, dass diese Starrheit ein Grundkonzept von CakePHP ist und besser mit "Conventions over Configurations" bezeichnet ist. Die, wie ich finde, konsequente Umsetzung diese Konzeptes ist die Grundlage dafür, dass ich mich nur an Namenskonventionen halten muss um eine gewisse Frameworkautomatik in Gang zu setzen. Und schließlich, auf den dritten Blick, zeigen sich dann Möglichkeiten diese Automatik flexibel zu gestalten: mit dem Routing die URLs formen, applikationsweite Logik mit dem AppController implementieren, per $uses Models flexibel einbinden, durch beforeFilter(), afterFilter() und beforeRender() Actions kontrollieren und mit requestAction() Controller-Actions an jeder Stelle der Applikation aufrufen. Und das sind nur die Basics von CakePHP.

Ein GUI-Objekt in Deinem Sinne wird man in CakePHP nicht finden. Und nach Deinen sehr kenntnisreichen Ausführungen dazu bin ich zumindest ins Nachdenken gekommen, wie groß denn die Nachteile sind, die sich daraus ergeben. Schließlich hast Du ganz einfach recht, wenn Du betonst:
Webseiten leben von der Präsentationsschicht

Klingt nach einer Binsenweisheit, ist aber ein Grundsatz.
Auch die Beta-Version von CakePHP, die Version 1.2, hat eine solche Art der Erweiterung der View-Schicht nicht zu bieten. Allerdings lohnt es sich bereits jetzt die Beta-Version zu verwenden (ich tue es schon seit diesem Sommer). Sie enthält viel zu viele Verbesserungen und Erweiterungen auf die man nicht verzichten sollte.

So viel zum Thema CakePHP von mir.

Schöne Grüße,
Norbert
nosch
 
Beiträge: 6
Registriert: 30.12.2007, 14:33:43
Wohnort: Berlin

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon nosch » 05.01.2008, 16:31:59

Hallo Christian,

jetzt möchte ich noch etwas zu unserer Diskussion sagen.

Wie schön, dass Du so ausführlich geantwortest hast. Dadurch ist mir nicht nur der Ansatz den Du mit dem Adventure-PHP-Framework verfolgst um einiges klarer und sympatischer geworden, sondern ich habe die Diskussion mit Dir auch dazu genutzt mich erneut intensiv und (so gut ich konnte) kritisch mit CakePHP auseinanderzusetzen.
Außerdem konnten doch ein paar Hinweise zur Praxis mit CakePHP eingebracht werden.

Demnächst möchte ich das Adventure-Framework genauer unter die Lupe nehmen und werde Dich dann in dieser Angelegenheit erneut belästigen - dann wird es sich aber eher um Supportanfragen handeln.

Das Du meine Art der Auseinandersetzung lobst, das freut mich natürlich. Ich halte es aber für selbstverständlich.
Die Diskussion im ZendFramwork-Forum, die von Dir (und Alex?) angestoßen wurde, habe ich nun auch entdeckt und alle Beiträge gelesen (http://www.zfforum.de/showthread.php?t=359). Mein lieber Scholli, ein paar der Zend-Jungs haben sich ja Euch gegenüber recht rüpelhaft benommen. Trotzdem lassen sich doch noch aus einigen Beiträgen interessante Informationen herausziehen (darunter Beiträge von Dir, phpdummy und Vik).

Übrigens, mit CodeIgniter habe ich noch gar nichts zu tun gehabt. Das ZendFramework habe ich gleich zu seiner Veröffentlichung und dann noch einmal zum Jahresende 2006 getestet. Das Ganze erfolgte im Rahmen meiner Arbeit für eine Berliner Media-Agentur. Ich wollte endlich wieder mit einem ordentlichen Framework arbeiten und darum habe ich die (für mich) bekanntesten Frameworks angeschaut: ZF, Symfony und CakePHP. Das ZF steckte zu der Zeit noch zu sehr in den Anfängen und machte auf mich eher den Eindruck eines neuen Class-Repository. Warum ich nicht Symfonie gewählt habe kann ich gar nicht genau sagen. Und CakePHP hat mich dann sofort überzeugt, denn ich konnte damit unmittelbar loslegen.

Ansonsten musste und wollte ich viel mit Typo3 arbeiten, vor allem im Zusammenhang mit dem CSS-Framework YAML (http://www.yaml.de/ und http://yaml.t3net.de/YAML-fuer-TYPO3.105.0.html). Kann ich sehr empfehlen. Hoch interessant finde ich auch das CMS Drupal. Hierfür gibt es übrigens eine CakePHP-Schnittstelle mit Namen Drake (http://dev.sypad.com/projects/drake/) die ich aber noch nicht getestet habe.

Bis bald und schönes Wochenende,
Norbert
nosch
 
Beiträge: 6
Registriert: 30.12.2007, 14:33:43
Wohnort: Berlin

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon dr.e. » 06.01.2008, 23:02:23

Hallo Norbert,

schön, dass die Diskussion auch für dich interessante Dinge beinhaltet hat. Um der Verwirrung ein wenig entgegen zu wirken sollte ich vielleicht verraten, dass Alex = phpdummi. Vik zählte im Zend Forum zu den Leuten, die über die gesagten Dinge ein wenig mehr nachdenken und konstruktiv zur Diskussion beitgetragen haben.

Demnächst möchte ich das Adventure-Framework genauer unter die Lupe nehmen und werde Dich dann in dieser Angelegenheit erneut belästigen - dann wird es sich aber eher um Supportanfragen handeln.

Gerne. Sollten architektonische Themen noch unklar, oder in den Tutorials nicht ausreichend beschrieben sein, dann bitte melden!

Was meine Arbeit angeht, so habe ich mir vor einiger Zeit - müsste vor 1,5 Jahren gewesen sein - auch Symphony angesehen und dieses als Basis für die Entwicklung versucht zu evaluieren. Aber auch dort sind die Gedanken, die ich zum Thema GUI-Objektmodell hatte nicht zu meiner Befriedigung umgesetzt gewesen. Das - und einige andere Gründe - waren der Antrieb die Ideen selbst umzusetzen. Hier hatte ich sehr interessante Gespräche mit Entwicklern, die ähnliche Problemstellungen zu bewältigen hatten.
Über YAML bin ich gerade mit Alex im Gespräch. Er hat vorgeschlagen, das neue Design auf dem YAML-CSS-Framework aufzusetzen um einen Standard hinsichtlich Formatierungen zu verwenden. NAch ersten Überlegungen sollte das auch sehr einfach integrierbar sein. Hier bin ich gespannt, wie sich das in die Praxis umsetzen lässt. Hierzu wird es aber einen Erfahrungsbericht geben, den ich beim Relaunch entsprechend auf der Seite veröffentliche. Themen wie TYPO3 oder Mambo habe ich nur am Rande gestreift, da ich sehr früh eine eigene kleine CMS-Lösung entwickelt habe, die komplett auf das Framework aufsetzt. Hier wird bei Aufruf der Seite ein eigenes DOM - basierend auf dem DOM des Frameworks - aufgebaut und die Seite entsprechend mit Inhalten gefüllt. Die Lösung ist jedoch schon einige Jahre alt, so dass das Design nicht mehr den aktuellen Vorstellungen entspricht.
Interessant war eine Integration von APF-Templates in Wordpress. Hier habe ich in Wordpress-Templates Module, die auf dem APF basieren eingebunden, da die Möglichkeiten in Wordpress nur begrenzt sind.

Ich wünsche dir viel Spass bei der Evaluierung!
Viele Grüße,
Christian
Benutzeravatar
dr.e.
Administrator
 
Beiträge: 1431
Registriert: 04.11.2007, 16:13:53

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon phpdummi » 01.02.2008, 23:12:19

Hallo Norbert,

herzlichen Dank für deine verständlichen, konstruktiven Beiträge!
Ich habe schon bei den ersten Zeilen richtig gute Laune bekommen.
Schade, dass ich erst jetzt Zeit gefunden habe die Beiträge zu lesen.
Ich kann momentan leider auch nicht im Detail darauf eingehen, werde
dies aber bestimmt noch nachholen.

Sehr interessant finde ich den Umstand, dass ich deine Beispiele genauso
umzusetzen wollte - irgendwo hackte es dann aber immer.
Da diese nun aber voll funktionsfähig sind, sollten wir das auf jeden
Fall im Artikel überarbeiten. Allerdings werden wir dann natürlich trotzdem
auf die hier besprochenen "Nachteile" eingehen. Ich erinnere mich zum
Beispiel gelesen zu haben, dass die Performance bei mehreren requestActions
schnell in den Keller geht. Kannst du das aus der Praxis bestätigen?

Zum Thema "blutige Anfänger" wollte ich nur noch anmerken, dass Christian
und ich teilweise Stunden damit zugebracht haben, die routes.php anzupassen
bzw. eine allgemeine Lösung für unser "Problem" bei der Umsetzung
modularer Präsentationsobjekte für die View-Schicht zu implementieren.
Von daher nochmal ein herzliches Dankeschön an dieser Stelle. :D

Mit dem von Christian bereits angesprochen Relaunch der Projektseite werden
übrigens auch ein paar Erfahrungsberichte folgen.

Btw: Wie bist du auf den Artikel gestoßen?
Unter folgendem Link ging es übrigens auch noch einmal ordentlich zur Sache:
http://www.zfforum.de/showthread.php?t=952

Gruß,
Alex

PS: Hübscher Blog, etwas mehr Inhalt wäre schön. :)
phpdummi
 
Beiträge: 18
Registriert: 23.11.2007, 16:15:15

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon fliegermichl » 02.04.2008, 13:40:38

Hallo zusammen,

als ich auf der Suche nach dem für mich geeigneten Framework war, gab es für mich ein Kriterium ultimo

"Kann ich mit dem Framework ein Modul schreiben, so dass es auf einem Server laufen kann, der nichts von meinem Modul weiss und von dem ich auch nicht weiss, welche anderen Applikationen dort laufen"
und zwar nur durch ein einbinden durch ein Tag an geeigneter Stelle.

Zusätzlich sollte dann natürlich mein Modul funltionieren und die andere Anwendung auch. Die einzige Annahme ist natürlich das Vorhandensein des Frameworks auf dem entsprechenden Server.

Das Adventure PHP Framework ist z.Zt meiner Einschätzung nach das einzige, für dass die Antwort ja lautet.
Cake PHP kenne ich nicht und für das Zend Framework ist die Antwort leider Nein.

Viele Grüße
Michl
Benutzeravatar
fliegermichl
 
Beiträge: 114
Registriert: 29.01.2008, 11:51:45
Wohnort: Echzell

Re: CakePHP im Test bei Adventure-PHP-Framework

Beitragvon phpdummi » 12.08.2008, 15:05:15

Da hast du vollkommen Recht :D
phpdummi
 
Beiträge: 18
Registriert: 23.11.2007, 16:15:15


Zurück zu Entwicklung

Wer ist online?

Mitglieder in diesem Forum: MrNiceGuy und 1 Gast