欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Drupal 8 开发:控制器与路由 有大用

学习一下 Drupal 8 的开发,创建自定义模块与主题。

代码仓库:https://github.com/ninghao/drupal-8-dev-module-demo

准备
1)创建一个模块

创建自己的 Drupal 模块,我们先要让 Drupal 知道我们的模块。自己创建的模块可以放在项目根目录下的这个 modules 目录的下面。在这个目录的下面,创建一个新的目录 .. 名字可以是模块的名字 .. 比如我要创建一个演示的模块,它的名字可以是 ninghao_demo ..

这个名字就是模块的机器名,也就是在 Drupal 内部使用的名字。

Drupal 8 需要通过一个 info.yml 的文件了解一个模块 .. 在这个新的目录的下面,再创建一个 info.yml .. 名字是 ninghao_demo.info.yml .. yml 是一种简单的数据格式 ..

在这个文件里,我们可以描述一下自己的模块 .. 使用名值对的形式 .. 比如模块的名字,要用一个 name .. 冒号的右边就是我们给这个模块起的名字 ..

另起一行,再添加一个 description ,描述一下这个模块 .. 输入一小段描述的文字 .. 再用一个 type .. 设置一下这个东西的类型 .. 我们要创建的是一个模块,所以 type 的值应该就是 module ..

可以再添加一个 package .. 它有点像是模块的分组 .. 这里设置成 Custom ,表示这是一个自定义的模块 ..

然后再用一个 core .. 设置一下这个模块适用的 Drupal 版本 .. 这里我们可以把它设置成 8.x .. 意思是这个模块是用在 Drupal 8 上面的 ..

在这个描述的文件里,我们还可以添加一些其它的信息,比如这个模块依赖的东西,它的版本等等 .. 以后用到的时候,我们再回来编辑这个文件 .. 保存一下 ..

回到 Drupal 的管理后台 .. 打开扩展 .. 在自定义这个区域里,可以找到这个模块 ..

勾选一下它,再点一下 安装 ...

控制器与路由
2)控制器

我们先在自己的模块里去添加一个自定义的页面,页面上的内容可以用一个控制器返回,页面的地址可以使用一个路由。先找到自己创建的这个模块 .. 添加一个控制器 .. 把它放在模块下面的 src 这个目录的下面 Controller 这个目录的里面 .. 然后给控制器起个名字,比如 NinghaoDemoController.php

在这个控制器类里面,添加一个命令空间 .. 控制器类要继承 Drupal 的 ControllerBase,先使用一下它 .. 位置 是 Drupal\Core\Controller

namespace Drupal\ninghao_demo\Controller;
use Drupal\Core\Controller\ControllerBase;

然后再去定义一个控制器类 .. 名字是 NinghaoDemoController 继承一下 ControllerBase .. 因为上面用了 use,所以这里可以直接使用这个类的名字 ..

在这个类里面我们再去定义一个方法,这个方法可以返回页面的内容 .. 添加一个公开的方法 .. 名字可以随便定义 .. 比如我们叫它 page_content ..

方法返回一个数组 .. 添加一个 #markup .. 它的值就是页面上的内容 .. 用一个 Drupal 的 t 函数 .. 然后再添加点文字 .. 这个 t 函数可以让我们把它里面的字符串翻译成多个语言版本 ..

保存一下这个控制器 ..

3)路由

我们再去创建一个路由,在这个路由里设置一下页面的地址,使用的控制器方法,还有页面的标题等等 .. 在我们自己的模块的根目录下 .. 创建一个路由配置文件 ..

名字可以是 ninghao_demo.routing.yml .. 路由文件都是用 .routing.yml 结尾的 .. 在这个文件里先添加一个路由的名字 .. 这里我把它设置成 ninghao_demo.custom_page

另起一行,缩进两个字符 .. 再添加一个 path ,设置一下这个路由的地址 .. 比如我想让它的地址是 /custom_page ..

再添加一个 defaults 属性 .. 它的下面,用一个 _controller ,指定一下使用的控制器 .. 这里就是之前我们自己创建的那个控制器 .. 位置是 \Drupal\ninghao_demo\Controller\NinghaoDemoController .. 再指定一下控制器里的某个方法 .. page_content 是 NinghaoDemoController 控制器里面返回页面内容的方法 ..

另起一行,设置一下页面的标题 .. 用一个 _title 属性 .. 标题设置成 自定义页面 ..

下面再设置一下这个页面的一些需求,比如访问的权限 .. 用一个 requirements .. 另起一行,再添加一个 _permission .. 访问的权限设置成 access content ... 这样拥有可以访问内容权限的用户就可以看到这个页面的内容了 ..

保存一下 .. 我们可以再去清空一下 Drupal 的缓存  清空缓存 重建缓存 .. 使用 drush 可以这样 .. 在项目下面,执行一下 drush cache-rebuild ..

或者也可以在 Drupal 管理后台 .. 配置 - 性能 这个界面下清空 Drupal 的缓存 ...

完成以后,访问一下我们在自己创建的模块里定义的这个页面 ... 地址就是在路由配置里面的 path 属性里指定的 /custom_page ..

现在你看到的就是这个自定义页面的内容 .. 有页面的标题 .. 还有在控制器的方法里返回的内容 ..

4)路由里的参数

在路由里面我们可以包含一些参数,这样在控制器里可以接收到这些参数,你可以使用这些参数去做一些事情,比如根据参数的值在数据库里查询出不同的内容等等 ..

在路由里添加参数可以这样 .. 打开这个路由的配置文件 .. 在 path 这里设置的是路由的地址 .. 在它的后面,我们可以再加上一个参数 .. 用一个斜线分隔一下 .. 然后是一组花括号 .. 它里面就是参数的名字 .. 比如 page_id

这样这个 page_id 参数的值可以传递到控制器的方法里面来用 .. 找到控制器 .. 在这个控制器方法里添加一个参数 .. 名字是 $page_id

然后我们可以去用一下它 .. 在这行字符串里添加一个 @page_id .. 在这个 t 方法的第二个参数里可以指定一下 @page_id 表示的是什么 .. 用一个数组 .. 先是 @page_id .. 对应的值就是从路由那里传递过来的 page_id 这个参数的值 ..

保存 .. 重建一下缓存 ..

回到浏览器 .. 访问一下这个自定义页面 .. 后面加上一个参数 .. 比如斜线 3 .. 你会看到,在页面上会显示这个参数的值 ..

再试一下 .. 访问 custom_page/6 ... 页面上同样会显示这个参数的值 ..

5)路由的需求

在创建路由的时候,我们用了一个 requirements ,它的下面必须有一项东西要返回 true ,不然用户访问这个页面的时候就会返回 403 ,没有权限 ..

这里我们用了一个 _permission: 设置了一下访问这个路由需要的权限 ... 权限的名字是 access content ,表示查看已经发布的内容 ...

用户的权限可以在 用户 权限下面去设置 ..

另外还有一些选项 .. 比如你只想让登录的用户才能访问 .. 可以再用一个 _user_is_logged_in .. 设置成 true ..

保存 .. 重建缓存 ..

回到浏览器 .. 先试一下不登录访问这个自定义的页面 .. 提示没有权限 .. 再登录一下 .. 可以先去创建一个新的用户 .. 打开 用户 .. 添加用户 .. 输入邮件的地址 .. 用户名 .. 密码 .. 保存一下 ..

再回过来 .. 使用刚才创建的用户登录一下 ..

然后再访问一下这个自定义页面 .. 现在就可以正常显示它了 ..

在这个需求里面我们也可以设置一下路由参数的类型,比如我只想让这个路由里面使用的 pgae_id 这个参数的值是数字 .. 可以在这里添加一个 page_id .. 它的值用一个正则表达式 .. page_id: '[0-9]+'

保存 .. 重建一下缓存 .. 回到浏览器 ..

刷新一下 .. 现在这个路由参数的值是数字 ... 所以可以正常的显示 .. 再换成一个单词 .. 会提示没找到页面 .. 因为我们限制了路由里的 page_id 这个参数的值必须得是数字 ..

6)为模块配置添加菜单链接

我们可以为模块创建一个配置页面,然后在管理后台的某个地方放一个菜单,用户打开这个菜单可以显示模块的配置界面。先在模块的控制器里创建一个方法 .. 名字可以是 admin_page ..

方法返回页面的内容 .. 是一个数组 .. 里面用一个 #markup .. 内容是 自定义模块的配置界面 ..

再打开路由的配置 .. 添加一个新的路由 .. 名字是 ninghao_demo.admin .. 设置一下路径 .. 用一个 path .. 位置是 /admin/config/development/ninghao_demo ,这个就是模块的管理界面的地址 ..

在 defaults 里面设置一下使用的控制器 .. 用一下 NinghaoDemoController::admin_page .. 添加一个 title .. 设置一下页面的标题 .. 自定义模块 .

再设置一个基本的需求 ..

requirements:
_permission: 'access content'

然后去创建一个菜单配置文件 .. 放在模块的根目录的下面 . . 名字可以是 ninghao_demo.links.menu.yml ..

设置一下菜单的名字 .. 比如 ninghao_demo.admin .. 菜单的标题,使用一下 title 来设置 .. 开发演示 ..

再用一个 description ,设置一下菜单的描述 ..

然后用一个 parent .. 它设置的是这个菜单的位置 .. 比如我要把这个模块的菜单放在 配置,开发 这个区域里面,在这里它就是 system.admin_config_development ..

如果你要把这个管理菜单放在别的地方,在这里需要调整一下 parent 属性的值 ..

然后用一个 route_name ,设置一下这个菜单的路由 .. 我们可以使用刚才创建的 ninghao_demo.admin 这个路由 ..

ninghao_demo.admin:
title: 开发演示
description: '宁皓网 Drupal 开发演示模块'
parent: system.admin_config_development
route_name: ninghao_demo.admin

保存一下 .. 再重建一下 Drupal 的缓存 .. 回到浏览器 .. 打开 配置 ... 在 开发 这个区域里面,可以找到我们为模块的管理界面添加的菜单 ...

打开它 .. 会显示模块的管理界面 .. 现在这里只有一个标题 .. 还有一小段文字 ..

权限
7)为模块添加权限

为模块添加一些权限,在模块内部我们可以使用它们去验证用户是不是有权限执行某些特定的动作。这些在模块里使用的权限可能放在一个文件里面 .. 在我们的自定义模块的根目录下面,创建一个新的文件 .. 名字是 ninghao_demo.permissions.yml ,模块的权限都要放在这个用 .permissions.yml 结尾的文件里面 ..

在这个文件里,可以添加一些权限,权限的名字我们要自己去定义 . 比如我想定义一个管理这个自定义模块的权限 .. 名字可以是 administer ninghao_demo: ..

另起一行,再去描述一下这个权限 .. 用一下 title 设置一下这个权限的标题 .. 也就是显示给用户看的 .. 管理 ninghao_demo 模块 ..

再用一个 description ,描述一下这个权限的作用 ... 允许用户管理这个模块 .. 保存 .. 下面我们可以去用一下这个权限 ..

打开这个路由的配置 .. 在这个 admin 路由里面, 设置一下它,让它使用刚才我们自己定义的权限 .. 也就是 administer ninghao_demo ..

保存 .. 重建一下 Drupal 的缓存 ..

回到管理后台 .. 打开 用户 .. 权限 .. 在这个权限的列表里面,可以找到我们为自己创建的模块定义的这个权限 ..

下面我们可以使用一个普通的用户,访问一下我们自己定义的模块的配置界面 .. 会提示没有权限 ..

再用这个管理员的身份,去访问一下这个配置界面 .. 可以正常打开 .. 因为默认管理员拥有所有的权限 .. 如果你想让普通的用户可以访问这个配置界面,可以在这个权限这里,为普通的注册用户,勾选一下这个 管理 ninghao_demo 模块的权限 ..

来自  https://ninghao.net/course/3676

 

 
普通分类: