Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Symfony2-Plug-in-Formats

Detaillierte Erläuterung des Symfony2-Plug-in-Formats

*文
*文Original
2018-01-05 17:47:391557Durchsuche

In diesem Artikel wird hauptsächlich das Plug-In-Format von Symfony2 vorgestellt und das Plug-In-Prinzip von Symfony2 und verwandte Techniken zum Erstellen und Verwenden von Plug-Ins ausführlich analysiert. Freunde in Not können darauf verweisen. Ich hoffe, dass es für alle hilfreich ist.

Ein Bundle ähnelt Plugins in anderen Frameworks, bietet jedoch eine bessere Leistung als Plugins. Der Hauptunterschied zu anderen Frameworks besteht darin, dass alles in Symfony2 ein Paket ist, einschließlich der Kernfunktionen des Frameworks und des gesamten von Ihnen geschriebenen Anwendungscodes. In Symfony2 sind Bundles erstklassige Bürger. Dies gibt Ihnen mehr Flexibilität bei der Nutzung von Inhaltspaketen, die von anderen Drittanbietern entwickelt wurden, oder bei der Verteilung Ihrer eigenen Pakete. Sie können ganz einfach auswählen, was Sie auf Ihr Programm anwenden möchten und was nicht, um sie entsprechend Ihren Vorstellungen zu optimieren.

Ein Bundle ist ein Verzeichnis, das eine sehr gute Struktur hat und alles von Klassen über Controller bis hin zu Webressourcen speichern kann.

Ein Bundle ist lediglich eine strukturierte Sammlung von Dateiverzeichnissen, die einen einzelnen Inhalt implementiert.

Sie können ein BlogBundle, ein ForumBundle oder ein Bundle erstellen, das die Benutzerverwaltung implementiert (es scheint, dass es bereits viele solcher Open-Source-Bundles gibt). Jedes Bundle-Verzeichnis enthält alles, was mit dem Implementierungsinhalt zu tun hat, einschließlich PHP-Dateien, Vorlagen, Stylesheets, Javascript-Dateien, Testinhalt und alles andere, was damit zusammenhängt. Alle Aspekte der umzusetzenden Inhalte werden gebündelt vorgehalten.

Eine Anwendung besteht aus allen Bundles, die in der Methode registerBundles() in der AppKernel-Klasse definiert sind.

// app/AppKernel.php
public function registerBundles()
{
  $bundles = array(
    new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
    new Symfony\Bundle\SecurityBundle\SecurityBundle(),
    new Symfony\Bundle\TwigBundle\TwigBundle(),
    new Symfony\Bundle\MonologBundle\MonologBundle(),
    new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
    new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
    new Symfony\Bundle\AsseticBundle\AsseticBundle(),
    new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
    new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
  );
  if (in_array($this->getEnvironment(), array('dev', 'test'))) {
    $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
    $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
    $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
    $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
  }
  return $bundles;
}

Hier können Sie mit dieser Methode Ihre Bewerbungszusammensetzung einheitlich steuern und verwalten.

Ein Bundle kann in jedem Verzeichnis gespeichert werden und muss nur automatisch geladen werden, indem der Autoloader in der Datei app/autoload.php konfiguriert wird.

Erstellen Sie ein Bundle

Die Standardversion von Symfony2 hat eine voll funktionsfähige Tool-Datei zur Bundle-Erstellung für Sie vorbereitet. Sie können es ausführen, um den gesamten Inhalt des Bundles zu erstellen, oder Sie können

wählen, es manuell zu erstellen. Jetzt erstellen wir ein AcmeTestBundle und sorgen dafür, dass es in unserer Anwendung funktioniert. Beachten Sie, dass es sich bei Acme um einen gefälschten Anbieternamen handelt. Sie können ihn vollständig durch den Namen Ihrer eigenen Organisation oder Firma ersetzen.

Erstellen Sie zunächst ein src/Acme/TestBundle/-Verzeichnis und fügen Sie eine neue Datei AcmeTestBundle.php hinzu.

// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeTestBundle extends Bundle
{
}

Als nächstes müssen Sie es hinzufügen, um es in Ihrer Anwendung verfügbar zu machen die AppKernel-Klasse Fügen Sie es in die Methode registerBundles() ein.

// app/AppKernel.php
public function registerBundles()
{
  $bundles = array(
    // ...
    // register your bundles
    new Acme\TestBundle\AcmeTestBundle(),
  );
  // ...
  return $bundles;
}

Obwohl es jetzt nichts bewirkt, wird es Teil Ihrer Bewerbung.

Wir können auch die von Symfony2 bereitgestellten Befehlszeilentools verwenden, um Folgendes zu erstellen:

$ php app/console generate:bundle --namespace=Acme/TestBundle

Wenn Sie die oben genannten Befehlszeilentools verwenden, wird das erstellte Bundle automatisch in der appKernel-Klassenmitte registriert .

Bundle-Verzeichnisstruktur

Sehen Sie sich die Verzeichnisstruktur des Demo-Bundles an, das mit Symfony2 geliefert wird:

Die Verzeichnisstruktur des Bundles ist einfach und flexibel, wie Sie dem Screenshot oben entnehmen können:

Controller/ enthält alle Controller-Dateien des Bundles, wie z. B. HelloController.php.
DependencyInjection/ enthält bestimmte Dependency-Injection-Erweiterungsklassen, die Dienstkonfigurationen importieren, Compiler-Transporte registrieren und vieles mehr. Dieses Verzeichnis ist nicht erforderlich.
Resources/config/ speichert Konfigurationsdateien, einschließlich Routing-Konfiguration (zum Beispiel: Routing.yml).
Ressourcen/Ansichten/ Alle Vorlagen werden entsprechend den Namen der entsprechenden Controller in Ordner unterteilt und hier gespeichert. Zum Beispiel Hello/index.html.twig.
Resources/public/ Alle zugänglichen Webressourcen (Bilder, Stylesheets usw.) und der Inhalt, der über den Konsolenbefehl „assets:install“ kopiert oder asynchron mit dem Verzeichnis „web/“ des Projekts verknüpft wird.
Tests/speichert alle Tests im Bundle

Im Folgenden sind einige Standardregeln für von Symfony2 empfohlene Bundles aufgeführt:

Bundle-Name:

Ein Bundle ist auch ein PHP-Namespace. Namespaces müssen den internen technischen Standards von PHP5.3 für Namespaces und Klassennamen entsprechen. Verwenden Sie am Anfang den Namen des Anbieters, gefolgt vom Klassifizierungssegment (kann weggelassen werden) und schließlich dem abgekürzten Namen des Namespace. Dem Namen muss das Suffix „Bundle“ hinzugefügt werden. Um einen Namespace in ein Bundle umzuwandeln, müssen Sie dem Namespace lediglich eine Bundle-Klasse hinzufügen.

Benennung der Bundle-Klasse:

Nur ​​Zahlen, Buchstaben und Unterstriche
Verwenden Sie die Benennung in Groß-/Kleinschreibung.
Verwenden Sie einen beschreibenden und prägnanten Namen (nicht mehr als zwei Zeichen). ) Wörter)
Verwenden Sie den Lieferantennamen als Präfix (optionaler Klassifizierungs-Namensraum)

Fügen Sie Bundle als Namenssuffix hinzu

Zum Beispiel:

Namespace => Bundle-Klassenname

Acme\Bundle\BlogBundle => AcmeBlogBundle
Acme\Bundle\Social\BlogBundle =>AcmeSocialBlogBundle
Acme\BlogBundle => AcmeBlogBundle

Die Methode getName() beim Definieren der Bundle-Klasse sollte den Klassennamen zurückgeben.

Jedes Bundle hat einen Alias, der die abgekürzte Version des Bundle-Namens in Kleinbuchstaben darstellt, getrennt durch Unterstriche. Der ursprüngliche Name des Bundles von acme_hello lautet beispielsweise AcmeHelloBundle, und acme_social_blog ist eine Instanz von AcmeSocialBlogBundle.

Der Alias ​​muss innerhalb eines Bundles eindeutig sein.

Verzeichnisstruktur von Bundle: Grundlegende Verzeichnisstruktur von HelloBundle

XXX/...
  HelloBundle/
    HelloBundle.php
    Controller/
    Resources/
      meta/
        LICENSE
      config/
      doc/
        index.rst
      translations/
      views/
      public/
    Tests/

上面的XXX/... 映射到该bundle的命名空间。其中下面的文件是必备的:

HelloBundle.php;

Resources/meta/LICENSE: 全文的许可代码;
Resources/doc/index.rst: bundle说明的根目录文件。

使用类的子文件夹的深度应该保持到最小(2级是极限)。如果更多级可以定义为非静态,不过很少使用。bundle的目录是只读的。如果你需要修改临时文件,把它们保存到主应用程序的cache/ 或者 log/ 目录下。

需要强调的类和文件

类型 VS 目录

Commands                            VS         Command/
Controllers                             VS        Controller/
Service Container Extensions   VS        /DependencyInjection/
Event Listeners                      VS         EventListener/
Configuration                         VS         Resources/config
Web Resources                      VS         Resources/public
Translation files                      VS         Resources/translations/
Templates                              VS         Resources/views
Unit and Functional Test          VS         Tests/

类:

bundle的目录结构是被用来当作命名空间层级的。比如HelloController类保存在 Bundle/HelloBundle/Controller/HelloController.php文件中。

所以类的完全限定名是 Bundle\HelloBundle\Controller\HelloController 。 一些类被看作是装饰,应该越短越好,比如Commands,Helpers, Listeners 和Controllers等,一般都会被当作后缀。

跟事件分发器有关的类应该用后缀Listener标识。

异常类应该保存到一个Exception子命名空间中。

关于提供商

一个bundle不应该被嵌入第三方的PHP类库,它应该依靠Symfony2标准来自动加载它们。

一个bundle不应该被嵌入第三方的javascript,CSS或者其它语言写的任何类库。

关于测试

一个bundle应该有一个使用PHPUnit的测试单元并把它存储在Tests/ 目录下。

测试应该遵循以下原则:

测试套件必须能够被一个简单的phpunit 命令从一个简单的应用程序中执行。

功能测试应该只备用来测试回复输出和一些监控信息。

测试代码覆盖应该至少在95%以上的基本代码。

一个测试套件可以不包含AllTests.php脚本,但必须依靠外部的phpunit.xml.dist文件。

文档说明

所有的类必须带有PHPDoc。

Controllers

最好的情况下,controller应该在一个可以部署到其它地方的bundle中,那么它不能继承Controller基类。而是通过实现ContainerAwareInterface接口或者继承ContainerAware来取代继承Controller。

Routing

如果bundle提供路由,他们必须使用bundle的别名为前缀,比如一个AcmeBlogBundle实例,所有的路由名必须是acme_blog_ 开头。

Templates

如果bundle提供模板,它必须使用Twig。 bundle不必低通一个主布局文件,如果你的bundle是一个完整的应用程序除外。

翻译文件

如果bundle提供信息翻译,它必须是被定义成XLIFF格式,区域名必须被命名在bundle名字之后,如bundle.hello

配置

为了提供更大的灵活性,一个bundle可以使用Symfony2的内建机制提供配置设置。对于简单的设置,依赖于默认的Symfony2的parameters配置入口。 Symfony2参数都是简单的 key/value 对。值可以是任意的合法的PHP值。 每个参数名应该以讹bundle的别名开始,这只是一个最佳的建议。参数名其余部分用点号(.)分割,比如 acme_hello.email.from

让最终用户可以在配置文件中直接提供值信息。

YAML格式:

# app/config/config.yml
parameters:
    acme_hello.email.from: fabien@example.com

XML格式:

<!-- app/config/config.xml -->
<parameters>
   <parameter key="acme_hello.email.from">fabien@example.com</parameter>
</parameters>

PHP代码格式:

// app/config/config.php
$container->setParameter(&#39;acme_hello.email.from&#39;, &#39;fabien@example.com&#39;);

INI格式:

[parameters]
acme_hello.email.from = fabien@example.com

这样就可以在代码中从容器获取这些配置信息了:

$container->getParameter(&#39;acme_hello.email.from&#39;);

如果你定义服务,我们也推荐你使用bundle的别名作为前缀。

总结思考:

以上是关于Symfony2中最主要的插件格式bundle的大体情况,在整个Symfony2为基础开发的应用程序中,几乎全部都是有bundle组成。Symfony2本身的核心组件都是FrameworkBundle。在Symfony2交流社区中,已经有了大量的开发者贡献了他们的bundle,我们可以直接拿来集成到我们自己的应用程序中使用。上面所说的大部分规则,都是应用于你开发贡献bundle时应该遵循的统一规则,以方便其它用户使用。

带有第三方贡献的bundle的Symfony2开发包:

如果你不打算把你的bundle贡献出来,那么完全可以不用按照这里说的大部分规则进行开发。

相关推荐:

详解Symfony模板快捷变量的用法

详解Symfony在模板和行为中取得request参数的方法

简述Symfony核心类

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Symfony2-Plug-in-Formats. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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