一月 6, 2019 | 後端和Drupal
【D8 教學】簡介namespace在Drupal8的作用與轉變
前言
如果你是D7的開發者,轉到了D8開發的時候,你一定有震驚!!如果你沒有震驚那你一定是在欺騙自己(逃~ )。從兩年前開始開發D8網站,還有同時維護與開發D7網站的過程當中,發現了不少改變。其中一個重點就是namespace的加入,這個的加入也解決了很多D7長久以來遇到的問題,持續往下看下去。
D7面臨的問題
在D7的時候,你一定常常會發現以下狀況,這個情況的意思是同一個函數在Drupal當中重複宣告了,因此導致系統的錯誤。可以想像一個充滿熱血的工程師,寫了一個很棒的程式模組,要應用在Drupal網站之中,但是卻因為其他模組環境使用了同一個函數導致錯誤,這個是多麼讓人覺得沮喪的事情。因此大家的函數取名都越來越複雜,還要加入一堆大寫小寫來命名函數。然而到了D8,這個問題將不復存在囉。
Namespace 命名空間
到了D8,幾乎不在使用一般的函數命名,取而代之的都是Class的方式來命名函數,因此函數的名稱想要取名一樣是沒有問題的,若你有兩個Class的名稱一樣,函數也一樣也不打緊,只需要Namespace不一樣即可,就可以達到同函數名稱取名一樣Class名稱,但一樣也不會有任何錯誤出現囉。
簡單範例
假設你已經會建立基本模組,現在要建立一個頁面,我們需要做以下兩件事情
- 建立目錄src/controller,在你的模組之中
- 建立檔案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,真心讓我覺得學會這一套,可以行遍天下:)