我想覆盖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);
}
}
这不起作用
答案 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配置文件指定使用扩展视图服务提供程序而不是照亮服务提供程序。