Шаблон проектирования для реализации плагинов в приложениях PHP - PullRequest
24 голосов
/ 12 февраля 2012

Есть ли согласие относительно того, как плагины должны быть реализованы в приложении PHP?

Я посмотрел на шаблон наблюдателя , который приближается, на самом деле это просто система уведомлений и не позволяет коду напрямую расширять приложение. В настоящее время я использую простые системы хуков, которые я придумала:

public function registerHook($hookName, array $params = array())
{
    $this->hooks[] = $hookName;

    foreach ( $this->plugins as $pluginName => $hooks ) {
        if ( in_array($hookName, $hooks) ) {
            $plugin = new $pluginName($this, $this->view, $this->controller);

            $plugin->{$hookName}($params);
        }
    }
}

Это хорошо работает для моих целей, но мне любопытно, есть ли там шаблон проектирования, который был проверен и проверен много раз, и я просто заново изобретаю колесо.

Ответы [ 6 ]

9 голосов
/ 13 февраля 2012

Нет консенсуса, как в смысле Серебряной пули.Для установленных шаблонов у вас есть несколько вариантов, таких как

и многие другие.

Какой вы используете, зависит от вас, но вы должны убедиться, что архитектура вашей системы поддерживает модульность.Посмотрите на эти слайды для некоторых идей

3 голосов
/ 14 февраля 2012

Я думаю, что Event Dispatcher - это хороший и чистый способ реализации плагинов или любого расширения в этом отношении. Диспетчер событий является реализацией шаблона Observer и используется в symfony, Symfony2 и Zend Framework 2 (бета).

Просмотр любого из этих источников на github принесет вам интересное чтение. Хотя, интересная информация может быть найдена здесь:

http://components.symfony -project.org / событийно-диспетчерская / багажник / книга / 02-Рецепты

Я написал класс «События и крючки» несколько лет назад для проекта, я опубликую его здесь, если смогу его найти.

1 голос
/ 13 февраля 2012

То, как вы это сделали, с помощью хуков - это то, как я это реализую.

Самая большая проблема с вашим образцом в том, что ваша функция создает плагин. Почему бы вместо этого не передать экземпляр плагина?

То, как я это сделал, заключается в том, что сначала запускается плагин, и он сам регистрирует свои хуки.

1 голос
/ 13 февраля 2012

Zend Framework использует методы dispatchLoopStartup () и dispatchLoopShutdown () в качестве методов класса.Каждый плагин является классом, который реализует вышеупомянутые методы.

Справочник по ZF

1 голос
/ 13 февраля 2012

Взгляните на рамки Yii.Yii в значительной степени полагается на события, которые намного чище, чем хуки, действия и т. Д. Используя события, вы можете позволить различным частям системы общаться друг с другом объектно-ориентированным образом.

0 голосов
/ 13 февраля 2012

Ну, есть ссылка на проект под названием jin-plugin прямо в статье Википедии о концепции плагина . Я тоже вижу этот фреймворк впервые, но, может быть, вы можете использовать его сразу же.

Кроме того, вам действительно нужно искать такие вещи, как «Шаблон плагина», на первой странице я нашел только две ссылки: Шаблон плагина , Шаблон расширяемости (википедия) .

Если это действительно шаблон, он должен быть независимым от языка, чтобы вы могли смело брать любое существующее решение с любого языка и конвертировать его в PHP.

P. С. Спасибо за вопрос, во всяком случае, вы действительно вызвали у меня интерес к этой теме. ;)

...