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

评论 (写第一个评论)