如何覆盖包中的单个函数以供laravel内部使用?

时间:2018-05-30 14:40:06

标签: laravel package

我想覆盖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);
    }
}

我现在想将它注册为要使用的新类。我明白这应该在serviceprovider中完成,但是怎么做?

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

这不起作用

1 个答案:

答案 0 :(得分:2)

创建一个名为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']);
    });
}

请注意,在单例方法中,我正在使用您的刀片编译器类。

然后,打开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配置文件指定使用扩展视图服务提供程序而不是照亮服务提供程序。