PHP Sammelthread: Zend Framework und alles was dazugehört

Wieder mal ne Frage, obwohl ich mich grad frage, ob das ein Bug des ZF ist :think:

Ich hab in meiner Bootstrap-Klasse eine Funktion "_initTranslator". Diese erzeugt einen Translator aus einer .ini-Datei und registriert ihn in der Registry als "Zend_Translator".
Zusätzlich wird noch ein $validatorTranslator erzeugt, und wird mittels
PHP:
Zend_Validate_Abstract::setDefaultTranslator($validatorTranslator );
als default Translator eingefügt.

Mein Problem ist nun, dass die Validator-Fehler immer aus der .ini-Datei geholt werden (bzw. wird das versucht). Nach einiger Zeit des Debuggens bin ich draufgekommen, dass in der Zend_Translate_Abstract die .ini-Datei als Translator eingefügt wird.

Wenn ich die Zeile, in der die .ini-Datei in die Registry eingefügt wird rausnehme, kommen wieder die benutzerdefinierten Nachrichten aus dem Validator.

Jetzt frage ich mich, ob das gewollt ist, dass der Registry-Translator bevorzugt wird. Ich will/wollte das nämlich vermeiden, dass ich nun in die .ini-Datei die Konstanten als String eintrage:roll:
 
Jetzt frage ich mich, ob das gewollt ist, dass der Registry-Translator bevorzugt wird. Ich will/wollte das nämlich vermeiden, dass ich nun in die .ini-Datei die Konstanten als String eintrage:roll:

Ja dem Registry-Translator eine höhere Wichtigkeit zu geben war eine Verbesserung in 1.5 oder 1.6, wenn ich mich recht entsinne.
Das Problem war einfach, das man zig Komponenten den Translator übergeben konnte und das einfach umständlich war.
So soll man nur noch einen Translator registrieren und jede Komponente die i18n nutzen kann/möchte, holt sich einfach den global registrierten Translator.

Warum definierst du nicht einfach alle Übersetzungen in dem globalen Übersetzer?
 
Das Problem ist ja, sollte Zend irgendwann einmal die Konstanten ändern, funktioniert die Übersetzung nicht mehr (wenn man es PHP-Extern macht ini, usw. per Array ginge es ja):think:

ich weiß nicht wie du es anders machen willst, aber die Bezeichner der Fehler "isEmpty" zu verwenden, ist die einzige empfohlene Möglichkeit von Zend.
Es gibt noch aus BC-Gründen die Möglichkeit, die Original-Message als Key zu verwenden, aber das wird irgendwann abgeschafft werden.

Und selbst WENN sie die Bezeichner ändern würden, dafür kann man doch Zend_Translate nen Zen_Log Object übergeben das Bericht erstattet wenn Übersetzungen fehlen.
 
So ich bins nochmal,

ich habe da ein kleines Problem an dem ich einfach nicht weiterkomme.

ich möchte ein Admin Modul erstellen. Hier mal meine ordnerstruktur:

Code:
application/
    default/
       controllers/
       ...
    admin/
       controllers/
       views/
           scripts/
              index/
                 index.phtml
       ...

In der Index mache ich folgendes:
PHP:
$front->setControllerDirectory(array(
                                    'default' => 'application/default/controllers',
                                    'admin' => 'application/admin/controllers'
                                    ));


$router = $front->getRouter();
$router->addRoute('admin',new Zend_Controller_Router_Route('admin/:controller/:action/*'));

im Admin Controller Ordner habe ich den index Controller Admin_IndexController.php genannt.

wenn ich nun meineurl.de/admin aufrufe bekomme ich folgenden Error:

Code:
[B]Fatal error[/B]: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in /www/htdocs/../library/Zend/Controller/Dispatcher/Standard.php:241 Stack trace: #0 /www/htdocs/../library/Zend/Controller/Front.php(936): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /www/htdocs/w00a3eff/index.php(36): Zend_Controller_Front->dispatch() #2 {main} thrown in [B]/../../../library/Zend/Controller/Dispatcher/Standard.php[/B] on line [B]241[/B]

jmd eine idee?
 
Also ich habe meinen 'default' Controller ganz normal in /application/ liegen, bzw. dort in den verschiedenen Verzeichnissen wie z.B. controller/.
Dann habe ich einen Ordner /application/modules/admin/ mit den ganzen Verzeichnissen für das Admin-Modul und geladen wird dieses wie folgt:
PHP:
<?php
// Add module directory
$frontController->addModuleDirectory(
    APPLICATION_PATH . '/application/modules'
);
?>

Ich denke, dass es auch so gemacht werden sollte - wenn es schon die addModuleDirectory() Methode gibt ;)
 
Hey danke für deine Antwort,

generell werden in der Doku ja diese beiden Methoden beschrieben und ich fand diese für meine Zwecke übersichtlicher.

Mein Fehler war eigendlich eher banaler Natur. In der Doku stand etwas von Präfixen für die Modulorder. Desswegen dachte ich im Admin modul muss die Controller "Admin_Controllername.php" heißen, was jedoch ein Irrtum war.

Der Dateiname bleibt normal, jedoch in der Datei wird anstatt:
PHP:
class IndexController extends Zend_Controller_Action
das geschrieben:
PHP:
class Admin_IndexController extends Zend_Controller_Action

Naja wieder Zeit für sowas blödes verplämpert ;)
 
Ich denke, dass es auch so gemacht werden sollte - wenn es schon die addModuleDirectory() Methode gibt ;)
mache ich auch so, und damit ist die Ordnerstruktur wieder besser da im application-Ordner nicht alle Module direkt liegen sondern im modules-Ordner.

Der Dateiname bleibt normal, jedoch in der Datei wird anstatt:
PHP:
class IndexController extends Zend_Controller_Action
das geschrieben:
PHP:
class Admin_IndexController extends Zend_Controller_Action

jup das ist wegen dem Benennungsschema ;)
Wenn du im Klassennamen die Unterstriche zu Slashes machst und hinten ein ".php" anhängst solltest du direkt den Pfad wissen, wo die Datei liegt ;)
Das ist nicht so mit dem Default-Modul, in allen anderen Modulen aber schon (finde ich irgendwie inkonsequent), deshalb habe ich die Option aktiviert das auch die Controller im Default-Modul ge-prefix-t werden müssen:
PHP:
$front = Zend_Controller_Front::getInstance();
$front->setParam('prefixDefaultModule', true);
 
So ich muss schon wieder nerven, aber steig da grade absolut nich durch ;)

Ich möchte für einen Adminbereich einen Login erstellen. Demnach muss ich später in anderen controllern prfüfen ob der user eingeloggt ist.

Dazu möchte ich eine Globale funktion verwenden, damit ich diese nicht in jedem controller anlegen muss.

Das einzige was mir da eingefallen ist sind die helper. Mit denen hatte ich bis jetzt noch garnix zu tun, und hab keine Ahnung wo ich diese z.b anlegen soll.

In der Doku steht bei den Action Helpern nichts dazu. Hat jmd vllt einen Link oder einen Tip für mich? :)
 
Ich möchte für einen Adminbereich einen Login erstellen. Demnach muss ich später in anderen controllern prfüfen ob der user eingeloggt ist.

Ich würde ja Zend_Auth verwenden, das bietet dir die Methode hasIdentity, damit erkennst du das;)

Du nervst außerdem nicht, sondern belebst den Thread8) Ich les ja immer gern was übers ZF:mrgreen:
 
Ich vergess/überseh/check garantiert noch andere Sachen nicht.
Bekommst also keine Langeweile :ugly:
 
Ich möchte meine Anwendung sehr stark modulisieren.
Habe mir nun überlegt für sehr viele einzelne Dinge (z.B. einer Nickpage) Module zu erstellen und alle "Hauptsachen" (z.B. Login, Anmeldung) sind im Default-Modul.
Nun möchte ich das Administrationspanel auch in ein eigenes Modul packen... Mein Nickpagemodul bietet aber natürlich auch neue Einstellungsmöglichkeiten im Administrationspanel.
Gibt es so eine Art "Submodul"? Also z.B.: application/modules/admin/modules/nickpage als Ordner für den Menüpunkt "Nickpage" im Administrationspanel?

Und wie bekomme ich am besten allgemeine Informationen über ein Modul. Ich habe mir überlegt, jedem Modul eine "ModuleInformation" Klassen zu geben, welche wichtige Informationen liefert. Wie z.B. Abhängigkeiten um es später leichter überprüfen zu können.


Dann noch so als Grundfrage: Gibt es vom MVC Konzept oder ähnlichem irgendwelche Sachen, die grundsätzlich gegen so eine Aufteilung von mir sprechen?
Oder bereits ein eigenes Konzept für so eine Aufteilung?
 
So ich muss schon wieder nerven, aber steig da grade absolut nich durch ;)
tust du nicht, dafür haben wir den thread doch begonnen.
Denn der Einstieg ins Zf ist schon seeehr schwer (persönliche Meinung) aber jede Minute wert.

Ich würde ja Zend_Auth verwenden, das bietet dir die Methode hasIdentity, damit erkennst du das;)
richtig und dann über einen Controller-Plugin im preDispatch die Identity prüfen (möglicherweise auch noch ACL?) und wenn der User nicht die Rechte hat einfach im Request-Objekt einfach Modul/Controller/Action ändern, damit der User zur Loginmaske kommt.
So hat man zentral an einer Stelle den Check, die Plugins sind ne supi Sache :!:

Ich möchte meine Anwendung sehr stark modulisieren.
Habe mir nun überlegt für sehr viele einzelne Dinge (z.B. einer Nickpage) Module zu erstellen und alle "Hauptsachen" (z.B. Login, Anmeldung) sind im Default-Modul.
Wofür benötigt denn die Nickpage ein eigenes Modul?
Man konfiguriert diese doch nur (configAction), schaut sie sich an (viewAction) usw, also ganz klar ein Controller ;)

Wenn du es modularisieren willst, ein Controller ist ja auch schon Modularität ;) Wenn man den Controller hinzufügt, hat die Anwendung weitere Funktionen, wenn man ihn wegnimmt, gibts diese nicht mehr. Auf Zf-Modul-Basis das zu machen ist denke ich der falsche Weg, bzw. du müsstest zuviel anpassen.

Gibt es so eine Art "Submodul"? Also z.B.: application/modules/admin/modules/nickpage als Ordner für den Menüpunkt "Nickpage" im Administrationspanel?
wie gesagt, kein guter Ansatz. Aber schau dir mal den Router an, damit kannst du Url-Strukturen wie du willst auf deine Controller mappen.

Und wie bekomme ich am besten allgemeine Informationen über ein Modul. Ich habe mir überlegt, jedem Modul eine "ModuleInformation" Klassen zu geben, welche wichtige Informationen liefert. Wie z.B. Abhängigkeiten um es später leichter überprüfen zu können.
wie wäre es mit XML-Files?
Sind menschenlesbar, leicht auswertbar und mit Zend_Config und Zend_Config_Writer kannst du sie auch einfach auslesen und schreiben (nach dem Motto eine XML-Datei speichert, welche Module aktiv sind)

Dann noch so als Grundfrage: Gibt es vom MVC Konzept oder ähnlichem irgendwelche Sachen, die grundsätzlich gegen so eine Aufteilung von mir sprechen?
Oder bereits ein eigenes Konzept für so eine Aufteilung?
Gründe dagegen schon oben mehrmals aufgezählt :biggrin:
Ansätze für solche Plugin-Architekturen gibt es nicht, denn sie sind wohl eher der Ausnahmefall der Entwicklung. Ein Controller den man hinzufügen/entfernen kann wird für die meisten Anwendung wahrscheinlich schon genug Plugin-Konzept sein.
 
Danke für deine ausführliche Antwort!

Jedes mal ein komplett neues Modul zu erstellen wäre denke ich für eine einfache Nickpage schon ein wenig viel, das stimmt schon.
Aber ich habe nun mal an einer sehr modulbasierende Anwendung gedacht und dann direkt auch an Module im ZF.
Mit den Controllern sollte das aber eigentlich auch lösbar sein denke ich... Aber ich würde dann denke ich schon zwischen Controller & Admincontroller unterscheiden. Also meine Nickpage bekommt im Adminpanel wieder einen neuen Controller - so ist das ein wenig strenger unterteilt.
Also ein komplexes ACL System habe ich mir auch schon zusammengebastelt (Verwaltung über Tabellen in der DB um es später leicht ändern zu können).
Für Informationen zu den einzelnen Controllern (wie bereits genannt z.B. Abhängigkeiten) könnte man dann einen neuen Ordner application/informations/ erstellen mit passenden XML Dateien zu den einzelnen Controllern?
Passend dazu noch eine Klasse welche diese XML Dateien auswertet und weitere Methoden dazu noch anbietet?