我已经扩展了标准的laravel Translator类,我需要使用依赖项创建它。当我制作标准的译者课程时,它就像一个魅力:
app()->make('Illuminate\Translation\Translator')
但是当我尝试制作自定义课程时,我收到Illuminate\Translation\LoaderInterface is not instantiable
错误:
app()->make('App\Services\MyTranslator')
为什么我会收到此类错误,而LoaderInterface
适用于标准Translator
类?
答案 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的更多信息。