Drupal 8 模块开发 1.1 : Examples 模块,Symfony,控制器

蒲公英 提交于 周四, 08/17/2017 - 11:31
Drupal8模块开发

原文地址:
https://docs.acquia.com/articles/examples-module-symfony-controllers-and-menu  

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 版本的 Examples 项目 ,解压备用。

Symfony

什么是 Symfony ?
Symfony 是一个 PHP 框架,整合了很多重用的最佳实践,帮助开发者快速构建 PHP 应用。

Drupal 8 的路由和控制器是使用 Symfony 的路由和控制器构建的 。(当然 Symfony 的这些代码并不是专门为 Drupal 开发,而是按照通用标准实现的。)
Drupal 8 废弃了 Drupal 7 那种过程式编程,实现了面向对象架构,更具灵活性。 这种灵活性的提高,部分也得益于采用 Symfony 框架作为其核心的一部分。(Symfony 有二十多个独立库,可以应用于任何 PHP 项目。)

注意:
Drupal 8 并未使用 MVC 架构模式,它只实现了控制器编程模型。

为什么使用 Symfony ?
Symfony 引入了一个比较有用的功能 --- 根据位置自动加载代码。 现在 Drupal 开发者无需创建完整的 include 文件,只一个 use 行便可包含可重用代码,这个自动加载是通过 Symfony ClassLoader 组件实现的。

Drupal 是一个 PHP 应用,Symfony 是具有可用库的 PHP 框架,在 Drupal 核心内使用 Symfony 既有益处也有风险:
框架的改变可能会增加有经验开发者的数量,尤其是那些 PHP 开发者,他们可以很容易的过渡到 Drupal。 但对于 Drupal 社区里精通 Drupal 而对现代化的 PHP 技术欠缺的这些人可能会形成门槛。理想情况下,通过创建有效的学习工具,彼此分享培训信息会解决这些风险。

什么是控制器?
对于习惯了 Drupal 7 那种过程式开发的人来说,控制器这个概念可能略有挑战性。

一个控制器就是一个 PHP 函数,用于处理 HTTP 请求、构造并返回一个 HTTP 响应。
响应可以是一个 HTML 页面,一个 XML 文档、一个序列化的 JSON 数组、一个图片、一个重定向、一个 404 错误或者任何你能想到的东西。
控制器可以包含呈现页面内容的任何逻辑。

控制器等价于 Drupal 7 中 hook_menu() 里的页面回调函数。在 Drupal 8 里,你创建一个控制器类,定义一个方法显示页面数据。同样的,在 Drupal 7 中你会创建一个显示页面数据的函数,之后这个函数被 hook_menu() 中的 "page callback" 引用。

什么是路由,路由器?
Symfony 路由器允许你定义映射到应用不同区域的 URL。一个路由是从一个 URL 路径到一个控制器的映射。

怎样创建第一个 Drupal 8 模块?

作为起点,我们基于 Examples 创建一个简单模块。 现在大多数模块结构基于 YAML,YAML 是一个人类友好的数据序列化标准,可以由任何编程语言实现。

  1. 创建目录
  2. 创建 page_example.info.yml 文件
  3. 创建 page_example.routing.yml 文件
  4. 创建 PageExampleController.php 文件
  5. 创建 page_example.links.menu.yml 文件
  6. 重构缓存
  7. 测试

创建目录
首先、我们必须创建文件和目录结构,使 Drupal 8 知道你的模块。
Drupal 7 至少需要有 .info 和 .module 文件。Drupal 8 需要的更少,只需要有 YAML 版本的 .info 文件,叫做 .info.yml,它里面包含 Drupal 8 能够识别的数据结构。

一个主要的变化是自定义和捐献的模块被放在了 Drupal 根下(modules/[directory])。所有核心代码被移到了一个单独的(core/)目录里。在模块(modules/)目录,还是像 Drupal 7 那样被推荐把自定义和捐献模块分开放置。

在 Drupal 8 的 docroot,完成以下几步:

  1. 导航到 /modules 目录
  2. 创建目录 examples
  3. 进入这个新目录
    cd examples
  4. 创建目录 page_example,这个将对应 Examples 项目,模块名叫 page_example。
  5. 进入新目录
    cd page_examples

本课我们不会安装实际的 Examples 模块,而是使用它的代码片断创建一个简单的“Hello world”模块,目的在于向大家一步步地展示构建模块的过程。

创建 info.yml 文件
现在你已经在正确的目录位置,是时候创建 .info 文件了。

  1. 创建 page_example.info.yml
  2. 文件内增加以下代码
    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

type 是需要的新属性,可以设置为 module 或 theme (主题也需要 *.info.yml 文件)。
如果你对 Drupal 7 熟悉,你应该知道其他属性的含义。

你可以查看 Drupal 8 documentation page 了解更多可以在 .info.yml 使用的 key|value,以及相关的变更记录。

现在去 Drupal 站点的 Extend 页面,激活“Page example”模块。
在激活模块之前不需要创建 .module 文件,我们希望最终的 *.module 文件尽可能的小,功能性代码应该尽可能的放置在 service、控制器和插件等面向对象结构内。

创建 routing.yml
下一节我们将为新模块创建菜单。