Heim php教程 PHP开发 Verständnis der PHP Dependency Injection Container Series (3) Symfony

Verständnis der PHP Dependency Injection Container Series (3) Symfony

Dec 28, 2016 am 10:27 AM

Bisher haben wir über einige grundlegende Konzepte gesprochen. Die Beispiele in den ersten beiden Artikeln sind für uns sehr hilfreich, um die Implementierung der Abhängigkeitsinjektion zu verstehen. Jetzt werden wir uns eingehend mit der Implementierung des Symfony 2-Dienstcontainers befassen.
Der Abhängigkeitsinjektionscontainer in Symfony wird von einer Klasse namens sfServiceContainer verwaltet.

Der Symfony-Container kann als unabhängige Komponente existieren. Das offizielle Subversion-Repository von Symfony kann heruntergeladen werden: http://svn .symfony-. project.com/components/dependency_injection/trunk/
. Es ist erwähnenswert, dass sich diese Komponente immer noch in einer kontinuierlichen iterativen Entwicklung befindet, sodass sie jederzeit aktualisiert werden kann (so hieß es 2009, aber jetzt scheint es damit aufgehört zu haben).

Gemäß der Designphilosophie von Symfony kann jeder Dienst ein Objekt sein, das von einem Container verwaltet wird. In dem im vorherigen Artikel vorgestellten Zend_Mail-Beispiel gibt es zwei Objekte: mailer und mail_transport

class Container
{
  static protected $shared = array();
  protected $parameters = array();
  public function __construct(array $parameters = array())
  {
    $this->parameters = $parameters;
  }
  public function getMailTransport()
  {
    return new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
      'auth'     => 'login',
      'username' => $this->parameters['mailer.username'],
      'password' => $this->parameters['mailer.password'],
      'ssl'      => 'ssl',
      'port'     => 465,
    ));
  }
  public function getMailer()
  {
    if (isset(self::$shared['mailer']))
    {
      return self::$shared['mailer'];
    }
    $class = $this->parameters['mailer.class'];
    $mailer = new $class();
    $mailer->setDefaultTransport($this->getMailTransport());
    return self::$shared['mailer'] = $mailer;
  }
}
Nach dem Login kopieren

Wenn die Container-Klasse die sfServiceContainer-Klasse von Symfony erbt, kann der Code etwas einfacher gestaltet werden

class Container extends sfServiceContainer
{
  static protected $shared = array();
  protected function getMailTransportService()
  {
    return new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
      'auth'     => 'login',
      'username' => $this['mailer.username'],
      'password' => $this['mailer.password'],
      'ssl'      => 'ssl',
      'port'     => 465,
    ));
  }
  protected function getMailerService()
  {
    if (isset(self::$shared['mailer']))
    {
      return self::$shared['mailer'];
    }
    $class = $this['mailer.class'];
    $mailer = new $class();
    $mailer->setDefaultTransport($this->getMailTransportService());
    return self::$shared['mailer'] = $mailer;
  }
}
Nach dem Login kopieren

Durch Beobachtung: Der Konstruktor- und Parameterkonfigurationsverwaltungscode wird weggelassen.
Aber das ist noch nicht alles. sfServiceContainer kann uns eine leistungsstarke und übersichtliche Schnittstelle bieten. Folgende Punkte sind bei der Verwendung der Schnittstelle zu beachten:
Der Name der Methode zum Abrufen des Dienstes muss angehängt werden Service. Normalerweise sind wir uns einig, dass der Name der Methode mit get beginnt und mit Service endet. Jeder Dienst verfügt über ein eindeutiges Logo. Das Logo ist normalerweise der Methodenname ohne Präfix und Suffix, getrennt durch Unterstriche. Wenn die Methode getMailTransportService() definiert ist, lautet der Dienstname mail_transport
2. Die Methode ist vom geschützten Typ, was bedeutet, dass Sie die Methode nicht direkt aufrufen können, um den Dienst zu erhalten. Wir werden später vorstellen, wie Container zum Abrufen von Diensten verwendet werden.
3. Auf den Container kann als Array zugegriffen werden, um die übergebenen Parameter zu erhalten. Zum Beispiel: $this[‘mailer.class’]
Die Dienstleistungsmarke muss eindeutig sein und darf nur aus Buchstaben, Zahlen, „_“ und „.“ bestehen. „.“ kann als Namespace verwendet werden (z. B. mail.mailer und mail.transport).

Jetzt wollen wir sehen, wie dieser neue Container verwendet wird

require_once 'PATH/TO/sf/lib/sfServiceContainerAutoloader.php';
sfServiceContainerAutoloader::register();
$sc = new Container(array(
  'mailer.username' => 'foo',
  'mailer.password' => 'bar',
  'mailer.class'    => 'Zend_Mail',
));
$mailer = $sc->mailer;
Nach dem Login kopieren

Da die Container-Klasse sfServiceContainer erbt, wird die Schnittstelle sehr übersichtlich.

Der Zugriff auf den Dienst erfolgt über die einheitliche Schnittstelle

if ($sc->hasService('mailer'))
{
  $mailer = $sc->getService('mailer');
}
$sc->setService('mailer', $mailer);
Nach dem Login kopieren

Eine einfachere Möglichkeit besteht darin, auf den Dienst über Attribute zuzugreifen

if (isset($sc->mailer))
{
  $mailer = $sc->mailer;
}
$sc->mailer = $mailer;
Nach dem Login kopieren
Der Zugriff auf die Parameter erfolgt über die einheitliche Schnittstelle Schnittstelle
if (!$sc->hasParameter('mailer_class'))
{
  $sc->setParameter('mailer_class', 'Zend_Mail');
}
echo $sc->getParameter('mailer_class');
// Override all parameters of the container
$sc->setParameters($parameters);
// Adds parameters
$sc->addParameters($parameters);
Nach dem Login kopieren

Auf Parameter kann auch wie Arrays über Container zugegriffen werden

if (!isset($sc['mailer.class']))
{
  $sc['mailer.class'] = 'Zend_Mail';
}
$mailerClass = $sc['mailer.class'];
Nach dem Login kopieren

Container können als Iteratoren zum Durchlaufen aller Dienste betrachtet werden

foreach ($sc as $id => $service)
{
  echo sprintf("Service %s is an instance of %s.\n", $id, get_class($service));
}
Nach dem Login kopieren

Wenn nicht viele Dienste verwaltet werden müssen, Sie aber dennoch viel grundlegende Arbeit leisten und viel Code kopieren müssen, müssen Sie zugeben, dass Sie sfServiceContainer verwenden ist sehr nützlich.
Wenn die Anzahl der zu verwaltenden Dienste immer größer wird, muss es eine bessere Möglichkeit geben, die Dienste zu beschreiben.
Aus diesem Grund verwenden wir die sfServiceContainer-Klasse meistens nicht direkt. Dennoch ist es notwendig, einige Zeit damit zu verbringen, darüber zu sprechen, da es ein wichtiger Eckpfeiler des Dependency-Injection-Containers von Symfony ist.

Das Obige ist der Inhalt der PHP-Abhängigkeitsinjektionscontainerserie (3) Symfony. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

See all articles