Système de bundle


Les bundles sont similaires aux plugins d'autres logiciels, mais en mieux. La principale différence est la suivante : tout dans Symfony est un ensemble, y compris les fonctionnalités de base du framework, ainsi que le code du programme que vous écrivez. Les bundles sont des citoyens de première classe dans le système Symfony. Cela vous donne une architecture flexible qui vous permet d'utiliser des fonctionnalités prédéfinies à partir de offres groupées tierces ou de publier vos propres offres groupées. Les offres groupées permettent de choisir facilement les fonctionnalités à activer dans votre application et de les optimiser comme vous le souhaitez.

Dans cet article, vous pourrez apprendre les bases des bundles, et il y a un grand chapitre dans "Best Practices" axé sur l'organisation et les bonnes pratiques des bundles.

Un bundle est un ensemble de fichiers structurés stockés dans un répertoire "utilisé pour implémenter une fonction indépendante". Vous pouvez créer un BlogBundle, un ForumBundle ou un bundle qui gère les utilisateurs (de nombreux bundles similaires existent déjà en tant que projets open source). Chaque répertoire contient tout ce qui concerne cette fonctionnalité, y compris les fichiers php, les modèles, les fichiers CSS, js, les tests et autres. Les sous-éléments de chaque fonction existent dans le bundle, et chaque fonction existe dans le bundle.

Pour utiliser des bundles dans votre programme, vous devez vous inscrire et les utiliser via la méthode registerBundles() de la classe AppKernel : AppKernel 类的 registerBundles() 方法来注册并使用它们:

// app/AppKernel.phppublic 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 AppBundle\AppBundle(),
    );     if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }     return $bundles;

registerBundles() 方法可以让你完全控制在程序中使用哪个bundle(包括Symfony的核心bundle)。

bundle可以存在于任何地方,只要它能够被自动加载(通过 app/autoload.php 中所配置的自动加载器实现)

创建一个Bundle 

Symfony标准版内置了超好用的命令,用来帮你创建全功能bundle。当然,手动创建bundle也一样容易。

为了展示一个简单的bundle系统,我们创建一个全新的AcmeTestBundle并开启它。

Acme部分只是个假名,实战中应被一些“vendor”名字替换掉,以代表你或者你所在的组织(比如ABCTestBundle代表某个名为 ABC 的公司)

从新建一个 src/Acme/TestBundle/ 目录开始,再新建一个 AcmeTestBundle.php 文件:

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

AcmeTestBundle遵守 bundle命名约定。你可以选择简化bundle名称为TestBundle,通过把类名改为TestBundle(同时修改文件名为 TestBundle.php

// app/AppKernel.phppublic function registerBundles(){
    $bundles = array(
        // ...         // register your bundle / 注册你的bundle
        new Acme\TestBundle\AcmeTestBundle(),
    );
    // ...     return $bundles;}

registerBundles()< La méthode /code> vous donne un contrôle total sur les bundles (y compris les bundles principaux de Symfony) utilisés dans votre programme.
🎜le bundle peut exister n'importe où, à condition qu'il puisse être chargé automatiquement (via la configuration automatique configurée dans app/autoload.php Implémentation du chargeur)🎜🎜🎜

Créer un bundle ¶🎜

🎜La version standard de Symfony est intégrée très facilement. utiliser des commandes Utilisé pour vous aider à créer des ensembles complets. Bien entendu, créer le bundle manuellement est tout aussi simple. 🎜🎜Pour démontrer un système de bundle simple, nous créons un nouveau AcmeTestBundle et l'activons. 🎜🎜
🎜La partie Acme n'est qu'un pseudonyme. Dans la pratique, elle doit être remplacée par un nom de « fournisseur » pour vous représenter ou représenter votre organisation (. tel que ABCTestBundle Représentant une société nommée ABC) 🎜🎜🎜🎜Commencez par créer un nouveau répertoire src/Acme/TestBundle/, puis créez un nouveau AcmeTestBundle. php Fichier : 🎜
$  php bin/console generate:bundle --namespace=Acme/TestBundle
🎜
🎜AcmeTestBundle suit la convention de dénomination du bundle. Vous pouvez choisir de simplifier le nom du bundle en TestBundle en changeant le nom de la classe en TestBundle (et en modifiant le nom du fichier en TestBundle.php) 🎜🎜🎜

Cette classe vide est la seule chose dont vous avez besoin lors de la création d'un nouveau bundle. Bien qu'elle soit généralement vide, cette classe est particulièrement puissante et est spécifiquement utilisée pour personnaliser différents comportements du bundle.

Maintenant que vous avez créé le bundle, activez-le dans la classe AppKernel : AppKernel类中开启它:

rrreee

尽管目前啥也没做,AcmeTestBundle已经可以使用。

就这么简单,Symfony也提供了命令行界面,用于生成一个基本的bundle骨架:

rrreee

bundle骨架包括控制器、模板和路由资源等,而且都可以自定义。在后面的Symfony命令行工具小节,你可以学到更多。

不管是创建新bundle还是使用第三方bundle,应确保bundle被 registerBundles() 开启。当使用 generate:bundle 命令时,Symfony替你注册完成了。

Bundle目录结构 

bundle目录是简单而有弹性的。默认条件下,bundle系统遵循着一组命名约定,以保持所有Symfony bundle的代码一致性。看一眼AcmeDemoBundle,它包括了一个bundle最常见的某些元素:

  • Controller/
  • 里面有该bundle的控制器(如 `RandomController.php`)。
  • DependencyInjection/
  • 里面有特定的Dependency Injection Extension类,用来导入服务配置信息,注册compiler passes,以及更多内容(这个目录并非必需)。
  • Resources/config/
  • 存放配置信息,包括路由配置(`routing.yml` 等)。
  • Resources/views/
  • 存放模板。依控制器名字来组织子文件夹(如 `Hello/index.html.twig`)。
  • Resources/public/
  • 存放web assets资源(图片,css等),将通过硬拷贝或symlink方式导入到项目的 `web/` 目录,通过console命令 `assets:install` 实现。
  • Tests/rrreee
  • Bien que rien n'ait encore été fait, l'AcmeTestBundle est prêt à être utilisé.
  • C'est aussi simple que cela. Symfony fournit également une interface de ligne de commande pour générer un squelette de bundle de base :
rrreee

Le squelette du bundle comprend des contrôleurs, des modèles, des ressources de routage, etc., et ils peuvent tous être personnalisés. Vous pouvez en savoir plus dans la section ultérieure sur les outils de ligne de commande Symfony.

Que vous créiez un nouveau bundle ou que vous utilisiez un bundle tiers, vous devez vous assurer que le bundle est < code>registerBundles() est activé. Lorsque vous utilisez la commande generate:bundle, Symfony l'enregistre pour vous.

🎜

Structure du répertoire des bundles

🎜Le répertoire des bundles est simple et flexible. Par défaut, le système de bundle suit un ensemble de conventions de dénomination pour maintenir la cohérence du code dans tous les bundles Symfony. Jetez un œil à l'AcmeDemoBundle. Il comprend certains des éléments les plus courants d'un bundle : 🎜
    🎜Controller/🎜🎜Il contient le contrôleur de. le bundle (tel que `RandomController.php`). 🎜🎜DependencyInjection/🎜🎜Il existe des classes d'extension d'injection de dépendance spécifiques utilisées pour importer des informations de configuration de service, enregistrer les passes du compilateur, etc. (ce répertoire n'est pas obligatoire). 🎜🎜Resources/config/🎜🎜Stocke les informations de configuration, y compris la configuration du routage (`routing.yml`, etc.). 🎜🎜Ressources/vues/🎜🎜Modèles de stockage. Organisez les sous-dossiers par nom de contrôleur (par exemple `Hello/index.html.twig`). 🎜🎜Resources/public/🎜🎜Stockage des ressources d'actifs Web (images, CSS, etc.), qui seront importées dans le répertoire `web/` du projet via une copie papier ou un lien symbolique, via l'implémentation de la commande de console `assets:install`. 🎜🎜Tests/🎜🎜Stocke toutes les classes de test de ce bundle. 🎜🎜🎜Un bundle peut être petit ou grand selon la fonction qu'il implémente. Il contient uniquement les fichiers dont vous avez besoin et rien d'autre. 🎜🎜En lisant le guide chinois, vous apprendrez à conserver des objets dans une base de données, à créer et valider des formulaires, à ajouter des fonctionnalités de traduction à votre programme, à rédiger des tests, et bien plus encore. Tous ces éléments sont basés sur des bundles et ont leurs propres répertoires et fonctions. 🎜🎜