2013-11-22 9 views
3

我在使用PHP中的抽象类和接口方面很新颖。PHP/Laravel - 无法启动抽象类的扩展

我试图启动一个抽象类的扩展,但它不会工作。这可能是我遇到的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类的初始化,那么错误消失了。工厂班也只是一个普通班。

我在这里做错了什么?

+2

错误是不相关的代码,你已经证明 – hek2mgl

+0

凡涉及到的错误?到“工厂”班? – Hak

+0

'目标[Symfony \ Component \ Translation \ TranslatorInterface]是不可实例化的。' – hek2mgl

回答

5

我看到你在追踪Chris Fidao的书。和你一样有错误。

这是我的解决办法,就把这里面global.php

App::bind('Symfony\Component\Translation\TranslatorInterface', function($app) { 
    return $app['translator']; 
}); 

编辑:

我觉得跟工厂的问题是,你需要翻译界面$应用[“翻译”绑定]。这里是我的发现......

如果你看一下工厂类,它需要转换器接口 - 快速浏览到API在其公共__construct:

public function __construct(TranslatorInterface $translator, Container $container = null) 
{ 
    $this->container = $container; 
    $this->translator = $translator; 
} 

然后,如果你看一下在ValidationServiceProvider公共功能寄存器(),你会发现,Laravel结合的TranslatorInterface至$应用[“翻译”]:

$validator = new Factory($app['translator'], $app); 

然后似乎是一个服务提供商$应用程序绑定[“翻译”]需要,或者我们可以将其绑定在global.php中。

+0

中实例化Symfony \ Component \ Translation \ TranslatorInterface,有没有什么见解为什么他的书不包含这个? –

+0

我发现这个:https://github.com/fideloper/Implementing-Laravel/issues/14。显然他在Forms Service中提到了它。 –

0

我认为这是最好的工作解决方案,找到了相同的确切问题。通过解决它, 注入Validator Facade中已经绑定的“验证器”对象。

<?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/