Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “我该如何解决?”;目标[接口]不可实例化“;在拉威尔4号?_Php_Laravel_Laravel 4_Inversion Of Control_Ioc Container - Fatal编程技术网

Php “我该如何解决?”;目标[接口]不可实例化“;在拉威尔4号?

Php “我该如何解决?”;目标[接口]不可实例化“;在拉威尔4号?,php,laravel,laravel-4,inversion-of-control,ioc-container,Php,Laravel,Laravel 4,Inversion Of Control,Ioc Container,我的错误消息: Illuminate \ Container \ BindingResolutionException Target [Project\Backend\Service\Validation\ValidableInterface] is not instantiable. 我知道接口和抽象类是不可实例化的,所以我知道Laravel不应该试图实例化我的接口。然而,不知何故,它试图,我怀疑这可能是一个约束问题…尽管我相信我已经正确地约束了它,并已将其注册为服务提供商 我应该提到的是

我的错误消息:

Illuminate \ Container \ BindingResolutionException 
Target [Project\Backend\Service\Validation\ValidableInterface] is not instantiable.
我知道接口和抽象类是不可实例化的,所以我知道Laravel不应该试图实例化我的接口。然而,不知何故,它试图,我怀疑这可能是一个约束问题…尽管我相信我已经正确地约束了它,并已将其注册为服务提供商

我应该提到的是,我从Chris Fidao的“实现Laravel”中选取了这个例子,它几乎是一样的

这是我的表单类的前几行:

namespace Project\Backend\Service\Form\Job;

use Project\Backend\Service\Validation\ValidableInterface;
use Project\Backend\Repo\Job\JobInterface;

class JobForm {

    /**
     * Form Data
     *
     * @var array
     */
    protected $data;

    /**
     * Validator
     *
     * @var \Project\Backend\Form\Service\ValidableInterface
     */
    protected $validator;

    /**
     * Job repository
     *
     * @var \Project\Backend\Repo\Job\JobInterface
     */
    protected $job;

    public function __construct(ValidableInterface $validator, JobInterface $job)
    {
        $this->validator = $validator;
        $this->job = $job;
    }
这是我的validator类的前几行:

namespace Project\Backend\Service\Form\Job;

use Project\Backend\Service\Validation\AbstractLaravelValidator;

class JobFormValidator extends AbstractLaravelValidator {

    // Includes some validation rules
这是抽象验证器:

namespace Project\Backend\Service\Validation;

use Illuminate\Validation\Factory;

abstract class AbstractLaravelValidator implements ValidableInterface {

    /**
     * Validator
     *
     * @var \Illuminate\Validation\Factory
     */
    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 Project\Backend\Service\Validation;

use Illuminate\Support\ServiceProvider;
use Project\Backend\Service\Form\Job\JobFormValidator;

class ValidationServiceProvider extends ServiceProvider {

    public function register()
    {
        $app = $this->app;

        $app->bind('Project\Backend\Service\Form\Job\JobFormValidator', function($app)
        {
            return new JobFormValidator($app['validator']);
        });
    }
}
然后在app/config/app.php中注册:

.....
'Project\Backend\Service\Validation\ValidationServiceProvider',
....
最后是我的控制器的前几行:

use Project\Backend\Repo\Job\JobInterface;
use Project\Backend\Service\Form\Job\JobForm;

class JobController extends \BaseController {

    protected $jobform;

    function __construct(JobInterface $job, JobForm $jobform)
    {
        $this->job = $job;
        $this->jobform = $jobform;
    }

当通过类型暗示将某个接口注入构造函数时,您需要告诉Laravel它应该为该接口使用哪个实例

您可以使用
bind()
方法执行此操作(例如,在您的服务提供商中)


我强烈建议您观看Laravel的创建者Taylor Otwell解释这一点和其他一些事情的地方。

首先,您需要使用

/app/Providers/AppServiceProvider.php

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
        $this->app->bind('JobInterface', 'Job');

    }

}

有用的视频,并解释关键概念。但是我仍然不清楚,因为ValidableInterface仅由抽象类实现。然后,在将其添加到bindings.php之后,指定扩展抽象类的类(并因此实现接口),然后需要运行composer update命令
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
        $this->app->bind('JobInterface', 'Job');

    }

}