【问题标题】:Laravel Extend Vendor ClassLaravel 扩展供应商类
【发布时间】:2019-02-18 03:11:19
【问题描述】:

我尝试扩展一个 Illuminate 类转换器

我创建了一个类并扩展到翻译 然后我将此行添加到我的 RepositoryServiceProvider

$this->app->bind(\Illuminate\Translation\Translator::class, \App\Repositories\Translation\TranslationTranslator::class);

但它不起作用

我做错了什么?

类如下

<?php

namespace App\Repositories\Translation;

use Countable;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use Illuminate\Support\Traits\Macroable;
use Illuminate\Support\NamespacedItemResolver;
use Symfony\Component\Translation\MessageSelector;
use Symfony\Component\Translation\TranslatorInterface;


class TranslationTranslator extends \Illuminate\Translation\Translator
{
    /**
     * Parse a key into namespace, group, and item.
     *
     * @param  string  $key
     * @return array
     */
    public function parseKey($key)
    {
        \Log::info('got in');
        die;
        $segments = parent::parseKey($key);

        if (is_null($segments[0])) {
            $segments[0] = @explode('.', $segments[2])[0];
        }
        if ($segments[1] == 'translatable') {
            $segments[1] = @explode('.', $segments[2])[0] . '_' . @explode('.', $segments[2])[1];
        }
        return $segments;
    }
}

更新

显然 Translator 类有一个构造函数

 public function __construct(LoaderInterface $loader, $locale)
    {
        $this->loader = $loader;
        $this->locale = $locale;
    }

所以我的绑定必须通过接口..无法实例化

 public function boot()
{
    $app = $this->app;
    $this->app->bind(\Illuminate\Translation\Translator::class, function() use ($app){
        return $app->make(\App\Repositories\Translation\TranslationTranslator::class);
    });        
}

得到这个错误

Illuminate\Contracts\Container\BindingResolutionException 与消息 '目标 [Illuminate\Translation\LoaderInterface] 不可实例化 在构建 [App\Repositories\Translation\TranslationTranslator] 时。'

【问题讨论】:

标签: php laravel translation


【解决方案1】:

尝试将其更改为:

$this->app->instance(\Illuminate\Translation\Translator::class, \App\Repositories\Translation\TranslationTranslator::class);

这应该会改变接口的实例。

更新

如果您只是想添加一个新方法,Translator 类是可宏的。因此,您可以执行以下操作

Translator::macro('parseKey', function ($key) {
    \Log::info('got in');
    die;
    $segments = parent::parseKey($key);

    if (is_null($segments[0])) {
        $segments[0] = @explode('.', $segments[2])[0];
    }
    if ($segments[1] == 'translatable') {
        $segments[1] = @explode('.', $segments[2])[0] . '_' . @explode('.', $segments[2])[1];
    }
    return $segments;
});

然后你就可以像往常一样调用你的方法了。例如:

app(Translator::class)->parseKey($key);

【讨论】:

  • 这不起作用..我需要清除缓存吗?
  • 您的服务提供商是否已在您的app.php 文件中注册,您是否将此调用放入boot 方法中?
【解决方案2】:

查看以下示例

namespace App\Repositories\Translation;

use Illuminate\Translation\Translator;
class TranslationTranslator extends Translator
{

    public function get()
    {
        ....
    }
}

什么都不需要。您只需要添加新函数或覆盖基类函数。然后你可以把这个类当作简单的其他类来使用。

【讨论】:

  • 你能解释一下具体需要做什么吗? Laravel 应该如何知道这个被覆盖的类?
  • @NicoHaase laravel 自动加载 app 目录中的所有类。所以你不需要加载这个文件..关于覆盖。我们扩展Vendor 包类。通过使用它,我们可以在新文件中覆盖或添加新函数。
  • 我正在尝试用我自己的翻译器类中名为 parseKey() 的方法替换一个方法
  • @GarinePondikian 检查Vendor 类依赖项。并添加到这个文件中。
  • @LuckySaini 我认为另一个绑定在运行时覆盖了我的绑定。我做了以上所有操作,但没有任何效果
【解决方案3】:

你可以使用闭包来解析类

$this->app->bind(\Illuminate\Translation\Translator::class, function(){

    return new \App\Repositories\Translation\TranslationTranslator;
});

第二个翻译器使用translator别名与laravel绑定。

你也可以覆盖它。

$this->app->bind('translator', function(){
        return new \App\Repositories\Translation\TranslationTranslator; 
    })

【讨论】:

    【解决方案4】:

    这对我有用

    $app = $this->app;
    $loader = $app['translation.loader'];
    $locale = $app['config']['app.locale'];
    
    $this->app->bind('translator', function() use ($loader, $locale){
        return new \App\Repositories\Translation\TranslationTranslator($loader, $locale);
    });
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2018-03-29
      • 2019-04-05
      • 2017-05-05
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2021-07-15
      相关资源
      最近更新 更多