Sistem ikatan


bundle adalah serupa dengan pemalam dalam perisian lain, tetapi lebih baik. Perbezaan utama ialah ini: segala-galanya dalam Symfony adalah satu berkas, termasuk fungsi teras rangka kerja, serta kod program yang anda tulis. Bundle ialah warga kelas pertama dalam sistem Symfony. Ini memberi anda seni bina yang fleksibel yang membolehkan anda menggunakan fungsi pra-bina daripada himpunan pihak ketiga atau menerbitkan berkas anda sendiri. Himpunan memudahkan anda memilih ciri untuk didayakan dalam aplikasi anda dan mengoptimumkannya mengikut cara yang anda mahukan.

Dalam artikel ini anda boleh mempelajari asas himpunan, dan terdapat bab besar dalam "Amalan Terbaik" yang memfokuskan pada organisasi dan Amalan Terbaik.

Himpunan ialah set fail berstruktur yang disimpan dalam direktori "digunakan untuk melaksanakan fungsi bebas". Anda boleh membuat BlogBundle, ForumBundle, atau bundle yang mengurus pengguna (banyak bundle serupa sudah wujud sebagai projek sumber terbuka). Setiap direktori mengandungi semua yang berkaitan dengan fungsi itu, termasuk fail php, templat, css, fail js, ujian dan lain-lain. Sub-item bagi setiap fungsi wujud dalam berkas, dan setiap fungsi wujud dalam berkas.

Untuk menggunakan berkas dalam program anda, anda mesti mendaftar dan menggunakannya melalui kaedah registerBundles() kelas AppKernel:

// 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() kaedah memberi anda kawalan penuh ke atas berkas mana (termasuk berkas teras Symfony) digunakan dalam program anda.
AppKernel 类的 registerBundles() 方法来注册并使用它们:

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

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

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

创建一个Bundle 

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

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

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

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

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

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

bundle boleh wujud di mana-mana asalkan ia boleh dimuatkan secara automatik (melalui app/autoload.php < /code> Pelaksanaan autoloader yang dikonfigurasikan dalam )
#🎜🎜##🎜🎜#

Buat Himpunan ¶#🎜🎜 #

#🎜🎜#Versi standard Symfony mempunyai arahan terbina dalam yang sangat mudah digunakan untuk membantu anda membuat himpunan berciri penuh. Sudah tentu, membuat himpunan secara manual adalah sama mudah. #🎜🎜##🎜🎜#Untuk menunjukkan sistem himpunan mudah, kami mencipta AcmeTestBundle baharu dan membukanya. #🎜🎜##🎜🎜#
#🎜🎜# Bahagian Acme hanyalah nama samaran dalam pertempuran sebenar, ia harus digantikan dengan beberapa "vendor " nama untuk mewakili Anda atau organisasi anda (contohnya, ABCTestBundle mewakili syarikat bernama ABC) #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Create a new src/ Direktori Acme /TestBundle/, buat fail AcmeTestBundle.php baharu: #🎜🎜#
$  php bin/console generate:bundle --namespace=Acme/TestBundle
#🎜🎜#
#🎜🎜#AcmeTestBundle Ikuti konvensyen penamaan berkas. Anda boleh memilih untuk memudahkan nama bundle kepada TestBundle dengan menukar nama kelas kepada TestBundle (dan ubah suai nama fail kepada TestBundle.php) #🎜🎜##🎜🎜##🎜🎜#

Kelas kosong ini adalah satu-satunya perkara yang anda perlukan semasa membuat himpunan baharu. Walaupun pada umumnya kosong, kelas ini sangat berkuasa dan digunakan secara khusus untuk menyesuaikan pelbagai gelagat himpunan.

Sekarang anda telah mencipta himpunan, dayakannya dalam kelas 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
  • Walaupun tiada apa yang telah dilakukan, AcmeTestBundle sedia untuk digunakan.
  • Semudah itu Symfony juga menyediakan antara muka baris arahan untuk menjana rangka berkas asas:
rrreee

Rangka berkas termasuk pengawal, templat, sumber penghalaan, dsb., dan semuanya boleh disesuaikan. Anda boleh mengetahui lebih lanjut dalam bahagian kemudian pada Alat Baris Perintah Symfony.

Sama ada anda membuat himpunan baharu atau menggunakan himpunan pihak ketiga, anda harus memastikan bahawa himpunan itu < code>registerBundles() dihidupkan. Apabila menggunakan perintah generate:bundle, Symfony mendaftarkannya untuk anda.

🎜

Struktur direktori himpunan

🎜Direktori berkas adalah ringkas dan fleksibel. Secara lalai, sistem himpunan mengikut satu set konvensyen penamaan untuk mengekalkan ketekalan kod merentas semua himpunan Symfony. Lihatlah AcmeDemoBundle Ia termasuk beberapa elemen yang paling biasa bagi satu berkas: 🎜
    🎜Pengawal/🎜🎜Ia mengandungi pengawal bagi berkas itu ( Seperti `RandomController.php`). 🎜🎜DependencyInjection/🎜🎜Terdapat kelas Sambungan Dependency Injection khusus yang digunakan untuk mengimport maklumat konfigurasi perkhidmatan, mendaftar pas pengkompil dan banyak lagi (direktori ini tidak diperlukan). 🎜🎜Sumber/config/🎜🎜Menyimpan maklumat konfigurasi, termasuk konfigurasi penghalaan (`routing.yml`, dsb.). 🎜🎜Sumber/pandangan/🎜🎜Templat storan. Susun subfolder mengikut nama pengawal (cth. `Hello/index.html.twig`). 🎜🎜Sumber/awam/🎜🎜Simpan sumber aset web (gambar, css, dll.), yang akan diimport ke dalam direktori `web/` projek melalui salinan cetak atau symlink, melalui pelaksanaan arahan konsol `assets:install`. 🎜🎜Ujian/🎜🎜Menyimpan semua kelas ujian himpunan ini. 🎜🎜🎜Sebungkus mungkin kecil atau besar bergantung pada fungsi yang dilaksanakannya. Ia mengandungi hanya fail yang anda perlukan dan tiada yang lain. 🎜🎜Sambil anda membaca panduan bahasa Cina, anda akan belajar cara mengekalkan objek ke pangkalan data, mencipta dan mengesahkan borang, menambah fungsi terjemahan pada program anda, menulis ujian dan banyak lagi. Semua ini adalah berdasarkan himpunan dan mempunyai direktori dan fungsi mereka sendiri. 🎜🎜