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

评论 (写第一个评论)