1.1 Examples模块,Symfony,控制器
Drupal 8 模块开发为何如此不同?
Drupal 8 实现自身的现代化变化是有必要的,以便更有效的利用通用标准,保持与其它现代化框架的竞争力。
本课学习内容
- 学习 Examples 捐赠项目,Symfony PHP 框架,控制器和路由。
- 构建 examples/page_example 模块。
- 探讨怎样为 page_example 模块创建 *.info.yml 文件,*.routing.yml,Controller.php 和 *.links.menu.yml 文件。
Drupal 8 和 Examples 模块
在探索 Drupal 8 的各种模块开发能力时我们会用到 Examples 项目,主要利用其中的 page_example 模块。
确保下载 8.x 版本,解压备用。
什么是 Symfony ?
注意:
Drupal 8 并未使用 MVC 架构模式,它只实现了控制器编程模型。
为什么使用 Symfony ?
Symfony 引入的一个最有用的工具是能够根据位置自动加载代码。
现在 Drupal 开发者无需再创建一个完整的 include 文件,只一个 use 行便可包含可重用代码。
Drupal 是一个 PHP 应用,Symfony 是有可用库的 PHP 框架,在 Drupal 核心内使用 Symfony 既有益处也有风险。
框架的改变可能会增加有经验创造者的数量,尤其是那些 PHP 开发者,他们可以很容易的过渡到 Drupal ,为此积极学习、利用这个项目。但对于 Drupal 社区内精通 Drupal 而对现代化的 PHP 技术欠缺的这些人可能会形成门槛。
理想情况下,通过创建有用的学习工具和彼此分享培训信息会解决这些风险,为之前社区内的 Drupal 开发者降低门槛。
什么是控制器?
对于习惯了之前 Drupal 7 那种过程式开发(虽然部分内容使用了 OOP 方法)的人来说,控制器这个概念可能略有挑战性。
一个控制器就是一个 PHP 函数,用于处理 HTTP 请求(HTTP request),构造并返回一个 HTTP 响应 (HTTP response,比如 Symfony Responseobject)。响应可以是一个 HTML 页面,一个 XML 文档, 一个序列化的 JSON 数组,一个图片,一个重定向,一个 404 错误或者任何你能想到的东西。 控制器可以包含呈现页面内容的任何逻辑。
控制器等价于 Drupal 7 中hook_menu() 内的页面回调函数。你创建一个控制器类,定义一个方法显示页面数据。同样的,在 Drupal 7 中你会创建一个被 hook_menu() 中的 "page callback" 引用的函数,显示这个页面数据。
什么是路由,路由器?
Symfony 路由器允许你定义创造性地 URL,映射到应用的不同区域。一个路由是从一个 URL 路径到一个控制器的映射。
怎样创建第一个 Drupal 8 模块?
作为起点,我们基于 Examples 创建一个简单模块,现在大多数模块结构基于 YAML。
YAML 是一个人类友好的数据序列化标准,可以由任何编程语言实现。
- 创建目录
- 创建 page_example.info.yml 文件
- 创建 page_example.routing.yml 文件
- 创建 PageExampleController.php 文件
- 创建 page_example.links.menu.yml 文件
- 重构缓存
- 测试
设置目录
首先我们必须创建文件和目录结构,使 Drupal 8 意识到这个模块。
Drupal 7 最少需要有 .info
和 .module
文件。Drupal 8 需要的更少,只需要有 YAML 版本的 .info 文件,叫做 .info.yml
,它里面包含 Drupal 8 能够识别的数据结构。
一个主要的变化是自定义和捐献模块被放在了 Drupal 根下(modules/[directory]
)。
所有核心代码被移到了一个单独(
的目录里。core/
)
在模块(modules/
)目录,还是像 Drupal 7 那样被推荐把自定义和捐献模块分开放置。
在 Drupal 8 的文档根目录,完成以下几步:
- 导航到
/modules
目录 - 创建目录
examples
- 进入这个新目录
cd examples
- 创建目录
page_example
,这个将对应 Examples 项目,模块名叫page_example。
- 进入新目录
cd page_examples
本课我们不会安装实际的 Examples 模块,而是使用它的代码片断创建一个简单的“Hello world”模块,目的在于向大家一步步地展示构建模块的过程。
创建 info.yml 文件
现在你已经在正确的目录位置,是时候创建 .info 文件了。
- 创建
page_example.info.yml
- 文件内增加代码,见辅助内容区
type 是需要的新属性,可以设置为 module 或 theme (主题也需要 *.info.yml
文件)。
如果你对 Drupal 7 熟悉,你应该知道其他属性的含义。
你可以查看 Drupal 8 documentation page 了解更多可以在 .info.yml 使用的 key|value
,以及相关的变更记录。
现在去 Drupal 站点的 Extend 页面,激活“Page example
”模块。
在激活模块之前不需要创建 .module 文件,我们希望最终的 *.module
文件尽可能的小,功能性代码应该尽可能的放置在 service、控制器和插件等面向对象结构内。
name: 'Page example'
type: module
description: 'An example module showing how to define a page to be displayed at a given URL.'
package: 'Example modules'
core: 8.x
创建 routing.yml
现在我们将为新模块创建菜单。