我在LoginController中遇到了一个关于依赖关系反射的问题:
//LoginController
use App\Http\Controllers\Accounting;
class LoginController extends Controller
{
use IssueTokenTrait;
private $C_Account;
public function __construct(Accounting\AccountsController $C_Account)
{
dd($C_Account);
}
}
。
//AccountsController
namespace App\Http\Controllers\Accounting;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AccountsController extends Controller
{
public function __construct() {
}
}
当以这种方式设置我的AccountsController时,实例被正确地传递到LoginController。
AccountsController {#190
#middleware: []
}
下一步:
但是,如果我将依赖项添加到AccountsController
//AccountsController
namespace App\Http\Controllers\Accounting;
use App\Http\Controllers\API\Accounting\AppAccountsController;
class AccountsController extends Controller
{
public function __construct(
AppAccountsController $C_AppAccount,
) {
}
}
它抛出一个AccountsController不存在的ReflectionException。
{
"message": "Class App\\Http\\Controllers\\Accounting\\AccountsController does not exist",
"exception": "ReflectionException",
"file": "/var/www/html/ideegoapi/vendor/laravel/framework/src/Illuminate/Container/Container.php",
"line": 811,
"trace": [
{
//and so on
如果我向LoginController添加另一个类依赖项(在其构造函数中也有进一步的依赖项),一切都会很好地工作。进一步的依赖关系将以递归方式解决。
我在这里做错了什么?
更新
最后,AccountsController应该如下所示:
use App\Http\Controllers\API\Accounting\DevicesController;
use App\Http\Controllers\Payment\ProductsController;
use App\Http\Controllers\Accounting\SubscriptionsController;
use App\Http\Controllers\API\Accounting\AppAccountsController;
class AccountsController extends Controller
{
private $C_AppAccount;
private $C_Device;
private $C_Product;
private $C_Sub;
public function __construct(
DevicesController $C_Device,
ProductsController $C_Product,
SubscriptionsController $C_Sub,
AppAccountsController $C_AppAccount
) {
$this->C_Device = $C_Device;
$this->C_Product = $C_Product;
$this->C_Sub = $C_Sub;
$this->C_AppAccount = $C_AppAccount;
}
}
好了,我尝试创建一个新的、干净的控制器,并一步一步地添加每个依赖项,以查看错误发生的位置。当我将AppAccountsController添加为依赖项时,就会发生这种情况。这个控制器在它自己的构造函数中有不同的依赖项。
public function __construct(
CreditAccountsController $C_CreditAccount,
UserMetaController $C_UserMeta,
BillDataController $C_BillData,
AppAccount $model
) {
//store injections in class-attributes
$this->C_CreditAccount = $C_CreditAccount;
$this->C_UserMeta = $C_UserMeta;
$this->C_BillData = $C_BillData;
//populate model if id is accessible
if(defined('APP_ACCOUNT_ID')) {
$this->model = $model::find(APP_ACCOUNT_ID);
} else {
$this->model = $model;
}
}
问题是,如果我将AppAccountsController作为依赖项添加到LoginController中,它就会成功创建。如果我直接从一个路由调用AccountsController,而它的所有依赖项都在构造函数中(甚至是AppAccountsController),那么它也是完美创建的。
第二级(AppAccountsController)的依赖项本身也有依赖项。因此,总的来说,我有3级(通过LoginController的实例化,甚至4级)的依赖关系需要解决。
这是不是太过分了?有限制吗?
发布于 2018-03-10 20:56:08
解决方案
我将这一行添加到LoginController的构造函数中,它在第一个解决方案中传递了依赖项。现在不再依赖:
public function __construct()
{
$this->C_Account = app()->make(AccountController::class);
}
不幸的是,即使有这样的依赖关系:
public function __construct(AccountController $AAC)
{
$this->middleware('guest')->except('logout','refresh');
$this->C_Account = $AAC;
}
它又开始工作了。我也不知道原因。我没有完全理解这个错误的形状。因此,可能是使用app()->make命令将类添加到类映射中,或者缓存中的某些内容发生了变化。
https://stackoverflow.com/questions/49207872
复制相似问题