Zitat von hellbringer
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
eigene MySQLi-Klasse verschiedene Verbindungen
Einklappen
Neue Werbung 2019
Einklappen
X
-
Zitat von Günni Beitrag anzeigenWie würde das aussehen? Also mit einer abstrakten Klasse scheint das ja wohl zu gehen.
Kommentar
-
Zitat von lottikarotti Beitrag anzeigenDas ganze Thema löst sich halt in Luft auf wenn man bspw. PHP-DI mit Autowiring einsetzt. Ich konfiguriere an zentraler Stelle welche Implementierungen & Instanzen injiziert werden sollen. Dabei spielt es auch überhaupt keine Rolle wie tief die Abhängigkeiten verschachteln sind. Auf statische Aufrufe verzichte ich vollständig. Typischer Aufbau (simplifiziert):
PHP-Code:// demo controller
class Controller{
public function __construct(UserRepositoryInterface $users){ .. }
public function selectById(int $id): User{
return $this->users->selectById($id);
}
}
// demo repository interface
interface UserRepositoryInterface{
function selectById(int $id): User;
}
// demo repository implementation
class PdoUserRepository implements UserRepositoryInterface{
public function __construct(PDO $pdo){ .. }
public function selectById(int $id): User{
return $this->pdo->query(..);
}
}
// di config
$config = [
UserRepositoryInterface::class => PdoUserRepository::class,
PDO::class => \DI\object()->constructor($dsn, $user, $pass, $opts),
];
// di usage
$controller = $container->get(Controller::class);
$result = $container->call([$controller, 'selectById'], ['id' => 123]);
Liefert $container->get(Controller::class); eine Instanz der class Controller ?
Sehe auch nicht den Zusammenhang wie der Container zu der Controller-Klasse kommen soll.
Und wo kommt $container her?
Dies hier hat nicht mehr viel mit den Fragen im Startbeitrag zu tun. Ich glaube es ist besser, wenn ich einen neuen Thread aufmache !?
Kommentar
-
Zitat von jspit Beitrag anzeigen
Verstehe nur Bahnhof was di usage betrifft.
Liefert $container->get(Controller::class); eine Instanz der class Controller ?
Alle Abhängigkeiten, die "Controller" in seinem Constructor führt, werden automatisch aufgelöst. Und die Abhängigkeiten der Abhängigkeiten genau so. In den meisten Fällen ohne weitere Konfiguration (autowiring nennt sich das dann). Wenn der DIC den Kandidaten nicht erraten kann, muss er in einer Konfiguration beschrieben werden. Beispielsweise dann, wenn ein Interface oder eine Abstrakte Klasse als Typehint aufgeführt sind (Interface => KonkreteKlasse).
Kommentar
-
Ich hab das DIC Konzept schon im groben verstanden. Es ist jedoch bei mir mehr die Ausnahme das mir im Bootstrap schon bekannt ist welche Klassen ich brauche geschweige das ich deren Abhängigkeiten kenne.
Was wann gemacht werden soll und womit legt der Nutzer mit einen Konfigurationsskript fest dessen Resultat letztlich in der DB landet. Welche Klassen benötigt werden und mit welchen Abhängigkeiten ist nicht allein von der Konfiguration abhängig, sondern das ergibt sich teilweise erst bei Abarbeitung des Jobs selbst in einer tieferen Ebene.
Kommentar
-
Ohne genauere Kenntnis von deiner Umgebung zu haben würde ich glatt behaupten, dass das geht.
Ich habe hier zum Teil auch ein dynamisches Setup. Du kannst einen DIC druchaus auch in Factories und Plugin-Dispatchern verwenden. Mache ich auch so.
In einem Projekt verwende ich Slim für das Routing. Da habe ich dann eine kleine Hilfsfunktion, die de DIC ins Spiel bringt:
PHP-Code:$app->get('/login', dic([LoginCtrl::class, 'login']));
$app->get('/login/{username}', dic([LoginCtrl::class, 'login']));
$app->post('/login', dic([LoginCtrl::class, 'login']));
PHP-Code:$plugins->register('index/before-start', [Security::class, 'check'])
PHP-Code:$plugins->fire('index/before-start', ['requestUri' => $requestUri])
PHP-Code:class Security {
/* ... */
public function __construct(Database $db) {
$this->db = $db;
}
public function check(string $requestUri) {
/* ... */
}
}
Und du kannst in eigenen Factories den DIC nutzen, um ständig neue Instanzen einer Entität zu erzeugen, wenn eine Klasse nicht als Singleton im Kontext eines DICs verwendet werden soll.
PHP-Code:class MyFactory {
/** @var Container */
private $dic;
/**
* @param Container $dic
*/
public function __construct(Container $dic) {
$this->dic = $dic;
}
/**
* @param array $data
* @return MyInterface
*/
public function create(array $data) {
return $this->dic->make(MyInterface::class, $data);
}
}
Kommentar
-
rkr : Muss ich mir mal in Ruhe reinzehen. Danke schon mal.
Zitat von rkr Beitrag anzeigenOhne genauere Kenntnis von deiner Umgebung zu haben würde ich glatt behaupten, dass das geht.Knackpunkt ist das ich PHP-DI auf meine Zielplattform nicht verfügbar habe.
Die Zielplattform ist ein Embedded System grob vergleichbar mit dem bekannten Raspberry Pi.
Da versuche ich erst gar nicht PHP-DI zu installieren.
https://www.php.de/forum/webentwickl...bankverbindung
darauf antworten.
Kommentar
Kommentar