1.2 菜单

hook_menu() 和它的回调函数发生了什么?

Drupal 8 龦龣hook_menu() 龊龆龃龁齾齽齻齹 YAML 齫齧齤

YAML 齫齧

齣齠

modulename.routing.yml

齑齐 URL 齍齊齈齆齄齁齀鼾鼼鼺鼷龊鼳

modulename.links.menu.yml

齑齐鼬鼫鼪鼾鼨鼦鼳

modulename.links.action.yml

鼟鼞 Drupal 7 鼾鼚鼗 MENU_LOCAL_ACTION 鼳

modulename.links.task.yml

鼟鼞 Drupal 7 鼾鼚鼗 MENU_DEFAULT_LOCAL_TASK 鼳

Drupal 8 黹黶黲黱黰 Symfony2 components 黦黤齍齊黠黜黚默黗黕鼾齍黓龣黑黍齀黉黅黂鼳

  1. 黀麿麻齹麹麸麵 page_example 麲龣麮麫 page_example.routing.yml 齫齧鼳
  2. 麨麦麢麟龣麛麚麘麖麒麎鼳

麍麌麋麈麇麄麃鼾齍黓 page_example_description 齤

  • page_example_description齤 齽 Page example 鹿鹽麄麃麻齹鹺齍黓鼳
  • path齤 齍黓鹶鹵鼾齍齊龣鼟鹱鹰 Drupal 7 黹 hook_menu() $items[] 齀鹣鼾 key鼳 鹠鹜鹛鹗鹖鹓鹒龣鹏鹍鹉鹇鹃齫鸿 structure of routes
  • _controller齤 麄麃齍黓鼾齍齊鸾鸼 PageExampleController 黜黚默鼾 description 黗黕鼳
    _content 鸸齽 _controller 鸴齹鸳鸱鸯鸫龣鸴黱 Drupal 8 鸪 Symfony 鸩麿鸦鼳
  • requirements齤黰鸟鸜鸘鸕鸓鸴齹鸑麇鸎鸊鸯鼾鸉鸅鼳

鸄黱黰鸂鷿鼾齍黓鷼鼪龣鹉鹇鹃 Structure of routes 齫鸿鸑鼳

page_example_description:
  path: '/examples/page_example'
  defaults:
    _controller: '\Drupal\page_example\Controller\PageExampleController::description'
  requirements:
    _access: 'TRUE'

page_example_simple:
  path: '/examples/page_example/simple'
  defaults:
    _controller: '\Drupal\page_example\Controller\PageExampleController::simple'
  requirements:
    _permission: 'access simple page'

构建控制器

Page example 鼾黜黚默鷺 PageExampleController龣龦麇鸯齹 description() 黗黕龣黰鸟鹉鷷鸴齹鸑麇鷳鷯龃齄黰鼳

注意:

在模块里,采用了部分 PSR-4 标准,控制器和其他类被要求放在 src/ 目录。 Drupal 的其他部分使用了较长的文件路径,使用的是PSR-0 标准。 如果你看到捐献模块的代码还放在 lib/ 目录,那是 PSR-0,之前的 Drupal 8 进化版本遗留下来的产物, 应该被移动到 src/ 目录。

  1. 黀鹿鹽麹麸麮麫鷫鷪黜黚默鼾麹麸 src/Controller鼳
  2. 麮麫黜黚默齫齧 PageExampleController.php 鼳
  3. 黀齫齧麖鷥鷢 PageExampleController 黜黚默鷞龣麛麚麘麖麒麎

PageExampleController 鷞龦鸯鷜齹齁齀齤

  • description() 齁齀齤 鷙齆麻齹鷞鷕 Drupal 7 鼾鷔鷑鷏齀鹣龣鸴龦黰黠鷋 URL::fromRoute 黗黕鼳
  • simple() 齁齀齤 鷙齆鷋麻齹 HTML 鼾鷃鷀鼳

鶽鹰鶺黰鶷龣鸴鶴黶黲鹜鶲齫鶯黅黂黀麹鷃 URL 麖鸎鹠鹜鶭鼾鶬鶫麢麟鼳
麢麟黹鼾鶧 8 黍麄麃鷋鷞鼾鶦鶥鶡鶟龣鶦鶥鶡鶟鶝鶜黀鶘鶕鶓黗黱黰鸴齹鷞鼳

<?php

/**
* @file
* Contains \Drupal\page_example\Controller\PageExampleController.
*/

namespace Drupal\page_example\Controller;

use Drupal\Core\Url;

/**
* Controller routines for page example routes.
*/
class PageExampleController {
  /**
   * Constructs a page with descriptive content.
   *
   * Our router maps this method to the path 'examples/page_example'.
   */
  public function description() {
    $simple_url = Url::fromRoute('page_example_simple');
    $simple_link = \Drupal::l(t('simple page'), $simple_url);

    $arguments_url = Url::fromRoute('page_example_description', [], ['absolute' => TRUE]);
    $arguments_link = \Drupal::l(t('arguments page'), $arguments_url);

    $build = [
      '#markup' => t(
        '<p>The Page example module provides two pages, "simple" and "arguments".</p>'
          . '<p>The !simple_link just returns a renderable array for display.</p>'
          . '<p>The !arguments_link takes two arguments and displays them, as in @arguments_url</p>',
        [
          '!simple_link' => $simple_link,
          '!arguments_link' => $arguments_link,
          '@arguments_url' => $arguments_url->toString()
        ]
      ),
    ];

    return $build;
  }

  /**
   * Constructs a simple page.
   *
   * The router _controller callback, maps the path 'examples/page_example/simple'
   * to this method.
   *
   * _controller callbacks return a renderable array for the content area of the
   * page. The theme system will later render and surround the content with the
   * appropriate blocks, navigation, and styling.
   */
  public function simple() {
    return [
      '#markup' => '<p>' . t('Simple page: The quick brown fox jumps over the lazy dog.') . '</p>',
    ];
  }

}

鷥鷢鷋鶦鶥鶡鶟鶑龣黶黲鶍鷔鹛鶋鶇 use 鶄鶂鵾鵺鵶鸴鵳鷞龣鹛鶍黱黰鵱黲鼾黗黕鼳

PHP 中的名字空间

“尽管名字空间可以包含任何有效的 PHP 代码,但名字空间只会影响以下代码类型: 类(包括 abstracts 和 traits 类),接口,函数和常量。 名字空间使用 namespace 关键字进行声明。 包含名字空间的文件必须在文件的顶部、任何其他代码(declare 关键字除外)之前进行名字空间的声明。” Defining Namespaces

怎么知道名字空间和 use 操作符的路径?

鶘鶺龣鶦鶥鶡鶟鵰鶴齫齧鸎黀鵭鷪鼾齍齊龣鵫鶑黱黰鸴齹鶂齽 use 鶄鶂鵾黱黰鼾鵩鶦鼳

鷞齫齧鷞鷕鸴鵦齤


namespace Drupal\page_example\Controller;

鵟麻齹鹜黱黰鵱鼾齫齧鸴鵦齤


use Drupal\page_example\Controller

鵫鶑鵜鵰鷔鹛黱黰 Controller 麹麸麋鼾齫齧鷋鼳

使用 use 操作符

“使用别名引用外部的一个完全限定名是名字空间的重要特征。 这类似 unix 文件系统中为文件或目录创建符号链接一样。 PHP 中别名通过 use 操作符完成。” Using namespaces: Aliasing/Importing

菜单链接

Drupal 7 黹黱黰 hook_menu() 鼦麫鼬鼫鵙鵕鼳鵓黀鵑鵎鸴鵍黦黤鷋龣鵋鶴鶋鶇 yml 齫齧鵈鷪鼳

构建链接

黶黲鵓黀黀 Drupal 鵄黤鵂麇鼾 Reports 鼬鼫麋麮麫麻齹鼬鼫鵙鵕鼳
鵀鴿黶黲鹠鹜黀鹿鹽鼾鴼麹麸麋麮麫 page_example.links.menu.yml 齫齧龣黀龦麇麄麃鼬鼫鼾鵙鵕齈鵭鷪鼳

  1. 黀鹿鹽麹麸麮麫 page_example.links.menu.yml
  2. 鴺麦麢麟黠齫齧麖龣麛麚麘麖麒麎

鵀鴿黶黲麄麃鷋鼬鼫鵙鵕鼾鴹默鶦龣鵕麋鴷鶴鼬鼫鼾鷃鴴齈鼬鼫黱黰鼾齍黓麵鴹默鶦麲龣鶬鶑鶴鼬鼫鼾 parent麵鴲麄鼬鼫鼾鵭鷪麲鼳

parent 鼾鴯鶴鴫鼬鼫鵙鵕鴹默鶦龣鴩麄鸴齹鹠鹜鸾 *.links.menu.yml 黑黍鵳齄鹇鼳鵄黤鵂麇鼬鼫麄麃黀鴤鴡 System 鹿鹽麖龣鴝鴙鹠鹜鹇鹃 system.links.menu.yml 齫齧鴷鴩麄鸴齹鴯鼳

鵓黀鴗鶡鴓鴏龣鴎鹓 http://example.com/admin/reports 鸑麇龣鵜鷯鹃黠麨麦鼾鵙鵕鼳

page_example.description:
  title: 'Page Example'
  route_name: page_example_description
  parent: system.admin_reports
page_example.simple:
  title: 'Simple - no arguments'
  route_name: page_example_simple
  parent: system.admin_reports

清空缓存

鴍鴊鹜鶋鶇鴇鴄黍鴃麫 Drupal 8 鴀鳽鳺鴗鶡鴓鴏龣鹠鹜黱黰鶬鹺鳶鶯鼾 drush齤 drush rc

评论 (写第一个评论)