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

评论 (2)