【发布时间】:2013-11-20 17:11:53
【问题描述】:
我想将 Laravel 框架提供的服务替换为我自己的服务,该服务扩展了相同的 Laravel 服务。在这种特定情况下,我想交换BladeCompiler 服务。
Laravel 提供的默认 ViewServiceProvider 是这样的:
use Illuminate\View\Engines\BladeCompiler;
use Illuminate\View\Engines\CompilerEngine;
...
public function registerBladeEngine($resolver)
{
$app = $this->app;
$resolver->register('blade', function() use ($app)
{
$cache = $app['path.storage'].'/views';
$compiler = new BladeCompiler($app['files'], $cache);
return new CompilerEngine($compiler, $app['files']);
});
}
我唯一需要做的就是扩展提供者,覆盖方法并替换编译器类。在这种情况下,My\View\Engines\BladeCompiler。
但要做到这一点,我必须将所有函数复制并粘贴到我的服务提供商,然后替换 use 语句。这是一种糟糕的做法,因为对 Laravel 的那部分进行任何修改都会破坏我的应用程序。
我真正想做的是创建另一个扩展默认刀片编译器类的类,为其添加更多功能。
有人有更好的主意吗?
编辑:
I opened an issue 描述了该问题,Taylor 将对 4.1 进行更改,使扩展服务更加容易(至少是刀片编译器)。
【问题讨论】:
-
有趣的想法。正如你所注意到的,Blade 在 Laravel 中太深了,所以替换它可能会在内部破坏很多东西。如果你只想替换默认的模板引擎,在 laravel 论坛上有一些讨论forums.laravel.io/viewtopic.php?id=5346 无论如何,我认为你应该编写自己的包
-
你能解释一下你的最终目标吗(使用你自己的模板引擎?)?为什么只需要更改
use语句?谢谢 -
我想继续使用 Blade,但我想为其添加功能。我打开了编译器文件,简直是小菜一碟。所以,我想实现一些新功能。简而言之,我将创建一个扩展
Illuminate\View\Engines\BladeCompiler的My\View\Engines\BladeCompiler。由于我只需要实例化我自己的类,因此我只需要复制提供者的方法并更改 use 语句。 -
我的建议是向 laravel 本身发送一个补丁,将
BladeCompiler对象提取到blade.compiler服务中。然后,您自己的提供者可以直接覆盖blade.compiler,而无需触及blade服务。