Подтвердить что ты не робот

Шаблон проектирования для внедрения плагинов в приложениях PHP

Существует ли консенсус относительно того, как плагины должны быть реализованы в приложении 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);
        }
    }
}

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

4b9b3361

Ответ 1

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

чтобы назвать несколько.

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

Ответ 2

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

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

http://components.symfony-project.org/event-dispatcher/trunk/book/02-Recipes

Я написал класс Events и Hooks несколько лет назад для проекта, я отправлю его здесь, если найду его.

Ответ 3

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

Ответ 4

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

Справочная информация ZF

Ответ 5

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

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

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

Ответ 6

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

Кроме того, вам действительно нужно google для таких вещей, как "Plugin Pattern", там только две ссылки, которые я нашел на первой странице: Шаблон подключаемого модуля, Расширяемость (википедия).

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

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