你在这里

Drupal8 的路由和控制器的示例

原文地址:

最后更新于2014年8月17日

你的模块或许只是想在网站指定的路由提供一个功能或仅仅是为了修改或增强已有函数的功能。如果你仅仅是修改或扩展已有功能,你可能没有必要了解路由。可是,如果你想在网站中展示自己的内容或功能,那么路由是模块编写的一个重要环节。下面快速介绍一下路由相关的信息。

基于模块的*.routing.yml文件定义模块的请求行为,其他文件名格式是基于模块名来定义,如example模块的路由文件名为: example.routing.yml.定义了当请求一个路径时Drupal是如何处理的:

example.content:
  path: '/example'
  defaults:
    _content: '\Drupal\example\Controller\ExampleController::content'
    _title: 'Hello World'
  requirements:
    _permission: 'access content'

这个告诉了Drupal8,这个命名为’example.content’(模块名为前缀)的路由已被定义并绑定到了网站的’/example’ 这个URI上。当该路径被访问时,’access content’权限将会启用检查用户的权限,如果有权限,那么ExampleController::content方法将会被调用并展示其内容结果,标题为’Hello’.

如果你使用过Drupal7的菜单构建系统,这里非常相似于Drupal7里面的hook_menu()。(可是,路由系统是不负责管理tabs, actoin links和contextual links)。

ExampleController.php

创建页面的第二部分是输出我们的内容以代替路由中控制器。这些代码可以是PHP4风格函数,但在Drupal8中最佳实践是用控制器类。这个类是严格按照路由文件提供的控制器名来命名类名的,ExampleController.php

Drupal8是使用PSR-0类加载规范来初始化的,然后转向了PSR-4规范。这里可以查看PSR-4相关的版本或修订日志:

PSR-4: Putting it all together
 

PSR-4的细节超出了本章内容范围,但可以查看PSR-4在Drupal8中的命名空间和自动加载方式以了解更多细节。

PSR-4 namespaces and autoloading in Drupal 8
 

上述所说的控制器文件应该被放置到example/src/Controller目录下,并以ExampleController.php文件命名。因此文件的全路径名称看起来应该是这样:

example/src/Controller/ExampleController.php.

内容如下:

<?php
/**
 * @file
 * Contains \Drupal\example\Controller\ExampleController.
 */
namespace Drupal\example\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ExampleController extends ControllerBase {
  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler')
    );
  }
  /**
   * {@inheritdoc}
   */
  public function content() {
    $build = array(
      '#type' => 'markup',
      '#markup' => t('Hello World!'),
    );
    return $build;
  }
}
?>

使用这个路由文件,我们可以在网站上输出一个标题为'Hello World'的可用页面。