PHP / Laravel - 无法启动抽象类的扩展

时间:2013-11-22 10:02:16

标签: php oop interface laravel-4 abstract-class

我很擅长在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类也只是一个普通类。

我在这里做错了什么?

2 个答案:

答案 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')

实例化Factory类

在实例化SomeClassExtender类时以这种方式执行。

$someClassExtender = new SomeClassExtender( App::make('validator') );

本文由@PhilipBrown为Laravel 4提供高级验证即服务 - http://culttt.com/2014/01/13/advanced-validation-service-laravel-4/