【发布时间】:2014-01-07 00:26:33
【问题描述】:
更新见下文
在 laravel 文档中,我找到了一个很好的描述,将一个实现绑定到它的接口,这对单元测试很有好处。但是说我想绑定两个共享相同接口的实现,这也可能吗?
我正在尝试将不同的 ValidationServices 注入到 LoginController 和 RegisterController 的构造方法中。两种构造方法都是这样的
public function __construct(ValidationServiceInterface $validation) {
$this->validation = $validation;
}
现在,有没有办法告诉应用在一种情况下实例化 LoginUserValidationService 而在另一种情况下实例化 RegisterUserValidationService?欢迎提供任何线索和提示。
更新
解决这个绑定问题的一种方法在于 php 扩展接口的能力。因此可以引入两个扩展ValidationServiceInterface 的接口(@987654326@ 和RegisterUserValidationServiceInterface)。然后第一个由LoginUserValidationService 实现,这是LoginController 中需要的,第二个是RegisteUserValidationService 实现的,这是RegistrationController 中需要的。
这种方案的好处是仍然可以使用 laravel 的 ioc 绑定。 ValidationServiceProvider 类是注册绑定的好位置:
class ValidationServiceProvider extends Illuminate\Support\ServiceProvider {
public function register(){
$this->app->bind(
'LoginUserValidationServiceInterface',
'LoginUserValidationService'
);
$this->app->bind(
'RegisterUserValidationServiceInterface',
'RegisterUserValidationService'
);
}
}
因此保持了 ioc 容器的可用性。它的代价是引入两个接口。可能有点矫枉过正,但我现在选择这样做......
【问题讨论】:
-
应该不需要 ValidationService 的接口。我所做的是让我的 ValidationServer 成为一个抽象类,它只使用 Laravel Validator 处理 Validation。您验证的规则和不同的情况应该放在 UserValidator 中,它会扩展抽象类 ValidationService。然后你可以打电话给
$userValidator->validateForRegistration($user);或$userValidator->validateForLogin($user);。然后,如果您有其他模型,而不是用户,您可以创建一个新类,该类将再次扩展抽象类。 -
我的设置看起来几乎一样,您的解决方案是合法的。您处理问题的方式与我的方法之间的差异似乎是您将验证责任委托给了 UserValidator 类的两个方法。我希望让它与两个类(
LoginUserValidationService和RegisterUserValidationService)一起工作,它们都实现相同的接口并扩展相同的抽象类(也称为ValidationService)。唔。可能我也会走你的路。所以谢谢你的提示。