首頁 後端開發 php教程 Symfony2学习笔记之插件格式分析_php实例

Symfony2学习笔记之插件格式分析_php实例

Jun 07, 2016 pm 05:08 PM

本文讲述了Symfony2的插件格式。分享给大家供大家参考,具体如下:

一个bundle类似于其它框架中的插件,但是比插件表现更好。它跟其它框架最主要的不同是在Symfony2中所有东西都是bundle,包括核心框架功能和你写的所有应用程序代码。Symfony2中,bundle可是一等公民。这给了你使用其它第三方开发的内容包或者分发你自己的bundle更多灵活性。你可以方便的选择哪些内容可以应用到你的程序中那些不用,来根据你的想法优化它们。

一个bundle就是一个目录,它具有很好的结构性,它能存放从类到controller和web资源等任何东西。

一个bundle仅仅是一个结构化的文件目录集合,它实现一个单一的内容。

你可以创建一个BlogBundle,一个ForumBundle或者一个实现用户管理的bundle(好像已经有很多此类开源的bundle了)。每个bundle目录包含跟实现内容有关的所有东西,包括PHP文件,模板,样式表,javascript文件,测试内容以及其它任何相关的东西。要实现的内容的各方面都保存在一个bundle中。

一个应用程序是由在AppKernel类中registerBundles()方法里定义的所有bundle组成。

// 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;
}

登入後複製

在这里你可以通过该方法来统一控制和管理你的应用程序组成。

一个bundle可以存放在任何目录下,只需要能够通过配置app/autoload.php文件中的自动加载器即可被自动加载。

创建一个bundle

Symfony2标准版中已经为你准备好了一全功能的创建bundle的工具文件。你可以运行它来创建bundle的所有内容,当然你也可以

选择自己手工创建。现在我们创建一个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

登入後複製

如果你使用上面的命令行工具,则创建的bundle会自动的注册到appKernel类中。

Bundle的目录结构

看一下我们Symfony2自带的Demo bundle的目录结构:

bundle的目录机构简单灵活,从上面的截图中可以看到:

Controller/ 包含bundle的所有controllers文件,比如HelloController.php 。
DependencyInjection/ 保存了特定的依赖注入扩展类,该类可能会导入服务配置,注册编译器传输或者更多其它。该目录并不是必需的。
Resources/config/ 存放着配置文件,包括路由配置(比如:routing.yml)。
Resources/views/ 所有的模板被按照对应controller的名字分成文件夹保存在这里。比如Hello/index.html.twig 。
Resources/public/ 所有可访问的web资源(图片,样式表等)和通过assets:install控制台命令拷贝或者异步链接到项目 web/ 目录的内容。
Tests/ 保存bundle所有的测试

下面是Symfony2 推荐的一些有关bundle的标准规则:

Bundle名称:

一个bundle同时也是一个PHP的命名空间。命名空间必须遵守PHP5.3命名空间和类名的内部技术标准。开头使用提供商名,接着是分类段(可以省略),最后是命名空间的简写名字,而且该名字必须以Bundle作为后缀。一个命名空间变为一个bundle只需要你在该命名空间内添加一个bundle类即可。

Bundle类的命名:

仅适用数字,字母和下划线
使用驼峰式命名
使用描述性简洁的名字(不超过两个单词)
使用供应商名称做前缀(可选的分类命名空间)

添加Bundle作为名称后缀

比如:

Namespace => Bundle 类名称

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

登入後複製

定义bundle类时的getName()方法应该返回类名称。

每个bundle都有一个别名,它是小写字符简写版的bundle名,使用下划线分割。比如 acme_hello 的bundle原名是AcmeHelloBundle, acme_social_blog 则是Acme\Social\BlogBundle的实例。

别名在一个bundle中必须是唯一的。

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框架的PHP程序设计有所帮助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

See all articles