十二月 11, 2018 | 後端和Drupal

【D8 教學】一次看懂Drupal 7 到 Drupal 8 Menu System的轉變

在Drupal 7 的環境下,我們常用hook_menu與hook_menu_alter來建立客製化的頁面,或來更改特定頁面上的行為。然後到了Drupal 8,一定會發現,怎麼這兩個好用的函數消失了,那麼到了Drupal 8,是使用什麼樣的方式來做到相同的事情呢? 這篇文章主要就是系統一次說明清楚。

前言

在Drupal 7 的環境下,我們常用hook_menuhook_menu_alter來建立客製化的頁面,或來更改特定頁面上的行為。然後到了Drupal 8,一定會發現,怎麼這兩個好用的函數消失了,那麼到了Drupal 8,是使用什麼樣的方式來做到相同的事情呢? 這篇文章主要就是系統一次說明清楚。

Menu System

(圖片來自於 Drupal.org)

在Drupal 7 當中,可以通過Hook_menu來建立客製化路徑,並且包含對應的權限、參數、Tab,而到了Drupal 8,Hook_menu以及Hook_menu_alter都已經不再有了,取而代之的則是使用Symfony的Routing System打造的全新Routing System,若你想要深入了解,可以參考Symfony的文件,當然也可以直接參考這篇文章,就可以知道要如何在Drupal 8裡面執行新的Menu System。

Drupal 7的Menu System

在Drupal 7當中,基本的Hook_menu的寫法大概會像下面的語法一樣。

/*
*  hook_menu
*/
function example_menu() {
  $items = array();
  $items['main'] = array(
    'title' => 'Main Page',
    'page callback' => example_main_page',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'MODULE.pages.inc'
  );
  return $items;
}

function example_main_page() {
  return t(‘Something goes here’);
}

Drupal 8 的 Menu system

在Drupal 8當中,我們要建立一個頁面,會把相關的資訊放到一個叫做MODULE.routing.yml的檔案之中。

這裡一樣以路徑main為範例,但需要注意與D7不一樣的地方時,在D8中,所有的路徑都需要加上一個“/”的符號,要不然就會噴錯啦。

  • 建立 example.routing.yml 在模組的根目錄,建立一個example.routing.yml檔案,這個檔案之中,將會描述要建立的路徑與其要使用的Controller,其實意義就跟hook_menu是一樣的。

    xample.content:
     path: '/main' 
     defaults: 
    _controller: '\Drupal\example\Controller\ExampleController::content' 
    _title: 'Hello World'
     requirements: 
    _permission: 'access content' 
    
    ``
    
    
  • 建立頁面Controller 再來需要建立Controller,路徑則是在src/Controller/ExampleController.php

    amespace Drupal\example\Controller;
    
    se Drupal\Core\Controller\ControllerBase;
    
    **
    * An example controller.
    */
    lass ExampleController extends ControllerBase {
    
     /**
      * Returns a render-able array for a test page.
      */
     public function content() {
    $build = [
      '#markup' => $this->t('Hello World!'),
    ];
    return $build;
     }
    
    
    
    ``
    然再建立了以上的程式碼以後,就可以看到頁面Hello World建立囉。
    
    

大功告成

後記

由於在D8跟D7有許多模組寫法的不同,因此,詳細的作法自己也還再不斷的摸索當中。光是要在D8達到所有D7 hook_menu的功能,就要花上不少時間了。不過個人覺得D8的作法與改變,雖然難度再提升,但是整體來說,卻彈性與延展性都讓我們有了更美好的想像:)

參考資料

  1. https://www.drupal.org/node/2118147
  2. https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8
  3. https://atendesigngroup.com/blog/restricting-access-drupal-8-controllers
  4. https://drupal.stackexchange.com/questions/187585/what-is-the-equivalent-of-hook-menu-alter-to-change-a-menu-item-type/187603
  5. https://www.drupal.org/docs/8/api/routing-system/routing-system-overview