【发布时间】:2014-10-26 17:36:02
【问题描述】:
为简洁起见省略了命名空间...
我写了如下服务提供者并在config/app.php中注册:
class OfferServiceProvider extends ServiceProvider
{
public function register()
{
$this->registerLossControlManager();
}
protected function registerLossControlManager()
{
$this->app->bind('LossControlInterface', 'LossControl');
}
}
这是我的 LossControlInterface
interface LossControlInterface
{
/**
* @param int $demandId
* @param float $offerTotal
* @param float $productTotal
* @param null|int $partnerId
* @return mixed
*/
public function make($demandId, $offerTotal, $productTotal, $partnerId = null);
/**
* @return float
*/
public function getAcceptableLoss();
/**
* @return bool
*/
public function isAcceptable();
/**
* @return bool
*/
public function isUnacceptable();
/**
* @return null
*/
public function reject();
}
现在在控制器中,我可以如下注入 LossController:
use LossControlInterface as LossControl;
class HomeController extends BaseController {
public function __construct(LossControl $lossControl)
{
$this->lossControl = $lossControl;
}
public function getLossThresholds()
{
$lossControl = $this->lossControl->make(985, 1000, null);
var_dump('Acceptable Loss: ' . $lossControl->getAcceptableLoss());
var_dump('Actual Loss: ' . $lossControl->calculateLoss());
var_dump('Acceptable? ' . $lossControl->isAcceptable());
}
}
但是,如果我尝试从命令调用的自定义类中依赖注入 LossControlInterface:
[2014-09-02 13:09:52] development.ERROR: exception 'ErrorException' with message 'Argument 11 passed to Offer::__construct() must be an instance of LossControlInterface, none given, called in /home/vagrant/Code/.../ProcessOffer.php on line 44 and defined' in /home/vagrant/Code/.../Offer.php:79
似乎我无法将接口依赖注入到自定义类中,但是当依赖注入到控制器时我可以。
对我做错了什么或忽略了让自动解决方案起作用有什么想法吗?
【问题讨论】:
-
你能发布创建自定义类的代码吗?它是在服务提供商内部还是在您的工匠命令中创建的?
-
它是从 artisan 命令中创建的。命令/ProcessOffer.php:
private function setOffer(Offer $offer = null) {$this->processOffer = $offer ?: new Offer();}
标签: php laravel repository-pattern ioc-container