Cake PHP позволяет вам создавать комбинации контроллеров, моделей и отображений и выпускать их как объеденные в пакет плагины приложения, чтобы другие могли использовать их в своих приложениях. У вас есть приятный модуль управления, простой блог или модуль веб-сервиса в одном вашем приложении? Упакуйте это все как плагин Cake PHP и вы сможете использовать его в других приложениях.
Главная связь между плагинами и приложениями это то, что плагины должны быть установлены в настройки приложения (соединение с базой данных и т.п.). Иначе, он работает в своем маленьком пространстве, ведя себя будто бы он самостоятельное приложение.
Создание плагина
Как рабочий пример, давайте сделаем плагин, который заказывает для вас пиццу. Что может быть более полезным в любом приложении CakePHP? Для начала нам понадобится поместить файл нашего плагина в каталог /app/plugins. Имя родительского каталога для любого плагина очень важно, и будет использоваться во многих местах, так что выбирайте его с умом. Для этого плагина, давайте будем использовать имя 'pizza'. Вот как будет выглядеть настройка в конце:
В то время как определение App Controller и App Model обычно не обязательно, определение их для плагина – обязательно. Вам придется создать их перед тем как плагин заработает. Эти два специальных класса названы после плагина, и расширяют родительские App Controller и App Model. Вот как они должны выглядеть:
Если вы забудете определить специальные классы, Cake PHP будет выдавать вам ошибку Missing Controller до тех пор, пока проблема не будет решена.
Контроллеры плагинов
Контроллеры для нашего плагина будут храниться в /app/plugins/pizza/controllers. С тех пор как нашей главной целью является заказ пиццы, нам нужен Orders Controller для нашего плагина.
Это не обязательно, но очень рекомендуем выбирать имена для контроллеров как можно уникальнее, чтобы избежать возможности совпадения имен с существующими родительскими контроллерами. Если вы не уверены совпадает ли выбранное вами имя с существующими, рекомендуем использовать имя плагина перед названием контроллера. В нашем примере можно использовать PizzaOrdersController.
Итак мы помещаем наш новый Pizza Orders Controller в /app/plugins/pizza/controllers и выглядит он так:
class PizzaOrdersController extends PizzaAppController { var $name = 'PizzaOrders';
function index() { //... }
function placeOrder() { //... } }
?>
Заметьте как этот контроллер расширяет Appcontroller плагина (называемый Pizza App Controller) в отличии от просто родительского App Controller приложения
Модели плагинов
Модели для плагинов хранятся в /app/plugins/pizza/models. Мы уже определили Pizza Orders Controller для этого плагина, так что давайте создадим модель для этого контроллера, под названием Pazza Orders (имя класса Pizza Orders соответсвует нашей схеме присвоения имен и является достаточно уникальным, поэтому мы оставим его как есть).
/app/plugins/pizza/models/pizza_order.php <?php class PizzaOrder extends PizzaAppModel { var $name = 'PizzaOrder'; } ?>
Снова, отметьте что этот класс расширяет Pizza App Model больше чем App Model.
Отображения плагинов
Отображения ведут себя также как и в обычных приложениях. Просто помещаем их в правильный каталог, а именно /app/plugins/[plugin]/views. Для нашего плагина по заказу пиццы, нам понадобится хотя бы одно отображения для нашего действия Pizza Orders Controller::index(), так что давайте включим его:
Работа с плагинами
Что ж вы все создали, и это все должно быть готовым для распространения (хотя мы предлагаем вам также распространять несколько дополнений, таких как readme,sql файлы и т.д.).
Раз плагин уже установлен в /app/plugins, вы можете получить к нему доступ через ссылку /pluginname/controllername/action. В нашем плагине заказа пиццы, мы получаем доступ к нашему Pizza Orders Controller в /pizza/pizzaOrders.
Несколько последних советов по работе с плагинами в ваших приложениях Cake PHP:
Когда у вас нету [Plugin]App Controller и [Plugin]App Model, то у вас появляются ошибки о недостающем контроллере, когда вы пытаетесь получить доступ к контроллеру плагина.
Если у вас есть контроллер с именем плагина по умолчанию, вы можете получить доступ через /[plugin]/action. Например плагин названный 'users' с контроллером под названием Users Controller, к нему можно получить доступ из /users/add если нету плагина названного Add Controller в каталоге [plugin]/controllers.
Плагины будут использовать верстки из каталога /app/views/layouts по умолчанию.
Вы можете создать меж-плагинную связь используя $this->requestAction('/plugin/controller/action'); в вашем контроллере.
Если вы используете requestAction убедитесь что у контроллера и модели уникальные имена. Иначе вы можете получить ошибку PHP redefined class ...".
Большая благодарность Felix Geisendorfer (the_undefined) за первоначальную информацию для этой главы.