将两个实现绑定到一个接口是否可能是laocvel中的ioc方式?

时间:2014-01-07 00:26:33

标签: laravel laravel-4

更新见下文

在laravel文档中,我找到了将一个实现绑定到其接口的良好描述,这有利于单元测试目的。但是说我想绑定两个共享相同接口的实现,这也可能吗?

我正在尝试将不同的ValidationServices注入LoginControllerRegisterController的构造方法。两种构造方法都是这样的

public function __construct(ValidationServiceInterface $validation) {
        $this->validation = $validation;
    }

现在,有没有办法告诉应用在一种情况下实例化说LoginUserValidationService并在另一种情况下实例化RegisterUserValidationService?欢迎提供任何线索和提示。

更新 解决此绑定问题的一种方法是php扩展接口的能力。因此,可以引入两个扩展LoginUserValidationServiceInterface的接口(RegisterUserValidationServiceInterfaceValidationServiceInterface)。第一个是LoginUserValidationService实现的LoginControllerRegisteUserValidationService需要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容器的可用性。它的价格是引入了两个接口。可能是矫枉过正,但我​​现在选择这样做......

1 个答案:

答案 0 :(得分:1)

是。但是,LoginUserValidationServiceRegisterUserValidationService都应该实现ValidationServiceInterface

class LoginUserValidationService implements ValidationServiceInterface
{
    //..
}

那么你可以这样做:

$controller = new LoginController(new LoginUserValidationService);