【发布时间】:2014-12-17 06:03:46
【问题描述】:
我一直在更改我的控制器和辅助类以使用依赖注入,似乎我的辅助类陷入了无限循环。
下面是我的自定义 ServiceProvider 和两个示例帮助程序类。如您所见,它们相互注入,因此它们不断来回移动。
这个问题的解决方案是什么? 我似乎在犯什么错误? 我可以做些什么才能在 General 和 Person 等辅助类上运行测试,同时模拟从它们内部调用的辅助类?
我认为可以使用的一种方法是在我的 ServiceProvider 中,执行以下操作:
if (isset($appmade->General)) {
// inject the General app that's already instantiated
} else {
$abc = app::make('\Lib\MyOrg\General');
$appmade->General = $abc;
}
这是正确的方法吗?
// /app/providers/myorg/MyOrgServiceProvider.php
namespace MyOrg\ServiceProvider;
use Illuminate\Support\ServiceProvider;
class MyOrgServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('\Lib\MyOrg\General', function ($app) {
return new \Lib\MyOrg\General(
$app->make('\Lib\MyOrg\Person'),
$app->make('\App\Models\User')
);
});
$this->app->bind('\Lib\MyOrg\Person', function ($app) {
return new \Lib\MyOrg\Person(
$app->make('\Lib\MyOrg\General'),
$app->make('\App\Models\Device')
);
});
}
}
// /app/libraries/myorg/general.php
namespace Lib\MyOrg;
use App\Models\User;
use Lib\MyOrg\Person;
class General
{
protected $model;
protected $class;
public function __construct(Person $personclass, User $user)
{
}
}
// /app/libraries/myorg/person.php
namespace Lib\MyOrg;
use App\Models\Device;
use Lib\MyOrg\General;
class Person
{
protected $model;
protected $class;
public function __construct(General $generalclass, Device $device)
{
}
}
【问题讨论】:
-
你认为代码缩进正确吗?
-
@hek2mgl 您指的是代码在问题中的显示方式吗?在我看来没问题...如果您有可读性建议,请提交编辑
-
@John 这不好。一点都不好。你需要重构你的类。避免循环依赖。
-
@John 请提供场景为什么需要循环依赖。这将了解问题的核心并得出解决方案!
-
@brainless 我不需要循环依赖 :) 我意识到这就是我要在这里结束的,所以问题是如何从这种情况中删除循环依赖。
标签: php unit-testing laravel laravel-4 phpunit