我很擅长在PHP中使用抽象类和接口。
我正在尝试启动一个抽象类的扩展,但它不起作用。这可能是我遇到的Laravel特定问题。
情况就是这样:
这是界面:
<?php namespace Collection\Services\Validation;
interface SomeInterface {
public function with(array $input);
public function passes();
public function errors();
}
这是抽象类:
<?php namespace Collection\Services\Validation;
use Illuminate\Validation\Factory;
abstract class SomeClass implements SomeInterface {
protected $validator;
protected $data = array();
protected $errors = array();
protected $rules = array();
public function __construct(Factory $validator)
{
$this->validator = $validator;
}
public function with(array $data)
{
$this->data = $data;
return $this;
}
public function passes()
{
$validator = $this->validator->make($this->data, $this->rules);
if( $validator->fails() )
{
$this->errors = $validator->messages();
return false;
}
return true;
}
public function errors()
{
return $this->errors;
}
}
这是“常规”课程:
<?php namespace Collection\Services\Validation;
class SomeClassExtender extends SomeClass {
public function sayBye()
{
return 'bye';
}
}
这是实施:
<?php
use Collection\Services\Validation\PageFormValidator;
use Collection\Services\Validation\SomeClassExtender;
class PagesController extends BaseController {
protected $someClass;
public function __construct(SomeClassExtender $class)
{
$this->someClass = $class;
}
然后我收到了这个错误:
Illuminate \ Container \ BindingResolutionException
Target [Symfony\Component\Translation\TranslatorInterface] is not instantiable.
如果我删除了Factory类的启动,则错误消失了。 Factory类也只是一个普通类。
我在这里做错了什么?
答案 0 :(得分:5)
我看到你正在关注Chris Fidao的书。得到了和你一样的错误。
这是我的解决方案,将其放在global.php
中App::bind('Symfony\Component\Translation\TranslatorInterface', function($app) {
return $app['translator'];
});
编辑:
我认为Factory的问题是您需要将翻译器界面绑定到$ app ['translator']。这是我发现的......
如果查看Factory类,它需要翻译器界面 - 快速浏览API中的public __construct:
public function __construct(TranslatorInterface $translator, Container $container = null)
{
$this->container = $container;
$this->translator = $translator;
}
然后,如果您查看ValidationServiceProvider中的公共函数register(),您会发现Laravel将TranslatorInterface绑定到$ app ['translator']:
$validator = new Factory($app['translator'], $app);
然后看起来像是一个绑定$ app ['translator']的服务提供者,或者我们可以将它绑定在global.php中。
答案 1 :(得分:0)
我认为这是最好的解决方案,发现同样的问题。解决了它, 在Validator Facade中注入已绑定的“validator”对象。
<?php namespace Illuminate\Support\Facades;
/**
* @see \Illuminate\Validation\Factory
*/
class Validator extends Facade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'validator'; }
}
使用App::make('validator')
在实例化SomeClassExtender类时以这种方式执行。
$someClassExtender = new SomeClassExtender( App::make('validator') );
本文由@PhilipBrown为Laravel 4提供高级验证即服务 - http://culttt.com/2014/01/13/advanced-validation-service-laravel-4/