php – Joomla! – 如何自動載入類別庫或 composer 到全域
如果要載入我們自訂的類別,我們通常會使用 JLoader::registerNamespace(‘MyLib’, JPATH_LIBRARIES . ‘/src’); ,但如果要在任何地方例如元件、模組、外掛中使用自訂的 library ,而不打算每次都要寫,則必須透過使用 plugin 的功能來設計。以下 參考官方說明 來設計範例。
製作 plugin
先在 xml 填寫我們的資訊,接著在 php 設計 system 初始化後,調用 onAfterInitialise() 事件。而事件填寫我們要載入自訂的類別庫位置。
plugins/system/mylib/mylib.xml
<?xml version="1.0" encoding="utf-8"?> <extension version="3.0" type="plugin" group="system" method="upgrade"> <name>Mylib</name> <author>Jason</author> <creationDate>2018-04-30</creationDate> <authorEmail>admin@domain.com</authorEmail> <version>1.0.0</version> <description>自動載入類別庫到全域</description> <files> <filename plugin="mylib">mylib.php</filename> </files> </extension>
plugins/system/mylib/mylib.php
<?php defined('_JEXEC') or die; class plgSystemMylib extends JPlugin { public function __construct(&$subject, $config) { parent::__construct($subject, $config); } public function onAfterInitialise() { JLoader::registerNamespace('Jsnlib', JPATH_LIBRARIES . '/src'); } }
- Joomla! 自動載入的標準使用 PSR-0 而不是 PSR-4
- 假設類別 Jsnlib\Hello 那會來自於 libraries/src/Jsnlib/Hello.php
- 假設類別 Jsnlib\World 那會來自於 libraries/src/Jsnlib/World.php
安裝並啟用外掛
- 後台 > 擴充套件 > 管理 > 探索,新增我們的外掛
- 後台 > 擴充套件 > 外掛 > 搜尋 Mylib > 啟用外掛
若我們在 __construct() 測試輸出,那麼重新整理就能看上方出現文字,這就表示外掛確實啟用。
public function __construct(&$subject, $config) { echo "啟用了"; parent::__construct($subject, $config); }
設計類別庫
libraries/src/Jsnlib/Hello.php
<?php namespace Jsnlib; class Hello { public function get() { return 'Hello'; } }
測試看看
在我們任何的 Component 中,可以寫
if (class_exists('Jsnlib\Hello')) { echo (new \Jsnlib\Hello)->get(); // => Hello }
就能看到系統確實自動載入我們的要求了。當然,目前為止我們要求 Joomla! 自動載入的類別庫,都放在 libraries/ 底下,那如果透過 Composer 下載第三方的套件,那要怎麼設計呢?就這樣寫
public function onAfterInitialise() { // ...... require_once JPATH_ROOT . '/vendor/autoload.php'; }
如果要使用第三方套件如 Eloquent 取代 Joomla! 本身的資料庫 JDatabase ,那也是在這邊做全域設定。可以參考這篇 Joomla! 使用第三方 Eloquent 取代 JDatabase 連接資料庫。
Comments