如题所述
ããPHPä¾èµæ³¨å
¥çç解ãå享ç»å¤§å®¶ä¾å¤§å®¶åèï¼å
·ä½å¦ä¸ï¼
ããçLaravelçIoC容å¨ææ¡£åªæ¯ä»ç»å®ä¾ï¼ä½æ¯æ²¡æ说åçï¼ä¹åç¨MVCæ¡æ¶é½æ²¡æå¨æè¿ä¸ªæ¦å¿µï¼æ æä¸å¨phalconçææ¡£ä¸çå°è¿ä¸ªè¯¦ç»çä»ç»ï¼æè§è±ç¶å¼æï¼å¤å¶ç²è´´è¿æ¥ï¼ä¸»è¦æ¯å¥½ä¹ 没æåä¸è¥¿äºï¼ç°å¨ç¡®å®å¾æåå¾ï¼
ããé¦å ï¼æ们å设ï¼æ们è¦å¼åä¸ä¸ªç»ä»¶å½å为SomeComponentãè¿ä¸ªç»ä»¶ä¸ç°å¨å°è¦æ³¨å ¥ä¸ä¸ªæ°æ®åºè¿æ¥ã
ããå¨è¿ä¸ªä¾åä¸ï¼æ°æ®åºè¿æ¥å¨componentä¸è¢«å建ï¼è¿ç§æ¹æ³æ¯ä¸åå®é çï¼è¿æ ·åçè¯ï¼æ们å°ä¸è½æ¹åæ°æ®åºè¿æ¥åæ°åæ°æ®åºç±»åçä¸äºåæ°ã
ããclass SomeComponent {
ãã/**
ãã* The instantiation of the connection is hardcoded inside
ãã* the component so is difficult to replace it externally
ãã* or change its behavior
ãã*/
ããpublic function someDbTask()
ãã{
ãã$connection = new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã// ...
ãã}
ãã}
ãã$some = new SomeComponent();
ãã$some->someDbTask();
ãã为äºè§£å³ä¸é¢æ说çé®é¢ï¼æ们éè¦å¨ä½¿ç¨åå建ä¸ä¸ªå¤é¨è¿æ¥ï¼å¹¶æ³¨å ¥å°å®¹å¨ä¸ãå°±ç®åèè¨ï¼è¿çèµ·æ¥æ¯ä¸ä¸ªå¾å¥½ç解å³æ¹æ¡ï¼
ããclass SomeComponent {
ããprotected $_connection;
ãã/**
ãã* Sets the connection externally
ãã*/
ããpublic function setConnection($connection)
ãã{
ãã$this->_connection = $connection;
ãã}
ããpublic function someDbTask()
ãã{
ãã$connection = $this->_connection;
ãã// ...
ãã}
ãã}
ãã$some = new SomeComponent();
ãã//Create the connection
ãã$connection = new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã//Inject the connection in the component
ãã$some->setConnection($connection);
ãã$some->someDbTask();
ããç°å¨æ们æ¥èèä¸ä¸ªé®é¢ï¼æ们å¨åºç¨ç¨åºä¸çä¸åå°æ¹ä½¿ç¨æ¤ç»ä»¶ï¼å°å¤æ¬¡å建æ°æ®åºè¿æ¥ã使ç¨ä¸ç§ç±»ä¼¼å ¨å±æ³¨å表çæ¹å¼ï¼ä»è¿è·å¾ä¸ä¸ªæ°æ®åºè¿æ¥å®ä¾ï¼èä¸æ¯ä½¿ç¨ä¸æ¬¡å°±å建ä¸æ¬¡ã
ããclass Registry
ãã{
ãã/**
ãã* Returns the connection
ãã*/
ããpublic static function getConnection()
ãã{
ããreturn new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã}
ãã}
ããclass SomeComponent
ãã{
ããprotected $_connection;
ãã/**
ãã* Sets the connection externally
ãã*/
ããpublic function setConnection($connection){
ãã$this->_connection = $connection;
ãã}
ããpublic function someDbTask()
ãã{
ãã$connection = $this->_connection;
ãã// ...
ãã}
ãã}
ãã$some = new SomeComponent();
ãã//Pass the connection defined in the registry
ãã$some->setConnection(Registry::getConnection());
ãã$some->someDbTask();
ããç°å¨ï¼è®©æ们æ¥æ³åä¸ä¸ï¼æä»¬å¿ é¡»å¨ç»ä»¶ä¸å®ç°ä¸¤ä¸ªæ¹æ³ï¼é¦å éè¦å建ä¸ä¸ªæ°çæ°æ®åºè¿æ¥ï¼ç¬¬äºä¸ªæ»æ¯è·å¾ä¸ä¸ªå ±äº«è¿æ¥ï¼
ããclass Registry
ãã{
ããprotected static $_connection;
ãã/**
ãã* Creates a connection
ãã*/
ããprotected static function _createConnection()
ãã{
ããreturn new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã}
ãã/**
ãã* Creates a connection only once and returns it
ãã*/
ããpublic static function getSharedConnection()
ãã{
ããif (self::$_connection===null){
ãã$connection = self::_createConnection();
ããself::$_connection = $connection;
ãã}
ããreturn self::$_connection;
ãã}
ãã/**
ãã* Always returns a new connection
ãã*/
ããpublic static function getNewConnection()
ãã{
ããreturn self::_createConnection();
ãã}
ãã}
ããclass SomeComponent
ãã{
ããprotected $_connection;
ãã/**
ãã* Sets the connection externally
ãã*/
ããpublic function setConnection($connection){
ãã$this->_connection = $connection;
ãã}
ãã/**
ãã* This method always needs the shared connection
ãã*/
ããpublic function someDbTask()
ãã{
ãã$connection = $this->_connection;
ãã// ...
ãã}
ãã/**
ãã* This method always needs a new connection
ãã*/
ããpublic function someOtherDbTask($connection)
ãã{
ãã}
ãã}
ãã$some = new SomeComponent();
ãã//This injects the shared connection
ãã$some->setConnection(Registry::getSharedConnection());
ãã$some->someDbTask();
ãã//Here, we always pass a new connection as parameter
ãã$some->someOtherDbTask(Registry::getConnection());
ããå°æ¤ä¸ºæ¢ï¼æ们已ç»çå°äºå¦ä½ä½¿ç¨ä¾èµæ³¨å ¥è§£å³æ们çé®é¢ãä¸æ¯å¨ä»£ç å é¨å建ä¾èµå ³ç³»ï¼èæ¯è®©å ¶ä½ä¸ºä¸ä¸ªåæ°ä¼ éï¼è¿ä½¿å¾æ们çç¨åºæ´å®¹æç»´æ¤ï¼éä½ç¨åºä»£ç çè¦å度ï¼å®ç°ä¸ç§æ¾è¦åãä½æ¯ä»é¿è¿æ¥çï¼è¿ç§å½¢å¼çä¾èµæ³¨å ¥ä¹æä¸äºç¼ºç¹ã
ããä¾å¦ï¼å¦æç»ä»¶ä¸æè¾å¤çä¾èµå ³ç³»ï¼æ们éè¦å建å¤ä¸ªsetteræ¹æ³ä¼ éï¼æå建æé å½æ°è¿è¡ä¼ éãå¦å¤ï¼æ¯æ¬¡ä½¿ç¨ç»ä»¶æ¶ï¼é½éè¦å建ä¾èµç»ä»¶ï¼ä½¿ä»£ç ç»´æ¤ä¸å¤ªæï¼æ们ç¼åç代ç å¯è½åè¿æ ·ï¼
ãã//Create the dependencies or retrieve them from the registry
ãã$connection = new Connection();
ãã$session = new Session();
ãã$fileSystem = new FileSystem();
ãã$filter = new Filter();
ãã$selector = new Selector();
ãã//Pass them as constructor parameters
ãã$some = new SomeComponent($connection, $session, $fileSystem, $filter, $selector);
ãã// ... or using setters
ãã$some->setConnection($connection);
ãã$some->setSession($session);
ãã$some->setFileSystem($fileSystem);
ãã$some->setFilter($filter);
ãã$some->setSelector($selector);
ããææ³ï¼æ们ä¸å¾ä¸å¨åºç¨ç¨åºç许å¤å°æ¹å建è¿ä¸ªå¯¹è±¡ãå¦æä½ ä¸éè¦ä¾èµçç»ä»¶åï¼æ们åè¦å»ä»£ç æ³¨å ¥é¨å移é¤æé å½æ°ä¸çåæ°æè æ¯setteræ¹æ³ã为äºè§£å³è¿ä¸ªé®é¢ï¼æ们å次è¿åå»ä½¿ç¨ä¸ä¸ªå ¨å±æ³¨å表æ¥å建ç»ä»¶ãä½æ¯ï¼å¨å建对象ä¹åï¼å®å¢å äºä¸ä¸ªæ°çæ½è±¡å±ï¼
ããclass SomeComponent
ãã{
ãã// ...
ãã/**
ãã* Define a factory method to create SomeComponent instances injecting its dependencies
ãã*/
ããpublic static function factory()
ãã{
ãã$connection = new Connection();
ãã$session = new Session();
ãã$fileSystem = new FileSystem();
ãã$filter = new Filter();
ãã$selector = new Selector();
ããreturn new self($connection, $session, $fileSystem, $filter, $selector);
ãã}
ãã}
ããè¿ä¸å»ï¼æ们好ååå°äºé®é¢çå¼å§ï¼æ们æ£å¨å建ç»ä»¶å é¨çä¾èµï¼æ们æ¯æ¬¡é½å¨ä¿®æ¹ä»¥åæ¾å¯»ä¸ç§è§£å³é®é¢çåæ³ï¼ä½è¿é½ä¸æ¯å¾å¥½çåæ³ã
ããä¸ç§å®ç¨åä¼é çæ¥è§£å³è¿äºé®é¢ï¼æ¯ä½¿ç¨å®¹å¨çä¾èµæ³¨å ¥ï¼åæ们å¨åé¢çå°çï¼å®¹å¨ä½ä¸ºå ¨å±æ³¨å表ï¼ä½¿ç¨å®¹å¨çä¾èµæ³¨å ¥å为ä¸ç§æ¡¥æ¢æ¥è§£å³ä¾èµå¯ä»¥ä½¿æ们ç代ç è¦å度æ´ä½ï¼å¾å¥½çéä½äºç»ä»¶çå¤ææ§ï¼
ããclass SomeComponent
ãã{
ããprotected $_di;
ããpublic function __construct($di)
ãã{
ãã$this->_di = $di;
ãã}
ããpublic function someDbTask()
ãã{
ãã// Get the connection service
ãã// Always returns a new connection
ãã$connection = $this->_di->get('db');
ãã}
ããpublic function someOtherDbTask()
ãã{
ãã// Get a shared connection service,
ãã// this will return the same connection everytime
ãã$connection = $this->_di->getShared('db');
ãã//This method also requires a input filtering service
ãã$filter = $this->_db->get('filter');
ãã}
ãã}
ãã$di = new Phalcon\DI();
ãã//Register a "db" service in the container
ãã$di->set('db', function(){
ããreturn new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã});
ãã//Register a "filter" service in the container
ãã$di->set('filter', function(){
ããreturn new Filter();
ãã});
ãã//Register a "session" service in the container
ãã$di->set('session', function(){
ããreturn new Session();
ãã});
ãã//Pass the service container as unique parameter
ãã$some = new SomeComponent($di);
ãã$some->someTask();
ããç°å¨ï¼è¯¥ç»ä»¶åªæ访é®æç§serviceçæ¶åæéè¦å®ï¼å¦æå®ä¸éè¦ï¼å®çè³ä¸åå§åï¼ä»¥è约èµæºã该ç»ä»¶æ¯é«åº¦è§£è¦ãä»ä»¬çè¡ä¸ºï¼æè 说ä»ä»¬çä»»ä½å ¶ä»æ¹é¢é½ä¸ä¼å½±åå°ç»ä»¶æ¬èº«ãæ们çå®ç°åæ³
ããPhalcon\DI æ¯ä¸ä¸ªå®ç°äºæå¡çä¾èµæ³¨å ¥åè½çç»ä»¶ï¼å®æ¬èº«ä¹æ¯ä¸ä¸ªå®¹å¨ã
ããç±äºPhalconé«åº¦è§£è¦ï¼Phalcon\DI æ¯æ¡æ¶ç¨æ¥éæå ¶ä»ç»ä»¶çå¿ ä¸å¯å°çé¨åï¼å¼å人åä¹å¯ä»¥ä½¿ç¨è¿ä¸ªç»ä»¶ä¾èµæ³¨å ¥å管çåºç¨ç¨åºä¸ä¸åç±»æ件çå®ä¾ã
ããåºæ¬ä¸ï¼è¿ä¸ªç»ä»¶å®ç°äº Inversion of Control 模å¼ãåºäºæ¤ï¼å¯¹è±¡ä¸å以æé å½æ°æ¥æ¶åæ°æè 使ç¨setterçæ¹å¼æ¥å®ç°æ³¨å ¥ï¼èæ¯ç´æ¥è¯·æ±æå¡çä¾èµæ³¨å ¥ãè¿å°±å¤§å¤§éä½äºæ´ä½ç¨åºçå¤ææ§ï¼å 为åªæä¸ä¸ªæ¹æ³ç¨ä»¥è·å¾æéè¦çä¸ä¸ªç»ä»¶çä¾èµå ³ç³»ã
ããæ¤å¤ï¼è¿ç§æ¨¡å¼å¢å¼ºäºä»£ç çå¯æµè¯æ§ï¼ä»è使å®ä¸å®¹æåºéã
ããå¨å®¹å¨ä¸æ³¨åæå¡
ããæ¡æ¶æ¬èº«æå¼å人åé½å¯ä»¥æ³¨åæå¡ãå½ä¸ä¸ªç»ä»¶Aè¦æ±è°ç¨ç»ä»¶Bï¼æå®çç±»çä¸ä¸ªå®ä¾ï¼ï¼å¯ä»¥ä»å®¹å¨ä¸è¯·æ±è°ç¨ç»ä»¶Bï¼èä¸æ¯å建ç»ä»¶Bçä¸ä¸ªå®ä¾ã
ããè¿ç§å·¥ä½æ¹å¼ä¸ºæ们æä¾äºè®¸å¤ä¼ç¹ï¼
ããæ们å¯ä»¥æ´æ¢ä¸ä¸ªç»ä»¶ï¼ä»ä»ä»¬æ¬èº«æè 第ä¸æ¹è½»æ¾å建ã
ããå¨ç»ä»¶åå¸ä¹åï¼æ们å¯ä»¥å åçæ§å¶å¯¹è±¡çåå§åï¼å¹¶å¯¹å¯¹è±¡è¿è¡åç§è®¾ç½®ã
ããæ们å¯ä»¥ä½¿ç¨ç»ä¸çæ¹å¼ä»ç»ä»¶å¾å°ä¸ä¸ªç»æåçå ¨å±å®ä¾
ããæå¡å¯ä»¥éè¿ä»¥ä¸å ç§æ¹å¼æ³¨å ¥å°å®¹å¨ï¼
ãã//Create the Dependency Injector Container
ãã$di = new Phalcon\DI();
ãã//By its class name
ãã$di->set("request", 'Phalcon\Http\Request');
ãã//Using an anonymous function, the instance will lazy loaded
ãã$di->set("request", function(){
ããreturn new Phalcon\Http\Request();
ãã});
ãã//Registering directly an instance
ãã$di->set("request", new Phalcon\Http\Request());
ãã//Using an array definition
ãã$di->set("request", array(
ãã"className" => 'Phalcon\Http\Request'
ãã));
ããå¨ä¸é¢çä¾åä¸ï¼å½åæ¡æ¶è¯·æ±è®¿é®ä¸ä¸ªè¯·æ±æ°æ®æ¶ï¼å®å°é¦å ç¡®å®å®¹å¨ä¸æ¯å¦åå¨è¿ä¸ªâreqeustâå称çæå¡ã
ãã容å¨ä¼ååä¸ä¸ªè¯·æ±æ°æ®çå®ä¾ï¼å¼å人åæç»å¾å°ä»ä»¬æ³è¦çç»ä»¶ã
ããå¨ä¸é¢ç¤ºä¾ä¸çæ¯ä¸ç§æ¹æ³é½æä¼ç¼ºç¹ï¼å ·ä½ä½¿ç¨åªä¸ç§ï¼ç±å¼åè¿ç¨ä¸çç¹å®åºæ¯æ¥å³å®çã
ããç¨ä¸ä¸ªå符串æ¥è®¾å®ä¸ä¸ªæå¡é常ç®åï¼ä½ç¼ºå°çµæ´»æ§ã设置æå¡æ¶ï¼ä½¿ç¨æ°ç»åæä¾äºæ´å¤ççµæ´»æ§ï¼èä¸å¯ä»¥ä½¿ç¨è¾å¤æç代ç ãlambdaå½æ°æ¯ä¸¤è ä¹é´ä¸ä¸ªå¾å¥½ç平衡ï¼ä½ä¹å¯è½å¯¼è´æ´å¤çç»´æ¤ç®¡çææ¬ã
ããPhalcon\DI æä¾æå¡ç延è¿å è½½ãé¤éå¼å人åå¨æ³¨å ¥æå¡çæ¶åç´æ¥å®ä¾åä¸ä¸ªå¯¹è±¡ï¼ç¶åååå¨å°å®¹å¨ä¸ãå¨å®¹å¨ä¸ï¼éè¿æ°ç»ï¼å符串çæ¹å¼åå¨çæå¡é½å°è¢«å»¶è¿å è½½ï¼å³åªæå¨è¯·æ±å¯¹è±¡çæ¶åæ被åå§åã
ãã//Register a service "db" with a class name and its parameters
ãã$di->set("db", array(
ãã"className" => "Phalcon\Db\Adapter\Pdo\Mysql",
ãã"parameters" => array(
ãã"parameter" => array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "blog"
ãã)
ãã)
ãã));
ãã//Using an anonymous function
ãã$di->set("db", function(){
ããreturn new Phalcon\Db\Adapter\Pdo\Mysql(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "blog"
ãã));
ãã});
ãã以ä¸è¿ä¸¤ç§æå¡ç注åæ¹å¼äº§çç¸åçç»æãç¶åï¼éè¿æ°ç»å®ä¹çï¼å¨åé¢éè¦çæ¶åï¼ä½ å¯ä»¥ä¿®æ¹æå¡åæ°ï¼
ãã$di->setParameter("db", 0, array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret"
ãã));
ããä»å®¹å¨ä¸è·å¾æå¡çæç®åæ¹å¼å°±æ¯ä½¿ç¨âgetâæ¹æ³ï¼å®å°ä»å®¹å¨ä¸è¿åä¸ä¸ªæ°çå®ä¾ï¼
ãã$request = $di->get("request");
ããæè éè¿ä¸é¢è¿ç§éæ¯æ¹æ³çå½¢å¼è°ç¨ï¼
ãã$request = $di->getRequest();
ããPhalcon\DI åæ¶å 许æå¡éç¨ï¼ä¸ºäºå¾å°ä¸ä¸ªå·²ç»å®ä¾åè¿çæå¡ï¼å¯ä»¥ä½¿ç¨ getShared() æ¹æ³çå½¢å¼æ¥è·å¾æå¡ã
ããå ·ä½ç Phalcon\Http\Request 请æ±ç¤ºä¾ï¼
ãã$request = $di->getShared("request");
ããåæ°è¿å¯ä»¥å¨è¯·æ±çæ¶åéè¿å°ä¸ä¸ªæ°ç»åæ°ä¼ éç»æé å½æ°çæ¹å¼ï¼
ãã$component = $di->get("MyComponent", array("some-parameter", "other"));
ããçLaravelçIoC容å¨ææ¡£åªæ¯ä»ç»å®ä¾ï¼ä½æ¯æ²¡æ说åçï¼ä¹åç¨MVCæ¡æ¶é½æ²¡æå¨æè¿ä¸ªæ¦å¿µï¼æ æä¸å¨phalconçææ¡£ä¸çå°è¿ä¸ªè¯¦ç»çä»ç»ï¼æè§è±ç¶å¼æï¼å¤å¶ç²è´´è¿æ¥ï¼ä¸»è¦æ¯å¥½ä¹ 没æåä¸è¥¿äºï¼ç°å¨ç¡®å®å¾æåå¾ï¼
ããé¦å ï¼æ们å设ï¼æ们è¦å¼åä¸ä¸ªç»ä»¶å½å为SomeComponentãè¿ä¸ªç»ä»¶ä¸ç°å¨å°è¦æ³¨å ¥ä¸ä¸ªæ°æ®åºè¿æ¥ã
ããå¨è¿ä¸ªä¾åä¸ï¼æ°æ®åºè¿æ¥å¨componentä¸è¢«å建ï¼è¿ç§æ¹æ³æ¯ä¸åå®é çï¼è¿æ ·åçè¯ï¼æ们å°ä¸è½æ¹åæ°æ®åºè¿æ¥åæ°åæ°æ®åºç±»åçä¸äºåæ°ã
ããclass SomeComponent {
ãã/**
ãã* The instantiation of the connection is hardcoded inside
ãã* the component so is difficult to replace it externally
ãã* or change its behavior
ãã*/
ããpublic function someDbTask()
ãã{
ãã$connection = new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã// ...
ãã}
ãã}
ãã$some = new SomeComponent();
ãã$some->someDbTask();
ãã为äºè§£å³ä¸é¢æ说çé®é¢ï¼æ们éè¦å¨ä½¿ç¨åå建ä¸ä¸ªå¤é¨è¿æ¥ï¼å¹¶æ³¨å ¥å°å®¹å¨ä¸ãå°±ç®åèè¨ï¼è¿çèµ·æ¥æ¯ä¸ä¸ªå¾å¥½ç解å³æ¹æ¡ï¼
ããclass SomeComponent {
ããprotected $_connection;
ãã/**
ãã* Sets the connection externally
ãã*/
ããpublic function setConnection($connection)
ãã{
ãã$this->_connection = $connection;
ãã}
ããpublic function someDbTask()
ãã{
ãã$connection = $this->_connection;
ãã// ...
ãã}
ãã}
ãã$some = new SomeComponent();
ãã//Create the connection
ãã$connection = new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã//Inject the connection in the component
ãã$some->setConnection($connection);
ãã$some->someDbTask();
ããç°å¨æ们æ¥èèä¸ä¸ªé®é¢ï¼æ们å¨åºç¨ç¨åºä¸çä¸åå°æ¹ä½¿ç¨æ¤ç»ä»¶ï¼å°å¤æ¬¡å建æ°æ®åºè¿æ¥ã使ç¨ä¸ç§ç±»ä¼¼å ¨å±æ³¨å表çæ¹å¼ï¼ä»è¿è·å¾ä¸ä¸ªæ°æ®åºè¿æ¥å®ä¾ï¼èä¸æ¯ä½¿ç¨ä¸æ¬¡å°±å建ä¸æ¬¡ã
ããclass Registry
ãã{
ãã/**
ãã* Returns the connection
ãã*/
ããpublic static function getConnection()
ãã{
ããreturn new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã}
ãã}
ããclass SomeComponent
ãã{
ããprotected $_connection;
ãã/**
ãã* Sets the connection externally
ãã*/
ããpublic function setConnection($connection){
ãã$this->_connection = $connection;
ãã}
ããpublic function someDbTask()
ãã{
ãã$connection = $this->_connection;
ãã// ...
ãã}
ãã}
ãã$some = new SomeComponent();
ãã//Pass the connection defined in the registry
ãã$some->setConnection(Registry::getConnection());
ãã$some->someDbTask();
ããç°å¨ï¼è®©æ们æ¥æ³åä¸ä¸ï¼æä»¬å¿ é¡»å¨ç»ä»¶ä¸å®ç°ä¸¤ä¸ªæ¹æ³ï¼é¦å éè¦å建ä¸ä¸ªæ°çæ°æ®åºè¿æ¥ï¼ç¬¬äºä¸ªæ»æ¯è·å¾ä¸ä¸ªå ±äº«è¿æ¥ï¼
ããclass Registry
ãã{
ããprotected static $_connection;
ãã/**
ãã* Creates a connection
ãã*/
ããprotected static function _createConnection()
ãã{
ããreturn new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã}
ãã/**
ãã* Creates a connection only once and returns it
ãã*/
ããpublic static function getSharedConnection()
ãã{
ããif (self::$_connection===null){
ãã$connection = self::_createConnection();
ããself::$_connection = $connection;
ãã}
ããreturn self::$_connection;
ãã}
ãã/**
ãã* Always returns a new connection
ãã*/
ããpublic static function getNewConnection()
ãã{
ããreturn self::_createConnection();
ãã}
ãã}
ããclass SomeComponent
ãã{
ããprotected $_connection;
ãã/**
ãã* Sets the connection externally
ãã*/
ããpublic function setConnection($connection){
ãã$this->_connection = $connection;
ãã}
ãã/**
ãã* This method always needs the shared connection
ãã*/
ããpublic function someDbTask()
ãã{
ãã$connection = $this->_connection;
ãã// ...
ãã}
ãã/**
ãã* This method always needs a new connection
ãã*/
ããpublic function someOtherDbTask($connection)
ãã{
ãã}
ãã}
ãã$some = new SomeComponent();
ãã//This injects the shared connection
ãã$some->setConnection(Registry::getSharedConnection());
ãã$some->someDbTask();
ãã//Here, we always pass a new connection as parameter
ãã$some->someOtherDbTask(Registry::getConnection());
ããå°æ¤ä¸ºæ¢ï¼æ们已ç»çå°äºå¦ä½ä½¿ç¨ä¾èµæ³¨å ¥è§£å³æ们çé®é¢ãä¸æ¯å¨ä»£ç å é¨å建ä¾èµå ³ç³»ï¼èæ¯è®©å ¶ä½ä¸ºä¸ä¸ªåæ°ä¼ éï¼è¿ä½¿å¾æ们çç¨åºæ´å®¹æç»´æ¤ï¼éä½ç¨åºä»£ç çè¦å度ï¼å®ç°ä¸ç§æ¾è¦åãä½æ¯ä»é¿è¿æ¥çï¼è¿ç§å½¢å¼çä¾èµæ³¨å ¥ä¹æä¸äºç¼ºç¹ã
ããä¾å¦ï¼å¦æç»ä»¶ä¸æè¾å¤çä¾èµå ³ç³»ï¼æ们éè¦å建å¤ä¸ªsetteræ¹æ³ä¼ éï¼æå建æé å½æ°è¿è¡ä¼ éãå¦å¤ï¼æ¯æ¬¡ä½¿ç¨ç»ä»¶æ¶ï¼é½éè¦å建ä¾èµç»ä»¶ï¼ä½¿ä»£ç ç»´æ¤ä¸å¤ªæï¼æ们ç¼åç代ç å¯è½åè¿æ ·ï¼
ãã//Create the dependencies or retrieve them from the registry
ãã$connection = new Connection();
ãã$session = new Session();
ãã$fileSystem = new FileSystem();
ãã$filter = new Filter();
ãã$selector = new Selector();
ãã//Pass them as constructor parameters
ãã$some = new SomeComponent($connection, $session, $fileSystem, $filter, $selector);
ãã// ... or using setters
ãã$some->setConnection($connection);
ãã$some->setSession($session);
ãã$some->setFileSystem($fileSystem);
ãã$some->setFilter($filter);
ãã$some->setSelector($selector);
ããææ³ï¼æ们ä¸å¾ä¸å¨åºç¨ç¨åºç许å¤å°æ¹å建è¿ä¸ªå¯¹è±¡ãå¦æä½ ä¸éè¦ä¾èµçç»ä»¶åï¼æ们åè¦å»ä»£ç æ³¨å ¥é¨å移é¤æé å½æ°ä¸çåæ°æè æ¯setteræ¹æ³ã为äºè§£å³è¿ä¸ªé®é¢ï¼æ们å次è¿åå»ä½¿ç¨ä¸ä¸ªå ¨å±æ³¨å表æ¥å建ç»ä»¶ãä½æ¯ï¼å¨å建对象ä¹åï¼å®å¢å äºä¸ä¸ªæ°çæ½è±¡å±ï¼
ããclass SomeComponent
ãã{
ãã// ...
ãã/**
ãã* Define a factory method to create SomeComponent instances injecting its dependencies
ãã*/
ããpublic static function factory()
ãã{
ãã$connection = new Connection();
ãã$session = new Session();
ãã$fileSystem = new FileSystem();
ãã$filter = new Filter();
ãã$selector = new Selector();
ããreturn new self($connection, $session, $fileSystem, $filter, $selector);
ãã}
ãã}
ããè¿ä¸å»ï¼æ们好ååå°äºé®é¢çå¼å§ï¼æ们æ£å¨å建ç»ä»¶å é¨çä¾èµï¼æ们æ¯æ¬¡é½å¨ä¿®æ¹ä»¥åæ¾å¯»ä¸ç§è§£å³é®é¢çåæ³ï¼ä½è¿é½ä¸æ¯å¾å¥½çåæ³ã
ããä¸ç§å®ç¨åä¼é çæ¥è§£å³è¿äºé®é¢ï¼æ¯ä½¿ç¨å®¹å¨çä¾èµæ³¨å ¥ï¼åæ们å¨åé¢çå°çï¼å®¹å¨ä½ä¸ºå ¨å±æ³¨å表ï¼ä½¿ç¨å®¹å¨çä¾èµæ³¨å ¥å为ä¸ç§æ¡¥æ¢æ¥è§£å³ä¾èµå¯ä»¥ä½¿æ们ç代ç è¦å度æ´ä½ï¼å¾å¥½çéä½äºç»ä»¶çå¤ææ§ï¼
ããclass SomeComponent
ãã{
ããprotected $_di;
ããpublic function __construct($di)
ãã{
ãã$this->_di = $di;
ãã}
ããpublic function someDbTask()
ãã{
ãã// Get the connection service
ãã// Always returns a new connection
ãã$connection = $this->_di->get('db');
ãã}
ããpublic function someOtherDbTask()
ãã{
ãã// Get a shared connection service,
ãã// this will return the same connection everytime
ãã$connection = $this->_di->getShared('db');
ãã//This method also requires a input filtering service
ãã$filter = $this->_db->get('filter');
ãã}
ãã}
ãã$di = new Phalcon\DI();
ãã//Register a "db" service in the container
ãã$di->set('db', function(){
ããreturn new Connection(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "invo"
ãã));
ãã});
ãã//Register a "filter" service in the container
ãã$di->set('filter', function(){
ããreturn new Filter();
ãã});
ãã//Register a "session" service in the container
ãã$di->set('session', function(){
ããreturn new Session();
ãã});
ãã//Pass the service container as unique parameter
ãã$some = new SomeComponent($di);
ãã$some->someTask();
ããç°å¨ï¼è¯¥ç»ä»¶åªæ访é®æç§serviceçæ¶åæéè¦å®ï¼å¦æå®ä¸éè¦ï¼å®çè³ä¸åå§åï¼ä»¥è约èµæºã该ç»ä»¶æ¯é«åº¦è§£è¦ãä»ä»¬çè¡ä¸ºï¼æè 说ä»ä»¬çä»»ä½å ¶ä»æ¹é¢é½ä¸ä¼å½±åå°ç»ä»¶æ¬èº«ãæ们çå®ç°åæ³
ããPhalcon\DI æ¯ä¸ä¸ªå®ç°äºæå¡çä¾èµæ³¨å ¥åè½çç»ä»¶ï¼å®æ¬èº«ä¹æ¯ä¸ä¸ªå®¹å¨ã
ããç±äºPhalconé«åº¦è§£è¦ï¼Phalcon\DI æ¯æ¡æ¶ç¨æ¥éæå ¶ä»ç»ä»¶çå¿ ä¸å¯å°çé¨åï¼å¼å人åä¹å¯ä»¥ä½¿ç¨è¿ä¸ªç»ä»¶ä¾èµæ³¨å ¥å管çåºç¨ç¨åºä¸ä¸åç±»æ件çå®ä¾ã
ããåºæ¬ä¸ï¼è¿ä¸ªç»ä»¶å®ç°äº Inversion of Control 模å¼ãåºäºæ¤ï¼å¯¹è±¡ä¸å以æé å½æ°æ¥æ¶åæ°æè 使ç¨setterçæ¹å¼æ¥å®ç°æ³¨å ¥ï¼èæ¯ç´æ¥è¯·æ±æå¡çä¾èµæ³¨å ¥ãè¿å°±å¤§å¤§éä½äºæ´ä½ç¨åºçå¤ææ§ï¼å 为åªæä¸ä¸ªæ¹æ³ç¨ä»¥è·å¾æéè¦çä¸ä¸ªç»ä»¶çä¾èµå ³ç³»ã
ããæ¤å¤ï¼è¿ç§æ¨¡å¼å¢å¼ºäºä»£ç çå¯æµè¯æ§ï¼ä»è使å®ä¸å®¹æåºéã
ããå¨å®¹å¨ä¸æ³¨åæå¡
ããæ¡æ¶æ¬èº«æå¼å人åé½å¯ä»¥æ³¨åæå¡ãå½ä¸ä¸ªç»ä»¶Aè¦æ±è°ç¨ç»ä»¶Bï¼æå®çç±»çä¸ä¸ªå®ä¾ï¼ï¼å¯ä»¥ä»å®¹å¨ä¸è¯·æ±è°ç¨ç»ä»¶Bï¼èä¸æ¯å建ç»ä»¶Bçä¸ä¸ªå®ä¾ã
ããè¿ç§å·¥ä½æ¹å¼ä¸ºæ们æä¾äºè®¸å¤ä¼ç¹ï¼
ããæ们å¯ä»¥æ´æ¢ä¸ä¸ªç»ä»¶ï¼ä»ä»ä»¬æ¬èº«æè 第ä¸æ¹è½»æ¾å建ã
ããå¨ç»ä»¶åå¸ä¹åï¼æ们å¯ä»¥å åçæ§å¶å¯¹è±¡çåå§åï¼å¹¶å¯¹å¯¹è±¡è¿è¡åç§è®¾ç½®ã
ããæ们å¯ä»¥ä½¿ç¨ç»ä¸çæ¹å¼ä»ç»ä»¶å¾å°ä¸ä¸ªç»æåçå ¨å±å®ä¾
ããæå¡å¯ä»¥éè¿ä»¥ä¸å ç§æ¹å¼æ³¨å ¥å°å®¹å¨ï¼
ãã//Create the Dependency Injector Container
ãã$di = new Phalcon\DI();
ãã//By its class name
ãã$di->set("request", 'Phalcon\Http\Request');
ãã//Using an anonymous function, the instance will lazy loaded
ãã$di->set("request", function(){
ããreturn new Phalcon\Http\Request();
ãã});
ãã//Registering directly an instance
ãã$di->set("request", new Phalcon\Http\Request());
ãã//Using an array definition
ãã$di->set("request", array(
ãã"className" => 'Phalcon\Http\Request'
ãã));
ããå¨ä¸é¢çä¾åä¸ï¼å½åæ¡æ¶è¯·æ±è®¿é®ä¸ä¸ªè¯·æ±æ°æ®æ¶ï¼å®å°é¦å ç¡®å®å®¹å¨ä¸æ¯å¦åå¨è¿ä¸ªâreqeustâå称çæå¡ã
ãã容å¨ä¼ååä¸ä¸ªè¯·æ±æ°æ®çå®ä¾ï¼å¼å人åæç»å¾å°ä»ä»¬æ³è¦çç»ä»¶ã
ããå¨ä¸é¢ç¤ºä¾ä¸çæ¯ä¸ç§æ¹æ³é½æä¼ç¼ºç¹ï¼å ·ä½ä½¿ç¨åªä¸ç§ï¼ç±å¼åè¿ç¨ä¸çç¹å®åºæ¯æ¥å³å®çã
ããç¨ä¸ä¸ªå符串æ¥è®¾å®ä¸ä¸ªæå¡é常ç®åï¼ä½ç¼ºå°çµæ´»æ§ã设置æå¡æ¶ï¼ä½¿ç¨æ°ç»åæä¾äºæ´å¤ççµæ´»æ§ï¼èä¸å¯ä»¥ä½¿ç¨è¾å¤æç代ç ãlambdaå½æ°æ¯ä¸¤è ä¹é´ä¸ä¸ªå¾å¥½ç平衡ï¼ä½ä¹å¯è½å¯¼è´æ´å¤çç»´æ¤ç®¡çææ¬ã
ããPhalcon\DI æä¾æå¡ç延è¿å è½½ãé¤éå¼å人åå¨æ³¨å ¥æå¡çæ¶åç´æ¥å®ä¾åä¸ä¸ªå¯¹è±¡ï¼ç¶åååå¨å°å®¹å¨ä¸ãå¨å®¹å¨ä¸ï¼éè¿æ°ç»ï¼å符串çæ¹å¼åå¨çæå¡é½å°è¢«å»¶è¿å è½½ï¼å³åªæå¨è¯·æ±å¯¹è±¡çæ¶åæ被åå§åã
ãã//Register a service "db" with a class name and its parameters
ãã$di->set("db", array(
ãã"className" => "Phalcon\Db\Adapter\Pdo\Mysql",
ãã"parameters" => array(
ãã"parameter" => array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "blog"
ãã)
ãã)
ãã));
ãã//Using an anonymous function
ãã$di->set("db", function(){
ããreturn new Phalcon\Db\Adapter\Pdo\Mysql(array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret",
ãã"dbname" => "blog"
ãã));
ãã});
ãã以ä¸è¿ä¸¤ç§æå¡ç注åæ¹å¼äº§çç¸åçç»æãç¶åï¼éè¿æ°ç»å®ä¹çï¼å¨åé¢éè¦çæ¶åï¼ä½ å¯ä»¥ä¿®æ¹æå¡åæ°ï¼
ãã$di->setParameter("db", 0, array(
ãã"host" => "localhost",
ãã"username" => "root",
ãã"password" => "secret"
ãã));
ããä»å®¹å¨ä¸è·å¾æå¡çæç®åæ¹å¼å°±æ¯ä½¿ç¨âgetâæ¹æ³ï¼å®å°ä»å®¹å¨ä¸è¿åä¸ä¸ªæ°çå®ä¾ï¼
ãã$request = $di->get("request");
ããæè éè¿ä¸é¢è¿ç§éæ¯æ¹æ³çå½¢å¼è°ç¨ï¼
ãã$request = $di->getRequest();
ããPhalcon\DI åæ¶å 许æå¡éç¨ï¼ä¸ºäºå¾å°ä¸ä¸ªå·²ç»å®ä¾åè¿çæå¡ï¼å¯ä»¥ä½¿ç¨ getShared() æ¹æ³çå½¢å¼æ¥è·å¾æå¡ã
ããå ·ä½ç Phalcon\Http\Request 请æ±ç¤ºä¾ï¼
ãã$request = $di->getShared("request");
ããåæ°è¿å¯ä»¥å¨è¯·æ±çæ¶åéè¿å°ä¸ä¸ªæ°ç»åæ°ä¼ éç»æé å½æ°çæ¹å¼ï¼
ãã$component = $di->get("MyComponent", array("some-parameter", "other"));
温馨提示:答案为网友推荐,仅供参考