Laravel:如何修复界面是不是有不稳定的错误?

时间:2015-06-05 06:23:07

标签: laravel

我已经扩展了标准的laravel Translator类,我需要使用依赖项创建它。当我制作标准的译者课程时,它就像一个魅力:

app()->make('Illuminate\Translation\Translator')

但是当我尝试制作自定义课程时,我收到Illuminate\Translation\LoaderInterface is not instantiable错误:

app()->make('App\Services\MyTranslator')

为什么我会收到此类错误,而LoaderInterface适用于标准Translator类?

1 个答案:

答案 0 :(得分:1)

您收到该错误是因为构造函数的类型暗示了一个接口,但您没有告诉Laravel如何解析该接口。由于您还没有告诉它如何解析接口,Laravel会尝试直接实例化它,这会产生错误。

内置翻译器有一个服务提供者,告诉Laravel如何创建Translator对象。您可以在Illuminate/Translation/TranslationServiceProvider.php处查看。

因此,您需要为翻译人员创建服务提供商。

创建新文件app/Providers/MyTranslationServiceProvider.php。该文件应如下所示:

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MyTranslationServiceProvider extends ServiceProvider {

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('App\Services\MyTranslator', function($app)
        {
            $loader = $app['translation.loader'];

            // When registering the translator component, we'll need to set the default
            // locale as well as the fallback locale. So, we'll grab the application
            // configuration so we can easily get both of these values from there.
            $locale = $app['config']['app.locale'];

            $trans = new \App\Services\MyTranslator($loader, $locale);

            $trans->setFallback($app['config']['app.fallback_locale']);

            return $trans;
        });
    }
}

该代码几乎是从Laravel翻译服务提供商处复制的。您可以更改正确设置对象所需的任何内容。

现在,编辑您的config/app.php文件,将新的服务提供商添加到providers阵列。

现在你应该好好去。您可以阅读有关服务提供商here的更多信息。