이 글에서는 Symfony2의 플러그인 형식을 주로 소개하고, Symfony2의 플러그인 원리와 관련 플러그인 생성 및 사용 기술을 자세히 분석합니다. 도움이 필요한 친구들이 참고하면 좋을 것 같아요.
번들은 다른 프레임워크의 플러그인과 유사하지만 플러그인보다 성능이 더 좋습니다. 다른 프레임워크와의 주요 차이점은 핵심 프레임워크 기능과 사용자가 작성하는 모든 애플리케이션 코드를 포함하여 Symfony2의 모든 것이 번들이라는 것입니다. Symfony2에서 번들은 일류 시민입니다. 이를 통해 다른 제3자가 개발한 콘텐츠 패키지를 사용하거나 자체 번들을 배포할 수 있는 유연성이 향상됩니다. 귀하의 아이디어에 따라 프로그램에 적용할 항목과 최적화하지 않을 항목을 쉽게 선택할 수 있습니다.
번들은 매우 좋은 구조를 갖고 있으며 클래스부터 컨트롤러, 웹 리소스까지 무엇이든 저장할 수 있는 디렉터리입니다.
번들은 단일 콘텐츠를 구현하는 구조화된 파일 디렉터리 모음입니다.
BlogBundle, ForumBundle 또는 사용자 관리를 구현하는 번들을 만들 수 있습니다(이미 그러한 오픈 소스 번들이 많은 것 같습니다). 각 번들 디렉토리에는 PHP 파일, 템플릿, 스타일 시트, 자바스크립트 파일, 테스트 콘텐츠 및 기타 관련 항목을 포함하여 구현 콘텐츠와 관련된 모든 것이 포함되어 있습니다. 구현될 콘텐츠의 모든 측면이 번들로 유지됩니다.
애플리케이션은 AppKernel 클래스의 RegisterBundles() 메소드에 정의된 모든 번들로 구성됩니다.
// 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; }
여기서 이 방법을 사용하여 애플리케이션 구성을 균일하게 제어하고 관리할 수 있습니다.
번들은 어떤 디렉터리에나 저장할 수 있으며, app/autoload.php 파일에서 오토로더를 구성하여 자동으로 로드하기만 하면 됩니다.
번들 만들기
Symfony2 표준 버전은 모든 기능을 갖춘 번들 생성 도구 파일을 준비했습니다. 이를 실행하여 번들의 모든 콘텐츠를 생성하거나 수동으로 생성하도록 선택할 수도 있습니다. 이제 AcmeTestBundle을 생성하고 애플리케이션에서 작동하도록 만듭니다. 여기서 Acme는 가짜 공급자 이름이므로 자신의 조직이나 회사 이름으로 완전히 바꿀 수 있습니다.
먼저 src/Acme/TestBundle/ 디렉토리를 생성하고 새 파일 AcmeTestBundle.php
// src/Acme/TestBundle/AcmeTestBundle.php namespace Acme\TestBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class AcmeTestBundle extends Bundle { }
를 추가합니다. 그런 다음 이를 애플리케이션에서 사용할 수 있도록 하려면 AppKernel 클래스의 RegisterBundles() 메서드에 추가해야 합니다.
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... // register your bundles new Acme\TestBundle\AcmeTestBundle(), ); // ... return $bundles; }
지금은 아무것도 할 수 없지만 애플리케이션의 일부가 되었습니다.
Symfony2에서 제공하는 명령줄 도구를 사용하여 다음을 생성할 수도 있습니다.
$ php app/console generate:bundle --namespace=Acme/TestBundle
위 명령줄 도구를 사용하면 생성된 번들이 appKernel 클래스에 자동으로 등록됩니다.
번들 디렉터리 구조Symfony2와 함께 제공되는 데모 번들의 디렉터리 구조를 살펴보세요.
위 스크린샷에서 볼 수 있듯이 번들의 디렉터리 구조는 간단하고 유연합니다.
Controller/에는 HelloController.php와 같은 모든 컨트롤러 파일 번들이 포함되어 있습니다.
DependencyInjection/에는 서비스 구성을 가져오고 컴파일러 전송을 등록하는 등의 작업을 수행할 수 있는 특정 종속성 주입 확장 클래스가 있습니다. 이 디렉터리는 필수가 아닙니다.Resources/config/는 라우팅 구성(예: Routing.yml)을 포함한 구성 파일을 저장합니다.
Resources/views/ 모든 템플릿은 해당 컨트롤러의 이름에 따라 폴더로 구분되어 여기에 저장됩니다. 예를 들어 Hello/index.html.twig입니다.
Resources/public/ 접근 가능한 모든 웹 리소스(이미지, 스타일 시트 등) 및 자산:설치 콘솔 명령을 통해 프로젝트 web/ 디렉터리에 복사되거나 비동기적으로 링크된 콘텐츠.
Tests/는 번들의 모든 테스트를 저장합니다.
다음은 Symfony2에서 권장하는 번들에 대한 몇 가지 표준 규칙입니다.
번들은 또한 PHP 네임스페이스입니다. 네임스페이스는 네임스페이스 및 클래스 이름에 대한 PHP5.3의 내부 기술 표준을 준수해야 합니다. 처음에는 공급자 이름을 사용하고, 분류 세그먼트(생략 가능), 마지막으로 네임스페이스의 약식 이름을 사용하고, 이름 뒤에는 Bundle을 붙여야 합니다. 네임스페이스를 번들로 변환하려면 네임스페이스에 번들 클래스만 추가하면 됩니다.
번들 클래스 이름 지정:숫자, 문자 및 밑줄만 적용 가능
카멜 표기법 사용설명적이고 간결한 이름 사용(2단어 이하)
공급업체 이름을 접두어로 사용(선택적 카테고리 이름 지정) 공백)
예:
Namespace => 번들 클래스 이름Acme\Bundle\BlogBundle => AcmeBlogBundle
Acme\Bundle\Social\BlogBundle =>AcmeSocialBlogBundle
Acme\BlogBundle => AcmeBlogBundle
번들 클래스를 정의할 때 getName() 메서드는 클래스 이름을 반환해야 합니다.
각 번들에는 밑줄로 구분된 소문자 번들 이름의 축약된 버전인 별칭이 있습니다. 예를 들어 acme_hello 번들의 원래 이름은 AcmeHelloBundle이고 acme_social_blog는 AcmeSocialBlogBundle의 인스턴스입니다.
별칭은 번들에서 고유해야 합니다.Bundle 디렉터리 구조: 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('acme_hello.email.from', 'fabien@example.com');
INI格式:
[parameters] acme_hello.email.from = fabien@example.com
这样就可以在代码中从容器获取这些配置信息了:
$container->getParameter('acme_hello.email.from');
如果你定义服务,我们也推荐你使用bundle的别名作为前缀。
总结思考:
以上是关于Symfony2中最主要的插件格式bundle的大体情况,在整个Symfony2为基础开发的应用程序中,几乎全部都是有bundle组成。Symfony2本身的核心组件都是FrameworkBundle。在Symfony2交流社区中,已经有了大量的开发者贡献了他们的bundle,我们可以直接拿来集成到我们自己的应用程序中使用。上面所说的大部分规则,都是应用于你开发贡献bundle时应该遵循的统一规则,以方便其它用户使用。
带有第三方贡献的bundle的Symfony2开发包:
如果你不打算把你的bundle贡献出来,那么完全可以不用按照这里说的大部分规则进行开发。
相关推荐:
详解Symfony在模板和行为中取得request参数的方法
위 내용은 Symfony2 플러그인 형식에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!