App-in-Klasse in einem Schlanken Framework 3
Ich habe Schwierigkeiten zu verstehen, wie Zugriff auf die Instanz von Slim, wenn Sie eine route in einer anderen Klasse, als index.php
Wenn mit Slim-Rahmen 2 früher habe ich immer nur die folgende, aber seinen nicht das arbeiten in Slim 3:
$this->app = \Slim\Slim::getInstance();
Ich versuche, um Zugriff auf eine Datenbank-Verbindung habe ich das setup in den container, sondern von einer eigenen Klasse. Dies ist, was ich derzeit habe in meinem index.php zu initiieren, eine Schlanke app:
require_once("rdb/rdb.php");
$conn = r\connect('localhost');
$container = new \Slim\Container;
$container['rdb'] = function ($c){return $conn;}
$app = new \Slim\App($container);
Und hier ist meine route:
$app->get('/test','\mycontroller:test');
Und das ist, was ich bekam in meiner mycontroller.php Klasse, die meine route Punkte zu, die offensichtlich nicht so funktioniert, wie $this->app existiert nicht:
class mycontroller{
public function test($request,$response){
$this->app->getContainer()->get('rdb');
}
Die Fehlermeldung ist folgende, aufgrund getinstance nicht als Teil des Slim 3 im Vergleich zu Slim 2:
Call to undefined method Slim\App::getInstance()
Dankbar für jede Hilfe,
Grüße
Dan
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf die Slim 3 Skelett erstellt von Rob Allen.
Slim 3 stark nutzt dependency injection, so möchten Sie vielleicht, um es benutzen zu.
In Ihrem
dependencies.php
fügen Sie so etwas wie:Und in Ihrem
Your\Custom\Class.php
:Ich hoffe das hilft, wenn du noch weitere Fragen fühlen Sie sich frei, zu Fragen.
Update:
Wenn du definieren Sie Ihre route, so wie dies
Slim sieht bis
\mycontroller:test
im container:So, wenn Sie öffnen
www.example.com/test
in Ihrem browser, Schlank, erzeugt automatisch eine neue Instanz von\mycontroller
und führt die Methodetest
mit den Argumenten$request
,$response
und$args
.Und da akzeptieren Sie die Datenbankverbindung als argument für den Konstruktor von Ihrer
mycontroller
Klasse, Sie können es verwenden, in der Methode als gut 🙂$c
ist der container selbst. Ich bin mir nicht wirklich sicher, wie es funktioniert, aber es funktioniert 😀 Siehe Pickel-DokumentationMit Slim 3 RC2 und ab bei einer Streckenlänge von:
Den
CallableResolver
sucht nach einem Schlüssel in der DIC genannt'MyController'
und erwarten, dass die Rückkehr der controller, so können Sie sich registrieren mit dem DIC, wie diese:Alternativ, wenn Sie nicht registrieren, mit dem DIC, dann die
CallableResolver
passieren die container zu Ihrem Konstruktor, so können Sie einfach erstellen Sie eine Steuerung wie diese:$app->get("/foo", "Foo:foo");
statt$app->get("/foo", "\App\Controllers\Foo:foo");
für jeden controller. Ich habe setup psr4 in meinemcomposer.json
aber leider muss ich mich übergebenFoo:class."foo"
.__invoke()
, also es wird dann:$app->get('/foo', GetFoo::class);
action
jetzt. Es hilft wirklich die Dinge zu vereinfachen. Ich möchte danke speziell für deine Zeit und Antworten zu meinem Kommentar. Es ist schon eine Woche oder zwei, da ich ' V wurde mit Slim und jeder website, die ich habe über kommen, die erwähnt, Slim, Sie sind immer da, um Menschen zu helfen. Es scheint, dass Sie tatsächlich Folgen Sie dem trend. Ich wirklich zu schätzen Ihre Hilfe, es bedeutet eine Menge, und ich denke, es ist etwas, unbemerkt von eine Menge Leute. Wieder, vielen Dank.Habe ich die folgenden Basis-controller und erweitert, dass. Gerade erst angefangen zu spielen, mit Schlank, aber es funktioniert, wenn Sie benötigen Zugriff auf den DI in den Controllern.
Dann in deinem anderen Controller können Sie es wie dieses.
Wichtig
Ich von Ihnen positiv bewertet werden @mgansler und Sie sollten Lesen, dass erste, wenn man es mit slim 3, und Lesen Sie dieses nur, wenn daran interessiert, Unterschiede zu schlank 2.
Update
So scheint es, die Bereiche wurden nur alten code niemand gereinigt.
Aber im verlassen dieses hier posten, wie es sollte hilfreich sein, um jemand mit Slim-2 (wie slim 3 ist sehr viel noch beta) und als Referenz-Punkt zu helfen, sehen Sie die Unterschiede.
Alten-Update (siehe oben)
Folgenden update der OP, sah ich auf github source code und festgestellt, dass die getInstance ist noch sehr viel gibt, aber mit einigen geringfügigen Unterschiede vielleicht...
https://github.com/slimphp/Slim/search?utf8=%E2%9C%93&q=getInstance
Test-Dateien (die vielleicht veraltet, aber unwahrscheinlich) zeigen so etwas wie dieses:
Aber zur gleichen Zeit, wir sehen fordert, wie dies in einigen Dateien, die offensichtlich inhaltliche und entweder zurückgeben, diff-Objekt ($env) oder sind in gleichen statischen Datei (Slim.php)
Aber das zeigt die statische Funktion noch vorhanden ist, so verwenden Sie meine Beispiele unten, und versuchen Sie herauszufinden, warum Sie nicht arbeiten für Sie in der aktuellen form.
Auch, dieses 'vielleicht' von Interesse, da nur ein offensichtliches Beispiel von slim3 in Verwendung: https://github.com/akrabat/slim3-skeleton
Aber auch andere Projekte prob vorhanden ist, suchen Sie mit dem github-Filter, falls noch Probleme.
Ursprüngliche Antwort Inhalt
Bitte geben Sie mehr Details über die route und die andere Klasse, aber hier sind 3 Möglichkeiten, mit der Ausführung detaillierte Beispiele weiter unten.
Diese info bezieht Schlanke Framework 2, nicht die Slim 3 beta, aber slim 3 beta zeigt ähnliches Beispiel-code und macht keinerlei Erwähnung der überholung verpasst, und in der Tat links zu der Slim-2-Dokumentation: http://docs.slimframework.com/configuration/names-and-scopes/
Slim3 Beta hat nur ein code-Beispiel, die wie folgt aussieht:
Obwohl dies offensichtlich nicht paßt, die außerhalb der index.php, aber ist im Einklang mit Slim2 doco zeigt GetInstance funktioniert.
, Die man Ihnen passt?
Ich habe mehrere Dateien, verwenden Sie diese verschiedenen Ansätze, aber ich kann nicht sagen, was am besten passt als zu wenig Kontext, wie diese externe Klasse passt und was seine Zusammensetzung.
Zum Beispiel, mein Controller (die Endpunkte der meisten meiner Strecken) verwenden den gleichen Ansatz, durch eine Basisklasse oder einfach direkt:
Mein Helfer-Dateien anzeigen-code wie dieser:
Mein middleware:
Thats Beispiel, wie ich den Zugang in die verschiedenen Dateien, obwohl der code, den Sie bereits freigegebenen zeigt sich, dass Sie die empfohlene Vorgehensweise schon
Zwar wieder, brauchen Sie mehr info, um sicher sagen wie Ihre externen Datei passt, aber wenn Ihr an das Ende einer route oder in einem 'include()', dann sollte es funktionieren.
Du hast gesagt, der alte Ansatz nicht funktionieren, aber es gab keine info, was das tatsächliche Ergebnis vs erwartete Ergebnis war (error msg, ect), so dass, wenn dies nicht funktioniert, aktualisieren Sie bitte die OP.
getInstance()
ist NICHT in Slim 3 mehr, Sie haben sich Slim 2 - code. (\Slim\Slim
ist jetzt\Slim\App
)Dieser war hart im nehmen. @mgansler Antwort war wirklich hilfreich, aber in seiner Antwort, er an einer Datenbank-Verbindung, und nicht genau $app in die controller -
Folgenden die gleiche Idee, es ist möglich, senden $app, obwohl.
Erster Stelle in Ihrem dependencies.php Sie müssen greifen die $ - app und werfen Sie es in einen container, um es zu injizieren, um die Steuerung später.
Dann hast du, um es zu injizieren:
Nun auf Ihrem controller.php:
Nun muss man einfach haben, rufen Sie es wie folgt: