2014-01-03 2 views
1

Я уже некоторое время играю с инфраструктурой Phalcon, но мне не удалось выяснить, как работать с событиями приложений (через EventManager).Phalcon: Как использовать события приложений и куда их поместить?

В частности, я хотел бы создать событие «загрузки», поэтому я могу запускать код только один раз для каждого приложения, а не один раз для каждого контроллера (что было бы, если бы я расширил ControllerBase).

manual дает мне синтаксис для использования, но я до сих пор не знаю, как его использовать и в каком файле я должен его поместить.

Я знаю, что может просто потребовать файл «boot.php» в index.php, но это не очень элегантное решение.

ответ

3

Предположим, что у вас есть файл index.php, который является точкой входа приложения. В этом файле у вас есть код для регистрации всех сервисов в вашем приложении. Мое личное предпочтение состоит в том, чтобы сохранить файл index.php как можно меньше и поместить последовательность загрузки (регистрации служб) в другой файл.

Так что я бы в index.php

<?php 

use \Phalcon\DI\FactoryDefault as PhDi; 

error_reporting(E_ALL); 
date_default_timezone_set('US/Eastern'); 

if (!defined('ROOT_PATH')) { 
    define('ROOT_PATH', dirname(dirname(__FILE__))); 
} 

try { 

    include ROOT_PATH . "/app/var/bootstrap.php"; 

    /** 
    * Handle the request 
    */ 
    $di = new PhDi(); 
    $app = new Bootstrap($di); 

    echo $app->run(array()); 

} catch (\Phalcon\Exception $e) { 
    echo $e->getMessage(); 
} catch (PDOException $e){ 
    echo $e->getMessage(); 
} 

The bootstrap.php содержит функции, необходимые для инициализации всех услуг, в которых нуждается приложение. Один из этих услуг может быть следующим:

public function initEventsManager($app) 
{ 
    $evManager = new \Phalcon\Events\Manager(); 

    $app->setEventsManager($evManager); 

    $evManager->attach(
     "application", 
     function($event, $application) { 
      switch ($event->getType()) { 
       case 'boot': 
        $this->handleBoot(); 
        break; 
       case 'beforeStartModule': 
        $this->handleBeforeStartModule(); 
        break; 
       case 'afterStartModule': 
        $this->handleAfterStartModule(); 
        break; 
       case 'beforeHandleRequest': 
        $this->handleBeforeHandleRequest(); 
        break; 
       case 'afterHandleRequest': 
        $this->handleAfterHandleRequest(); 
        break; 
     } 
    ); 
} 

В файле bootstrap.php вы должны иметь соответствующие функции, такие как handleBoothandleAfterHandleRequest и т.д., которые будут обрабатывать код так, как вам нужно.

Вышеупомянутая функция регистрации диспетчера событий должна быть вызвана с помощью параметра Phalcon \ Mvc \ Application в качестве параметра. Хорошее место, чтобы поставить его бы здесь (на примерах)

https://github.com/phalcon/website/blob/master/app/var/bootstrap.php#L62

+0

Спасибо за ответ. Я попробую. – arothuis

+0

Хм. Это все еще не совсем то, что я ищу, поскольку мне требуется переписать/расширить стандартный код приложения. Ваш пример полезен для выяснения того, как прикрепить bootevent к менеджеру событий. Вот почему я принял этот ответ. – arothuis

+0

У меня была небольшая ошибка с вашим очень полезным кодом. Для дальнейшего использования, если проверка $ event (в коммутаторе) не работает, попробуйте $ event-> getType(). Этот метод вернет правильный тип или имя события. – arothuis

Смежные вопросы