一月 6, 2019 | 後端和Drupal

【D8 教學】簡介namespace在Drupal8的作用與轉變

如果你是D7的開發者,轉到了D8開發的時候,你一定有震驚!!如果你沒有震驚那你一定是在欺騙自己(逃~ )。從兩年前開始開發D8網站,還有同時維護與開發D7網站的過程當中,發現了不少改變。其中一個重點就是namespace的加入,這個的加入也解決了很多D7長久以來遇到的問題,持續往下看下去。

前言

如果你是D7的開發者,轉到了D8開發的時候,你一定有震驚!!如果你沒有震驚那你一定是在欺騙自己(逃~ )。從兩年前開始開發D8網站,還有同時維護與開發D7網站的過程當中,發現了不少改變。其中一個重點就是namespace的加入,這個的加入也解決了很多D7長久以來遇到的問題,持續往下看下去。

D7面臨的問題

在D7的時候,你一定常常會發現以下狀況,這個情況的意思是同一個函數在Drupal當中重複宣告了,因此導致系統的錯誤。可以想像一個充滿熱血的工程師,寫了一個很棒的程式模組,要應用在Drupal網站之中,但是卻因為其他模組環境使用了同一個函數導致錯誤,這個是多麼讓人覺得沮喪的事情。因此大家的函數取名都越來越複雜,還要加入一堆大寫小寫來命名函數。然而到了D8,這個問題將不復存在囉。

Namespace 命名空間

到了D8,幾乎不在使用一般的函數命名,取而代之的都是Class的方式來命名函數,因此函數的名稱想要取名一樣是沒有問題的,若你有兩個Class的名稱一樣,函數也一樣也不打緊,只需要Namespace不一樣即可,就可以達到同函數名稱取名一樣Class名稱,但一樣也不會有任何錯誤出現囉。

簡單範例

假設你已經會建立基本模組,現在要建立一個頁面,我們需要做以下兩件事情

  1. 建立目錄src/controller,在你的模組之中
  2. 建立檔案HelloController.php 在這個路徑之中 src/controller/HelloController.php
    /**
 
     * @file
 
     * Contains \Drupal\hello\Controller\HelloController.
 
     */
    namespace Drupal\hello\Controller;
    
    use Drupal\Core\Controller\ControllerBase;
    
    class HelloController extends ControllerBase {
      public function content() {
        return array(
          '#type' => 'markup',
          '#markup' => t('Hello world'),
        );
      }
    }
    
    
    

什麼是src目錄?為什麼namespace少了這個路徑?

src目錄其實是source的縮寫,而Drupal會自動Mapping路徑到src的路徑之中,因此就可以直接縮寫成

 namespace Drupal\hello\Controller

為什麼要使用use Drupal\Core\Controller\ControllerBase?

每一個namespace都可以定義自己的Class與自己的函數,然而如果在不同的namspace裡面要用就需要使用use。 以上面為例,由於我在目前這個namespace裡面,想要應用核心的Controller,因此,我只要通過以下的一行,就可以使用囉

use Drupal\Core\Controller\ControllerBase;

若其他的namespace想要使用我這個namespace裡面的class當然也只要通過以下一行就可以應用

use Drupal\hello\Controller\HelloController

小結

D8的這個寫法,主要就是從本來D7一體成型的模組,變成PHP的物件導向模式,讓原本是開發php的工程師能夠更快的加入到D8的開發之中,但對於原本是D7的開發者來說,改變真的是蠻大的,也由於整個從底層的更改,讓原本簡單可以Debug的問題,相對來說也變得比較複雜了.. 換個角度想,這樣的轉變也才真的是跟世界接軌,D7已經是非常強大的工具了,到了D8,真心讓我覺得學會這一套,可以行遍天下:)

參考資料

  1. https://befused.com/drupal/namespaces