就不貼我的代碼了,這里直接新安裝webman測試。
// 安裝webman框架
composer create-project workerman/webman
// 進入目錄
cd webman
// 安裝依賴注入 PHP-DI
composer require psr/container ^1.1.1 php-di/php-di ^6.3 doctrine/annotations ^1.14
config/app.php
return [
省略其他……
'controller_reuse' => false, // 控制器復用已關閉
]
config/container.php
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
return $builder->build();
·
·
·
構造注入時 IndexController.php 代碼如下
<?php
namespace app\controller;
use app\Test;
class IndexController
{
public function __construct(Test $test)
{
var_dump($test->get());
}
public function index()
{
}
}
控制臺輸出(始終為單例):
string(15) "執(zhí)行了構造"
string(9) "獲取get"
string(9) "獲取get"
string(9) "獲取get"
當控制器方法注入時 IndexController.php代碼如下
<?php
namespace app\controller;
use app\Test;
class IndexController
{
public function index(Test $test)
{
var_dump($test->get());
}
}
控制臺輸出(如我預期一致,每次新實例):
string(15) "執(zhí)行了構造"
string(9) "獲取get"
string(15) "執(zhí)行了構造"
string(9) "獲取get"
string(15) "執(zhí)行了構造"
string(9) "獲取get"
已做嘗試:
升級PHP-DI為7(控制器構造注入依然為單例)
在dependence.php配置為非單例,控制器構造仍然為單例。
·
·
有知道怎么回事的老哥么?
控制器構造注入始終為單例。
控制器方法注入除了注入類,其他也都是單例。比如:A -> B、C、D
只有A是新實例,B、C、D均為單例。
應該是PHP-DI內(nèi)部復用了實例。寫個腳本測試下類似如下代碼
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
$container = $builder->build();
$container->make($class);
$container->make($class);
<?php
require __DIR__ . '/vendor/autoload.php';
class IndexController
{
public function __construct(Test $test)
{
var_dump($test->get());
}
}
class Test
{
public function __construct()
{
echo "Test __construct\n";
}
public function get()
{
return 'test';
}
}
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
$container = $builder->build();
$container->make(IndexController::class);
$container->make(IndexController::class);
$container->make(IndexController::class);
結果
php .\container.php
Test __construct
string(4) "test"
string(4) "test"
string(4) "test"
PHP-DI make的時候構造函數(shù)里依賴的類實例被復用了