Laravel 4.2: поиск и устранение неисправностей & quot; цель не подлежит созданию & quot; ошибка

Я застрял на этой ошибке «Target not instantiable» в течение последних 2-3 дней, и я понятия не имею, почему. Кто-то вчера в чате IRC #laravel предложил использовать var_dump(App::make('Project\Frontend\Repo\Lead\LeadInterface')) когда в интерфейсе ремесленника Artisan, который я сделал и получил этот ответ:

class Project\Frontend\Repo\Lead\EloquentLead#798 (1) {
protected $lead =>
class Lead#809 (21) {
// bunch of info about the model etc relating to the interface and it's repo class
}
}

Один из участников #laravel отметил, что это означало, что интерфейс был создан, и это прекрасно, но потом я понял, что это не тот интерфейс, с которым у меня проблема.

Итак, ниже, как у меня все настроено. Интерфейс, который, по-видимому, не создан, является ValidableInterface (последняя часть кода) и работает var_dump(App::make('Project\Backend\Service\Validation\ValidableInterface'))
возвращает страшную ошибку «Target not instantiable».

РЕДАКТИРОВАТЬ: new LeadFormLaravelValidator( $app['validator'] ) расширяет AbstractLaravelValidator, который реализует ValidableInterface.

Я скучаю по какой-то явной проблеме с моим кодом?

Мой поставщик услуг

<?php namespace Project\Frontend\Service\Form;

use Illuminate\Support\ServiceProvider;
use Project\Frontend\Service\Form\Lead\LeadForm;
use Project\Frontend\Service\Form\Lead\LeadFormLaravelValidator;

class FormServiceProvider extends ServiceProvider {

/**
* Register the binding
*
* @return void
*/
public function register()
{
$app = $this->app;

$app->bind('Project\Frontend\Service\Form\Lead\LeadForm', function($app)
{
return new LeadForm(
new LeadFormLaravelValidator( $app['validator'] ),
$app->make('Project\Frontend\Repo\Lead\LeadInterface')
);
});
}

}

Моя форма класса

<?php namespace Project\Frontend\Service\Form\Lead;

use Project\Backend\Service\Validation\ValidableInterface;
use Project\Frontend\Repo\Lead\LeadInterface;

class LeadForm {

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

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

/**
* Lead repository
*
* @var \Project\Frontend\Repo\Lead\LeadInterface
*/
protected $lead;

public function __construct(ValidableInterface $validator, LeadInterface $lead)
{
$this->validator = $validator;
$this->lead = $lead;
}

Мои правила проверки

<?php namespace Project\Frontend\Service\Form\Lead;

use Project\Backend\Service\Validation\AbstractLaravelValidator;

class LeadFormLaravelValidator extends AbstractLaravelValidator {

/**
* Validation rules
*
* @var Array
*/
protected $rules = array(
'name'              => 'required|regex:/^[a-zA-Z-\s]+$/',
'email'             => 'email',
'cell'              => 'required|numeric|digits_between:10,11',
);

/**
* Validation messages
*
* @var Array
*/
protected $messages = array(
'regex'                 => 'The :attribute may only contain letters, dashes and spaces.',
'digits_between'        => 'The :attribute must be 10 numbers long.',
);

}

Мой абстрактный валидатор

<?php 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;
}

/**
* Set data to validate
*
* @return \Project\Backend\Service\Validation\AbstractLaravelValidator
*/
public function with(array $data)
{
$this->data = $data;

return $this;
}

/**
* Validation passes or fails
*
* @return Boolean
*/
public function passes()
{
$validator = $this->validator->make($this->data, $this->rules, $this->messages);

if( $validator->fails() )
{
$this->errors = $validator->messages();
return false;
}

return true;
}

/**
* Return errors, if any
*
* @return array
*/
public function errors()
{
return $this->errors;
}

}

Мой интерфейс валидатора

<?php namespace Project\Backend\Service\Validation;

interface ValidableInterface {

/**
* Add data to validation against
*
* @param array
* @return \Project\Backend\Service\Validation\ValidableInterface  $this
*/
public function with(array $input);

/**
* Test if validation passes
*
* @return boolean
*/
public function passes();

/**
* Retrieve validation errors
*
* @return array
*/
public function errors();

}

0

Решение

Я считаю, что проблема в том, $app->make('Project\Frontend\Repo\Lead\LeadInterface'), У Laravel нет возможности узнать, какой класс здесь создавать. Вы должны сказать Laravel, выполнив:

$app->bind('Project\Frontend\Repo\Lead\LeadInterface', 'Your\Implementation\Of\LeadInterface');

редактировать

Странно, что вы получаете это исключение, так как вы создаете экземпляр вручную LeadForm и ввести LeadFormLaravelValidator, Однако это, вероятно, должно решить проблему:

$app->bind('Project\Backend\Service\Validation\ValidableInterface',
'Project\Frontend\Service\Form\Lead\LeadFormLaravelValidator');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]