首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LoginController中的递归依赖注入

LoginController中的递归依赖注入
EN

Stack Overflow用户
提问于 2018-03-10 18:14:31
回答 1查看 168关注 0票数 0

我在LoginController中遇到了一个关于依赖关系反射的问题:

代码语言:javascript
运行
复制
//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);
    }
}

代码语言:javascript
运行
复制
//AccountsController

namespace App\Http\Controllers\Accounting;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;


class AccountsController extends Controller
{

    public function __construct() {

    }
}

当以这种方式设置我的AccountsController时,实例被正确地传递到LoginController。

代码语言:javascript
运行
复制
AccountsController {#190
 #middleware: []
}

下一步:

但是,如果我将依赖项添加到AccountsController

代码语言:javascript
运行
复制
//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。

代码语言:javascript
运行
复制
{
"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应该如下所示:

代码语言:javascript
运行
复制
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添加为依赖项时,就会发生这种情况。这个控制器在它自己的构造函数中有不同的依赖项。

代码语言:javascript
运行
复制
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级)的依赖关系需要解决。

这是不是太过分了?有限制吗?

EN

回答 1

Stack Overflow用户

发布于 2018-03-10 20:56:08

解决方案

我将这一行添加到LoginController的构造函数中,它在第一个解决方案中传递了依赖项。现在不再依赖:

代码语言:javascript
运行
复制
public function __construct() 
{
    $this->C_Account = app()->make(AccountController::class);
}

不幸的是,即使有这样的依赖关系:

代码语言:javascript
运行
复制
public function __construct(AccountController $AAC) 
{
    $this->middleware('guest')->except('logout','refresh');
    $this->C_Account = $AAC;
}

它又开始工作了。我也不知道原因。我没有完全理解这个错误的形状。因此,可能是使用app()->make命令将类添加到类映射中,或者缓存中的某些内容发生了变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49207872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档