php – 如何在Laravel 4中解决“目标[接口]不可实现”?
发布时间:2020-12-14 19:44:09 所属栏目:大数据 来源:网络整理
导读:我的错误信息: Illuminate Container BindingResolutionException Target [ProjectBackendServiceValidationValidableInterface] is not instantiable. 我知道接口和抽象类是不可实例化的,所以我知道Laravel不应该尝试实例化我的接口.但不知何故,它
我的错误信息:
Illuminate Container BindingResolutionException Target [ProjectBackendServiceValidationValidableInterface] is not instantiable. 我知道接口和抽象类是不可实例化的,所以我知道Laravel不应该尝试实例化我的接口.但不知何故,它正在努力,我怀疑这可能是一个具有约束力的问题……即使我相信我已经正确绑定它并将其注册为服务提供商. 我应该提一下,我从Chris Fidao的“实施Laravel”中取出了这个例子,它几乎完全相同! 这是我的表单类的前几行: namespace ProjectBackendServiceFormJob; use ProjectBackendServiceValidationValidableInterface; use ProjectBackendRepoJobJobInterface; class JobForm { /** * Form Data * * @var array */ protected $data; /** * Validator * * @var ProjectBackendFormServiceValidableInterface */ protected $validator; /** * Job repository * * @var ProjectBackendRepoJobJobInterface */ protected $job; public function __construct(ValidableInterface $validator,JobInterface $job) { $this->validator = $validator; $this->job = $job; } 这是我的验证器类的前几行: namespace ProjectBackendServiceFormJob; use ProjectBackendServiceValidationAbstractLaravelValidator; class JobFormValidator extends AbstractLaravelValidator { // Includes some validation rules 这是抽象验证器: namespace ProjectBackendServiceValidation; use IlluminateValidationFactory; abstract class AbstractLaravelValidator implements ValidableInterface { /** * Validator * * @var IlluminateValidationFactory */ protected $validator; /** * Validation data key => value array * * @var Array */ protected $data = array(); /** * Validation errors * * @var Array */ protected $errors = array(); /** * Validation rules * * @var Array */ protected $rules = array(); /** * Custom validation messages * * @var Array */ protected $messages = array(); public function __construct(Factory $validator) { $this->validator = $validator; } 这是我将其全部绑定到应用程序的代码: namespace ProjectBackendServiceValidation; use IlluminateSupportServiceProvider; use ProjectBackendServiceFormJobJobFormValidator; class ValidationServiceProvider extends ServiceProvider { public function register() { $app = $this->app; $app->bind('ProjectBackendServiceFormJobJobFormValidator',function($app) { return new JobFormValidator($app['validator']); }); } } 然后在app / config / app.php中注册: ..... 'ProjectBackendServiceValidationValidationServiceProvider',.... 最后这些是我的控制器的前几行: use ProjectBackendRepoJobJobInterface; use ProjectBackendServiceFormJobJobForm; class JobController extends BaseController { protected $jobform; function __construct(JobInterface $job,JobForm $jobform) { $this->job = $job; $this->jobform = $jobform; } 解决方法
当通过类型提示将它注入构造函数时,您需要告诉Laravel它应该用于某个接口的实例.
您可以使用bind()方法(例如在服务提供者中)执行此操作 $app->bind('JobInterface','Job'); // Job being the class you want to be used 我强烈建议你观看the video here,Laravel的创造者Taylor Otwell解释了这个以及其他一些事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |