번들 시스템
번들은 다른 소프트웨어의 플러그인과 유사하지만 더 좋습니다. 주요 차이점은 프레임워크의 핵심 기능은 물론 사용자가 작성하는 프로그램 코드를 포함하여 Symfony의 모든 것이 번들이라는 것입니다. 번들은 Symfony 시스템의 일류 시민입니다. 이를 통해 타사 번들에서 사전 구축된 기능을 사용하거나 자체 번들을 게시할 수 있는 유연한 아키텍처를 제공합니다. 번들을 사용하면 애플리케이션에서 활성화할 기능을 쉽게 선택하고 원하는 방식으로 최적화할 수 있습니다.
이 문서에서는 번들의 기본 사항을 배울 수 있으며, 번들의 구성과 모범 사례에 초점을 맞춘 "모범 사례"의 큰 장이 있습니다.
번들은 "독립적인 기능을 구현하는 데 사용되는" 디렉터리에 저장된 구조화된 파일 집합입니다. BlogBundle, ForumBundle 또는 사용자를 관리하는 번들을 생성할 수 있습니다(오픈 소스 프로젝트에는 이미 유사한 번들이 많이 존재함). 각 디렉토리에는 PHP 파일, 템플릿, CSS, js 파일, 테스트 등을 포함하여 해당 기능과 관련된 모든 것이 포함되어 있습니다. 번들에는 각 기능의 하위 항목이 존재하며, 각 기능은 번들에 존재합니다.
프로그램에서 번들을 사용하려면 AppKernel
클래스의 registerBundles()
메서드를 통해 번들을 등록하고 사용해야 합니다. 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()< /code> 메소드를 사용하면 프로그램에서 사용되는 번들(Symfony의 핵심 번들 포함)을 완벽하게 제어할 수 있습니다.
app/autoload.php
에 구성된 자동 구성을 통해) 어디에나 존재할 수 있습니다. 로더 구현)🎜🎜🎜번들 만들기 ¶🎜
🎜Symfony 표준 버전에는 매우 쉬운 기능이 내장되어 있습니다. 명령을 사용하여 모든 기능을 갖춘 번들을 만드는 데 사용됩니다. 물론 번들을 수동으로 생성하는 것도 마찬가지로 쉽습니다. 🎜🎜간단한 번들 시스템을 시연하기 위해 새로운 AcmeTestBundle을 생성하고 활성화합니다. 🎜🎜Acme
부분은 단지 가명일 뿐입니다. 실제로는 귀하 또는 귀하의 조직을 나타내는 일부 "공급업체" 이름으로 대체해야 합니다( 예: ABCTestBundle ABC
라는 회사를 나타냄) 🎜🎜🎜🎜새 src/Acme/TestBundle/
디렉토리를 생성하여 시작한 다음 새 AcmeTestBundle을 생성합니다. php code> 파일: 🎜$ php bin/console generate:bundle --namespace=Acme/TestBundle
🎜🎜AcmeTestBundle은 번들 명명 규칙을 따릅니다. 클래스 이름을 TestBundle로 변경하여 번들 이름을 TestBundle로 단순화하도록 선택할 수 있습니다(그리고 파일 이름을 TestBundle.php
로 수정) 🎜🎜🎜이 빈 클래스는 새 번들을 만들 때 필요한 유일한 것입니다. 일반적으로 비어 있지만 이 클래스는 특히 강력하며 특히 번들의 다양한 동작을 사용자 정의하는 데 사용됩니다.
이제 번들을 생성했으므로 AppKernel
클래스에서 활성화합니다. AppKernel
类中开启它:
rrreee尽管目前啥也没做,AcmeTestBundle已经可以使用。
就这么简单,Symfony也提供了命令行界面,用于生成一个基本的bundle骨架:
rrreeebundle骨架包括控制器、模板和路由资源等,而且都可以自定义。在后面的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 아직 아무것도 수행되지 않았지만 AcmeTestBundle이 준비되었습니다. 사용합니다.
심포니는 기본 번들 스켈레톤을 생성하기 위한 명령줄 인터페이스도 제공합니다.
rrreee번들 스켈레톤에는 컨트롤러, 템플릿 및 라우팅 리소스가 포함되어 있습니다. 등, 모두 사용자 정의할 수 있습니다. Symfony 명령줄 도구의 뒷부분 섹션에서 자세히 알아볼 수 있습니다.
새 번들을 생성하든 타사 번들을 사용하든 다음을 수행해야 합니다. 번들이 registerBundles()
가 활성화되어 있는지 확인하세요. generate:bundle
명령을 사용하면 Symfony가 이를 등록합니다.
#🎜🎜#번들 디렉터리 구조 ¶
#🎜🎜# 번들 디렉토리는 간단하고 유연합니다. 기본적으로 번들 시스템은 모든 Symfony 번들에서 코드 일관성을 유지하기 위해 일련의 명명 규칙을 따릅니다. 번들의 가장 일반적인 요소 중 일부가 포함된 AcmeDemoBundle을 살펴보십시오. #🎜🎜##🎜🎜#Controller/
# 🎜🎜# #🎜🎜#번들의 컨트롤러(예: `RandomController.php`)가 있습니다. #🎜🎜##🎜🎜#DependencyInjection/
#🎜🎜##🎜🎜#서비스 구성 정보를 가져오고 컴파일러를 등록하는 데 사용되는 특정 종속성 주입 확장 클래스가 있습니다. 등이 있습니다(이 디렉토리는 필수가 아닙니다). #🎜🎜##🎜🎜#Resources/config/
#🎜🎜##🎜🎜# 라우팅 구성(`routing.yml` 등)을 포함한 구성 정보를 저장합니다. #🎜🎜##🎜🎜#리소스/뷰/
#🎜🎜##🎜🎜# 스토어 템플릿. 컨트롤러 이름(예: `Hello/index.html.twig`)으로 하위 폴더를 구성합니다. #🎜🎜##🎜🎜#Resources/public/
#🎜🎜##🎜🎜# 다음을 통해 가져올 웹 자산 리소스(이미지, CSS 등)를 저장합니다. 하드 카피 또는 심볼릭 링크 프로젝트의 `web/` 디렉토리로 이동하여 콘솔 명령 `assets:install`을 사용합니다. #🎜🎜##🎜🎜#Tests/
#🎜🎜##🎜🎜# 이 번들의 모든 테스트 클래스를 저장합니다. #🎜🎜##🎜🎜##🎜🎜#번들은 구현하는 기능에 따라 작을 수도 있고 클 수도 있습니다. 여기에는 필요한 파일만 포함되어 있으며 그 외에는 아무것도 포함되어 있지 않습니다. #🎜🎜##🎜🎜#중국어 가이드를 읽으면서 개체를 데이터베이스에 유지하는 방법, 양식을 생성 및 검증하는 방법, 프로그램에 번역 기능을 추가하는 방법, 테스트 작성 방법 등을 배우게 됩니다. 이들 모두는 번들을 기반으로 하며 자체 디렉토리와 기능을 가지고 있습니다. #🎜🎜##🎜🎜#