Commit 2035c39f authored by Yassine Doghri's avatar Yassine Doghri
Browse files

feat(plugins): register plugins using Plugin.php file instead of namespace +...

feat(plugins): register plugins using Plugin.php file instead of namespace + simplify i18n structure
parent d7b9730d
Loading
Loading
Loading
Loading
+1 −31
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ class Autoload extends AutoloadConfig
     *
     * @var list<string>
     */
    public $files = [APPPATH . 'Libraries/ViewComponents/Helpers/view_components_helper.php'];
    public $files = [];

    /**
     * -------------------------------------------------------------------
@@ -110,34 +110,4 @@ class Autoload extends AutoloadConfig
     * @var list<string>
     */
    public $helpers = ['auth', 'setting', 'icons', 'plugins'];

    public function __construct()
    {
        // load plugins namespaces
        $pluginsPaths = glob(PLUGINS_PATH . '*/*', GLOB_ONLYDIR | GLOB_NOSORT);

        if (! $pluginsPaths) {
            $pluginsPaths = [];
        }

        foreach ($pluginsPaths as $pluginPath) {
            $vendor = basename(dirname($pluginPath));
            $package = basename($pluginPath);

            // validate plugin pattern
            if (preg_match('~' . PLUGINS_KEY_PATTERN . '~', $vendor . '/' . $package) === false) {
                continue;
            }

            $pluginNamespace = 'Plugins\\' . str_replace(
                ' ',
                '',
                ucwords(str_replace(['-', '_', '.'], ' ', $vendor . '\\' . $package))
            );

            $this->psr4[$pluginNamespace] = $pluginPath;
        }

        parent::__construct();
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ use CodeIgniter\Config\BaseConfig;

class Plugins extends BaseConfig
{
    public string $folder = PLUGINS_PATH;

    /**
     * @var list<string>
     */
+3 −1
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ class Services extends BaseService
            return self::getSharedInstance('plugins');
        }

        return new Plugins();
        $config = config('Plugins');

        return new Plugins($config);
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -101,6 +101,11 @@ abstract class BasePlugin implements PluginInterface
        return $this->status;
    }

    final public function getDirectory(): string
    {
        return $this->directory;
    }

    /**
     * @return array<string,string>
     */
+26 −13
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ use App\Entities\Episode;
use App\Entities\Podcast;
use App\Libraries\SimpleRSSElement;
use Config\Database;
use Modules\Plugins\Config\Plugins as PluginsConfig;

/**
 * @method void rssBeforeChannel(Podcast $podcast)
@@ -63,8 +64,9 @@ class Plugins

    protected static int $activeCount = 0;

    public function __construct()
    {
    public function __construct(
        protected PluginsConfig $config
    ) {
        helper('plugins');

        $this->registerPlugins();
@@ -91,6 +93,14 @@ class Plugins
        return array_slice(static::$plugins, (($page - 1) * $perPage), $perPage);
    }

    /**
     * @return array<BasePlugin>
     */
    public function getAllPlugins(): array
    {
        return static::$plugins;
    }

    /**
     * @return array<BasePlugin>
     */
@@ -240,8 +250,8 @@ class Plugins
            return false;
        }

        // delete plugin folder from PLUGINS_PATH
        $pluginFolder = PLUGINS_PATH . $plugin->getKey();
        // delete plugin folder
        $pluginFolder = $this->config->folder . $plugin->getKey();
        $rmdirResult = $this->rrmdir($pluginFolder);

        $transResult = $db->transCommit();
@@ -252,13 +262,12 @@ class Plugins
    protected function registerPlugins(): void
    {
        // search for plugins in plugins folder
        $pluginsDirectories = glob(PLUGINS_PATH . '*/*', GLOB_ONLYDIR);
        $pluginsDirectories = glob($this->config->folder . '*/*', GLOB_ONLYDIR);

        if ($pluginsDirectories === false || $pluginsDirectories === []) {
            return;
        }

        $locator = service('locator');
        foreach ($pluginsDirectories as $pluginDirectory) {
            $vendor = basename(dirname($pluginDirectory));
            $package = basename($pluginDirectory);
@@ -267,13 +276,17 @@ class Plugins
                continue;
            }

            $pluginFile = $pluginDirectory . DIRECTORY_SEPARATOR . 'Plugin.php';
            $className = str_replace(
                ' ',
                '',
                ucwords(str_replace(['-', '_', '.'], ' ', $vendor . ' ' . $package)) . 'Plugin'
            );

            $className = $locator->findQualifiedNameFromPath($pluginFile);

            if ($className === false) {
                continue;
            spl_autoload_register(static function ($class) use (&$className, &$pluginDirectory): void {
                if ($class === $className) {
                    include $pluginDirectory . DIRECTORY_SEPARATOR . 'Plugin.php';
                }
            }, true);

            $plugin = new $className($vendor, $package, $pluginDirectory);
            if (! $plugin instanceof BasePlugin) {
Loading