ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-31 10:29:51  阅读:221  来源: 互联网

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


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

我在这做错了什么?

解决方法:

我看到你正在关注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中.

标签:php,oop,interface,abstract-class,laravel-4
来源: https://codeday.me/bug/20190831/1774785.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有