Laravel依存注入によって、間口モードのディテールの使用を深く理解し、ゼロからlaravelフレームを構築する。

3915 ワード

最近javaを勉強しています  。 javaを見て入門して精通します。反射部で急に昔の分からない依存性を注入すると急に明るくなります。
依存注入  反射して対象のパラメータを取得します。
次にlaravelを真似して実現します。比較的low
 オリジナル  転載は出典を明記してください。
https://github.com/Childdreams/laravelIoc ソースアドレス
register = array_merge($this->register , $bind) ;
    }
}



namespace cpp;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;

/**
 *    
 */
class UserController
{
    public function __construct()
    {
    }

    public function test(RequestInterface $request , SendSmsInterface $sendSmsService){
        var_dump($request->id);
        var_dump("this is     ");
		var_dump($sendSmsService->name);
    }
}

namespace test;

use bpp\Container;

//     
$api = new Container();
//          ,                 
$api->register([
	\app\interfaces\RequestInterface::class => \app\Request::class
]);
$api->register([
	\app\interfaces\SendSmsInterface::class => \app\SendSmsService::class
]);

//     
$router = "cpp\UserController@test";
$routers = explode("@",$router);

//            
$ref = (new \ReflectionClass($routers[0]));

//                 
$refs = $ref->getMethod($routers[1])->getParameters();

$inject = [];

foreach ($refs as $re){
	
	//      
    $class = $re->getClass()->name;
	//            
    if (array_key_exists($class , $api->register)){
		//            
		$class = $api->register[$class];
		//    
        $classes = $ref->newInstance();
        $name = $routers[1];
		$inject[] = new $class();
    }else {
		throw new \Exception("bug");
	}
}

(new $classes())->{$name}(...$inject);
依存注入
  • は、注入に依存するインプリメンテーションが、注入が必要なサービスをコンテナに登録し、ルーティングがコントローラにアクセスするときに反射率ReflectionClassを利用することであることを理解する。 注入が必要なサービスを取得しに行きます。その後、サービスを実例化してコード実現部
    $router = "cpp\UserController@test";
    $routers = explode("@", $router);
    
    //            
    
    $ref = (new \ReflectionClass($routers[0]));
    
    
    //                 
    $refs = $ref->getMethod($routers[1])->getParameters();
    
    $inject = [];
    foreach ($refs as $re) {
      //      
      $class = $re->getClass()->name;
      //            
      if (array_key_exists($class, $app->register)) {
          //            
          $class = $app->register[$class];
          //    
          $name = $routers[1];
          $inject[] = new $class();
      } else {
          throw new \Exception("bug");
      }
    }
    $classes = $ref->newInstance();  // == new $ref
    call_user_func_array([$classes , $name] , ...$inject) ; 
    
    に注入し、容器laravelにどのように登録するかはサービスプロバイダと書く。サービスプロバイダを/config/app.phpに登録して、サービスプロバイダが携帯するサービスをコンテナに登録する。  bootstrap/app.php ライン23 baofeng\Demo\Kernel\Kernel@reisterServiceProvider
  • オープンモード
    外観モデルの核心内容は依然として外観モデルの容器に注入されている。通常の間口モードで直接注入時のkeyに戻り、__u ucalstaticは容器の中で調べます。baofeng\Demo\Facaders\FacaderデニムIterator Aggate
    laravelの中でdbなどの対象がforeachサイクルをする時、循環してくるのはあなたを循環させたいものだけです。この時に使います。baofeng\Demo\Https\Requestbaoffeng\Demo\Iterators\MyIterator
    詳細なコメントは  baofeng\Demo\Iterators\MyIterator にある