Zend Framework 2 Modul-Freigabe von Variablen zwischen Controller onBootstrap
Ist es möglich, Variablen erstellen oder sogar gemeinsam genutzte Objekte (wie DB-adapter) bei, in Module.php für den Einsatz in allen view-Controller? (Zend Framework 2)
Beispiel:
class Module
{
public function onBootstrap(MvcEvent $e)
{
$moduleConfig = $e->getServiceManager()->get('Config')
}
}
Und in einem controller, irgendwie Zugang über:
$this->moduleConfig['db']
Im oben ich weiß, dass wäre nur das config array für den db-adapter, aber wie würde das überhaupt funktionieren?
Sehe ich, dass man das machen kann in einer controller-action:
$config = $this->getServiceLocator()->get('Config')
$dba = new DbAdapter($config['db']);
Ich will nicht, dass jeder Ort muss ich meine config. Wie könnte ich es machen, so etwas wie: $this->config ?? So verfügbar sein, um alle Aktionen. Noch besser, wie zu tun, dass in das gesamte Modul? Ich weiß, ich werde über diese alle falsch, aber in ZF1 wir hatten Zend_Registry::get() für einfache Dinge wie diese. Ich lese über die Dokumentationen und alle Arten von tuts gibt, aber immer gibt es einige Annahmen gemacht werden und ich einfach verloren gehen. Also alles, was ich wirklich will ist :
A) Eine Global zugängliche config-Element,
B) zu Einer weltweit erreichbaren db-adapter
Ich möchte nur dazu aufrufen $this->db oder $this->Einstellungen->Eintrag in meinem Controller. Ist das möglich? Ich weiß, ich bin etwas fehlt, ganz einfach.
Ich habe auch versucht die Einstellung $this->config in meine __ - Konstrukt mit $this->getServiceLocator()->get('Config'); Aber ich verstehe, dass der service locator ist noch nicht verfügbar während konstruieren. Ich habe versucht zu tun, ähnlich wie durch die Einrichtung einer preDispatch in der onBootstrap von dem Modul, aber ich kann nicht scheinen, um diese Elemente in meinem Controller.
FYI, ich habe das in meiner global.php (und Nein, es ist nicht dort zu bleiben, nur Beispiel):
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mydb;host=localhost;',
'username' => 'root',
'password' => '',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
Ich bin in der Lage für den Zugriff auf diese und andere Elemente in jeder Aktion mit getServiceLocator(). Ich möchte diese Elemente als meine controller Eigenschaften in $this->Einstellungen->posten.
Ich freue mich über jede Anleitung! Danke!
Ja, ich war nur herauszufinden, dass Letzte Nacht. Habe die db-adapter und config-Global freigegeben plus eine predispatch-Methode setup auf den Controller hinzufügen, um eine db-Eigenschaft des Objekts, die Art von schön, das muss ich zugeben. Es ist nur so verwirrend auf den ersten und Werke, so Verschieden von Zf1. Ich poste meine Lösung später. Eine Frage hätte ich noch. Was über das hinzufügen von globalen Variablen im service manager? Wäre das ein aufrufbarer mit nur einem Wert wie ein string oder boolean oder int? Ich werde es versuchen.
ZF2 ist ZF1 wie ZF1, Symfony oder der Rahmen Ihrer Wahl. Nur einen anderen Rahmen völlig. Ich bin mir nicht sicher, was Sie tun möchten mit globalen Variablen. Entweder etwas ist von der config, session Verwandte oder sollte nicht eine Globale, vielleicht?
Ja, genau. Ganz neues Biest! So bin ich tippte meine Antwort, hoffentlich hilft das auch anderen. Ich habe einige apps, die erfordern, dass Sie manuell aktivieren von Funktionen. Ich hatte Sie in der ini-Dateien, aber jetzt sehe ich, wie die config/autoload-Verzeichnis und gibt ein array zurück anstatt. Wusste nur nicht, wie der Zugriff im Controller, bis jetzt eben! Hilft, eine predispatch-setup. Ich zeige in meiner Antwort. Vielen Dank für die Hilfe und Ratschläge.
Übrigens, geht es nur mir so, oder haben die ZF-docs/tuts scheinen immer weglassen, etwas gebraucht um den Sinn dahinter? Ich fühle mich wie es ' s Annahmen an einigen stellen (und Sie nicht sagen, was Sie sind!) oder Sie zeigen Ihnen, was Sie tun, in einem Ort, aber nicht, wie es bezieht sich auf eine app-weit. aber... vielleicht ist es nur mich. 🙂
InformationsquelleAutor gregthegeek | 2013-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay... mehrteilige Antwort.
1. Hinzufügen von config-Variablen , site-wide. (und wie der Zugriff im Controller)
Dies war einfach, sobald ich sah, es funktioniert. Sondern hängt von der preDispatch unten.
In Ihrem app root, drop eine Datei in config/autoload. Nennen Sie es:
things.config.local.php
In dieser Datei, die wir einfach nur wieder ein array mit config posten.
Also ich will in meinem controller. Angenommen, Sie erstellen eine config-Eigenschaft in den controller, Sie können es auf diese Weise. (Sie setup, dass das Eigentum von preDispatch unten, damit es funktioniert) In meinem system würde ich bevorzugen, die zum abrufen der Wert etwa so:
Allerdings konnte man nur rufen ihn in eine Aktion wie diese:
Das war ganz einfach eigentlich. Nicht sicher, wie man das mit einer ini-Datei, aber in meinem Fall nicht benötigt und meine ini-Dateien, die nicht nicht eine große Sache, in zu bewegen-arrays, direkt. Problem 1 gelöst für mich!
2. Wie man preDispatch Controller (da __construct wont load config)
Mein anderes problem war, dass ich erhalten Sie Zugriff auf einige Objekte und/oder Werte auf globaler Ebene UND haben Sie zu laden wenn die controller und Aktionen initialisiert werden. Wie ich es verstehe, es ist nicht möglich, den Zugriff auf die service manager-config in der __Konstruktion von controller.
Oben wird nicht funktionieren. Ich glaube, weil Dienste-Verwalter ist noch nicht verfügbar beim konstruieren der controller-Klasse. macht Sinn.
Ein paar zusätzliche Schritte, obwohl, und ich kann preDispatch arbeiten, ähnlich ZF1. DANN die config funktioniert. Sowie der Zugang zu globalen Objekten, wie Datenbank.
In der Steuerung fügen Sie die folgenden Verfahren:
Dann fügen Sie pre-und post-Methoden.
Problem 2 gelöst! Init für Controller.
3. Wie die oben mit Dienste-Verwalter das laden eines DB-Objekt für den Einsatz in Controller
Okay, das Letzte, was ich wollte, war der Zugriff auf meine db Global. Und ich wollte es controller-breit, so dass ich nennen kann $this->db->fetchAll überall.
Ersten setup von service manager in global.php.
Auch im Auge behalten, ich werde nicht verlassen, es ist genau so, wie es in meiner global.php Datei. Aber es funktioniert jetzt.
Fügen Sie diese array ' s zu den Rückgabe-array in global.php:
In der oben, richte ich die db-config, dann service_manager hat einige Fabriken, die zur Verfügung gestellt werden, wenn erforderlich, im rest der app. In meinem Fall wollte ich etwas Komfort für die rückwärts-Kompatibilität mit einigen meiner alten ZF1-code, also habe ich ein custom-Modul namens FBDb. Ich fand einen fantastischen wrapper/Brücke-zu-zf1-Stil-db-Klasse genannt, ZFBridge von Fabrizio Balliano. Hat Super funktioniert für meine Bedürfnisse, die Sie hier finden können:
https://github.com/fballiano/zfbridge
Ich fand, dass, Sie ein bisschen verändert, und aus einem Modul. Also die FBDb-Objekt ist verfügbar in meinem Controller meine Datenbank-Verbindung. Dasselbe mit "db-adapter" wenn ich wollte, es zu nutzen anderswo.
Eh, in mein controller, ich setup "protected $db;" am Anfang der Klasse, so habe ich diese Eigenschaft zur Verfügung. Dann, wie gezeigt, in der #2 oben , ich habe preDispatch Zuordnung der FBDb Datenbank-Objekt $this->db.
Dann in meine action-Methoden, wenn ich will, kann ich rufen Sie einen Datensatz oder db-Wert mit diesem:
ODER für ein array zurückgegeben:
(Ich fügte hinzu, fetchResults zu ZFBridge wieder nur die PDO\Ergebnisse Objekt form der db-Abfrage für die Verwendung in der foreach-später.)
Ich weiß, dass einige dieser ist prbably schlechtes design oder schlechte OOP", aber es funktioniert für mich, und ich mag es. Ich persönlich glaube nicht, lke mit reinen Objekt-basierte Daten-Entitäten für alles, nur einige Dinge. Viel der Zeit, ich will nur drop eine Ergebnismenge, die in und mit ihm getan werden. 🙂
Probleme gelöst. Für jetzt. Macht ZF2 viel freundlicher nun, wenn Sie verwendet werden, zu ZF1.
Das sieht aus wie ein namespace problem, sollten Sie
use Zend\Mvc\MvcEvent
zum importieren der Klasse. Allerdings, wenn Sie mit preDispatch Zugriff auf die Konfiguration nach der OP ist es, die Praxis wird empfohlen, einen Domänencontroller zu erstellen Fabrik zu ziehen, was Sie von der service-manager und injizieren es in den Konstruktor.InformationsquelleAutor gregthegeek