Как переопределить одну функцию в пакете для внутреннего использования с laravel? - PullRequest
0 голосов
/ 30 мая 2018

Я хотел бы переопределить функцию в vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php

или, если быть точным, функция находится за пределами признака Illuminate\View\Compilers\Concerns\CompilesEchos.php, используемого этим файлом.Однако я не смог найти очень четкую информацию о том, как переопределить пакеты.Может кто-нибудь, пожалуйста, помогите мне понять, как.

Я понимаю, что мне нужно расширить BladeCompiler

Давайте назовем его MyBladeCompiler

class MyBladeCompiler extends BladeCompiler
{
    public function compileEchoDefaults($value)
    {
        return 'test';
        return preg_replace('/^(?=\$)(.+?)(?:\s+or\s+)(.+?)$/si', 'isset($1) ? $1 : $2', $value);
    }
}

Теперь я хотел бы зарегистрировать его какновый класс для использования.Я понимаю, что это должно быть сделано в сервис-провайдере, но как?

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
      $this->app->bind(BladeCompiler::class, MyBladeCompiler ::class);
    }
}

это не работает

1 Ответ

0 голосов
/ 30 мая 2018

Создайте нового поставщика услуг с именем ViewServiceProvider, затем в нем удалите регистр и методы загрузки и увеличьте его Illuminate\View\ViewServiceProvider.

Затем добавьте этот метод:

public function registerBladeEngine($resolver)
{
    // The Compiler engine requires an instance of the CompilerInterface, which in
    // this case will be the Blade compiler, so we'll first create the compiler
    // instance to pass into the engine so it can compile the views properly.
    $this->app->singleton('blade.compiler', function () {
        return new MyBladeCompiler(
            $this->app['files'], $this->app['config']['view.compiled']
        );
    });

    $resolver->register('blade', function () {
        return new CompilerEngine($this->app['blade.compiler']);
    });
}

Обратите внимание, что в методе singleton я использую ваш класс блейд-компилятора.

Затем откройте config/app.php и замените запись \Illuminate\View\BladeServiceProvider::class вашей собственной.поставщик услуг.

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

namespace App\Providers;

use MyBladeCompiler
use Illuminate\View\ViewServiceProvider as BaseViewServiceProvider;

class ViewServiceProvider extends BaseViewServiceProvider
{
    public function registerBladeEngine($resolver)
    {
        $this->app->singleton('blade.compiler', function () {
            return new MyBladeCompiler(
                $this->app['files'], $this->app['config']['view.compiled']
            );
        });

        $resolver->register('blade', function () {
            return new CompilerEngine($this->app['blade.compiler']);
        });
    }
}

Это работает за счет расширения поставщика услуг просмотра Illuminate, поэтому все существующие методы работают должным образом.Затем вам нужно переопределить метод registerBladeEngine(), чтобы вызывался ваш переопределенный метод, а не тот, который есть у поставщика освещения.

В вашем переопределенном методе вы указываете, что вместо исходного должен использоваться ваш компилятор.

Затем вы указываете, что ваш поставщик услуг расширенного просмотра используется вместо подсвеченного,редактирование файла конфигурации app.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...