更新见下文
在laravel文档中,我找到了将一个实现绑定到其接口的良好描述,这有利于单元测试目的。但是说我想绑定两个共享相同接口的实现,这也可能吗?
我正在尝试将不同的ValidationServices注入LoginController
和RegisterController
的构造方法。两种构造方法都是这样的
public function __construct(ValidationServiceInterface $validation) {
$this->validation = $validation;
}
现在,有没有办法告诉应用在一种情况下实例化说LoginUserValidationService
并在另一种情况下实例化RegisterUserValidationService
?欢迎提供任何线索和提示。
更新
解决此绑定问题的一种方法是php扩展接口的能力。因此,可以引入两个扩展LoginUserValidationServiceInterface
的接口(RegisterUserValidationServiceInterface
和ValidationServiceInterface
)。第一个是LoginUserValidationService
实现的LoginController
,RegisteUserValidationService
需要RegistrationController
需要的ValidationServiceProvider
。
此解决方案的好处是仍可使用laravel的ioc绑定。 class ValidationServiceProvider extends Illuminate\Support\ServiceProvider {
public function register(){
$this->app->bind(
'LoginUserValidationServiceInterface',
'LoginUserValidationService'
);
$this->app->bind(
'RegisterUserValidationServiceInterface',
'RegisterUserValidationService'
);
}
}
类是注册绑定的好位置:
{{1}}
因此保留了ioc容器的可用性。它的价格是引入了两个接口。可能是矫枉过正,但我现在选择这样做......
答案 0 :(得分:1)
是。但是,LoginUserValidationService
和RegisterUserValidationService
都应该实现ValidationServiceInterface
。
class LoginUserValidationService implements ValidationServiceInterface
{
//..
}
那么你可以这样做:
$controller = new LoginController(new LoginUserValidationService);