Laravel依存注入によって、間口モードのディテールの使用を深く理解し、ゼロからlaravelフレームを構築する。
最近javaを勉強しています 。 javaを見て入門して精通します。反射部で急に昔の分からない依存性を注入すると急に明るくなります。
依存注入 反射して対象のパラメータを取得します。
次にlaravelを真似して実現します。比較的low
オリジナル 転載は出典を明記してください。
https://github.com/Childdreams/laravelIoc ソースアドレスは、注入に依存するインプリメンテーションが、注入が必要なサービスをコンテナに登録し、ルーティングがコントローラにアクセスするときに反射率 オープンモード
外観モデルの核心内容は依然として外観モデルの容器に注入されている。通常の間口モードで直接注入時のkeyに戻り、__u ucalstaticは容器の中で調べます。
laravelの中でdbなどの対象がforeachサイクルをする時、循環してくるのはあなたを循環させたいものだけです。この時に使います。
詳細なコメントは
依存注入 反射して対象のパラメータを取得します。
次に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 Aggatelaravelの中でdbなどの対象がforeachサイクルをする時、循環してくるのはあなたを循環させたいものだけです。この時に使います。
baofeng\Demo\Https\Request
baoffeng\Demo\Iterators\MyIterator詳細なコメントは
baofeng\Demo\Iterators\MyIterator
にある