Laravel расширяет класс поставщиков - PullRequest
0 голосов
/ 13 сентября 2018

Я попытался расширить переводчик класса 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 withсообщение 'Target [Illuminate \ Translation \ LoaderInterface] не создается при сборке [App \ Repositories \ Translation \ TranslationTranslator].'

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

Это сработало для меня

$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);
});

Я надеюсь, что это поможет вам

0 голосов
/ 13 сентября 2018

Проверьте ниже пример

namespace App\Repositories\Translation;

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

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

Не нужно ничего.вам нужно только добавить новые функции или переопределить функции базового класса.Тогда вы можете использовать этот класс как простые другие классы.

0 голосов
/ 13 сентября 2018

Вы можете использовать замыкание для разрешения классов

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

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

Во-вторых, переводчик связан с laravel при использовании translator псевдонима.

Вы также можете переопределить его.

$this->app->bind('translator', function(){
        return new \App\Repositories\Translation\TranslationTranslator; 
    })
0 голосов
/ 13 сентября 2018

Попробуйте изменить это на следующее:

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

Это должно затем изменить экземпляр интерфейса.

ОБНОВЛЕНИЕ

, если выпросто пытаясь добавить новый метод, класс Translator является Macroable.Таким образом, вы можете сделать следующее:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...