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

安裝並啟用外掛

  1. 後台 > 擴充套件 > 管理 > 探索,新增我們的外掛
  2. 後台 > 擴充套件 > 外掛 > 搜尋 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

發表迴響