Phalcon 中在Controller和Model中的初始化方法容易比较混淆的有initialize() 和 onConstruct();
值得注意的是initialize() 在控制器的一次request只会执行一次, 在Model中也是只会执行一次.
因此在控制器Controller1中执行initialize()后, 后面的代码再次使用new Controller1(), 或者再调用new Controller2()是不会执行Controller1或Controller2中的initialize方法的.
Model模型同理, 但和controller不同的是, ?不同的Model 会各自调用一次自己的initialize方法, 第二次再创建同一个Model时就不会再调用该model的initialize方法(phalcon 2.06版本). ?使用以下跟踪知道, __construct 会调用onConstruct()方法, 然后然后是initialize(), 最后又是onConstruct();
class ModelBase extends Model{ public function initialize() { parent::__construct(); echo get_class($this)."1111\n"; } public function onConstruct() { echo get_class($this)."2222\n"; } }
若要实现类似__construct()构造函数的效果, 可以使用onConstruct(). 在Phalcon/Mvc/Model 定义了__construct() 为final, 因此直接使用__construct()也不推荐.
public function onConstruct() { if(is_null($this->m_check_uid) OR $this->m_check_uid<=0) $this->m_check_uid = !empty(\CSQ::$mCheckId ) ? \CSQ::$mCheckId : 1; $this->m_check_id=$this->getDI()->getShared('session')->get('uname'); }
查看cphalcon的Zephir源码也说明了这一点; 控制器中, 再次路由分发是不会再调用initialize;
/** * Dispatches a handle action taking into account the routing parameters * * @return object */ public function dispatch() { .......... /** * Call the 'initialize' method just once per request */ if wasFresh === true { if method_exists(handler, "initialize") { handler->initialize(); } /** * Calling afterInitialize */ if eventsManager { if eventsManager->fire("dispatch:afterInitialize", this) === false { continue; } // Check if the user made a forward in the listener if this->_finished === false { continue; } } } ............ }
模型model一次请求每个model只执行一次自身的
/** * Initializes a model in the model manager */ public function initialize( model) -> boolean { var className, eventsManager; let className = get_class_lower(model); /** * Models are just initialized once per request */ if isset this->_initialized[className] { return false; }
onConstruct 在Controller和Model构造函数中每次新建都会执行一次
abstract class Controller extends Injectable implements ControllerInterface { /** * Phalcon\Mvc\Controller constructor */ public final function __construct() { if method_exists(this, "onConstruct") { this->{"onConstruct"}(); } } }
以及:
abstract class Model implements EntityInterface, ModelInterface, ResultInterface, InjectionAwareInterface, \Serializable { /** * This allows the developer to execute initialization stuff every time an instance is created */ if method_exists(this, "onConstruct") { this->{"onConstruct"}(); } }
相关博文
Phalcon initialize 和 onConstruct在Controller和Model中的初始化