Php 在Laravel服务提供商中,更换服务的最佳方式是什么?
我想将Laravel框架提供的服务替换为我自己的服务,扩展相同的Laravel服务。在这种情况下,我想交换Php 在Laravel服务提供商中,更换服务的最佳方式是什么?,php,laravel,Php,Laravel,我想将Laravel框架提供的服务替换为我自己的服务,扩展相同的Laravel服务。在这种情况下,我想交换BladeCompiler服务 Laravel提供的默认ViewServiceProvider执行以下操作: use Illuminate\View\Engines\BladeCompiler; use Illuminate\View\Engines\CompilerEngine; ... public function registerBladeEngine($resolver) {
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这一部分的任何修改都会破坏我的应用程序
我真正想做的是创建另一个类来扩展默认的blade编译器类,为其添加更多功能
有人有更好的主意吗
编辑:
在描述这个问题时,Taylor将对4.1进行更改,使扩展服务更容易(至少是刀片编译器)。您可以查看服务提供商的(很棒的)软件包。该包所做的是注册另一个视图处理程序(在本例中为.twig文件)。由于您可能希望为扩展刀片文件(.bladex?)使用不同的扩展名,您可以执行以下操作 [警告:未测试的代码
$app['view']->addExtension('bladex','bladex',function() use($app)
{
$cache = $app['path.storage'].'/views';
$compiler = new BladeXCompiler($app['files'], $cache);
return new CompilerEngine($compiler, $app['files']);
}
我相信你有两个选择:
extend()
方法$resolver->register('blade', function() use ($app)
{
$cache = $app['path.storage'].'/views';
// This is where your extended class would go.
$compiler = new BladeCompiler($app['files'], $cache);
return new CompilerEngine($compiler, $app['files']);
});
您可以通过以下方式访问服务提供商中的视图类“EngineResolver”:
$this->app['view']->getEngineResolver()
总而言之,您只剩下以下几点(替换类名并在适当的地方修改use
):
好主意。正如您所注意到的,刀片在Laravel中太深,所以更换刀片可能会在内部损坏很多东西。若你们唯一想做的就是替换默认的模板引擎,那个么在laravel论坛上也有一些讨论,我认为你们应该写你们自己的软件包。你们能更详细地解释你们的最终目标吗(使用你们自己的模板引擎?)?为什么只需要更改
use
语句?ThnxI想继续使用Blade,但我想增加它的功能性。我打开了编译器文件,这是小菜一碟。所以,我想实现一些新特性。简而言之,我将创建一个My\View\Engines\BladeCompiler
,它扩展illighted\View\Engines\BladeCompiler
。因为我只需要实例化我自己的类,所以我只需要复制提供者的方法并更改use语句。我的建议是向laravel本身发送一个补丁,将BladeCompiler
对象提取到blade.compiler
服务中。然后,您自己的提供商就可以覆盖blade.compiler
,而根本不需要触及blade
服务。我并不真的需要另一个视图处理程序,我只想向blade添加更多功能。事实上,我在我的应用程序中做了很多扩展,因此,一个解决方案使我能够使用尽可能少的代码设置新类而不是默认类。
<?php
use Illuminate\Support\ServiceProvider;
use Illuminate\View\Engines\CompilerEngine;
class ExtendBladeServiceProvider extends ServiceProvider {
public function register()
{
$resolver = $this->app['view']->getEngineResolver();
$resolver->register('blade', function() use ($app)
{
$cache = $app['path.storage'].'/views';
$compiler = new MyBladeCompiler($app['files'], $cache);
return new CompilerEngine($compiler, $app['files']);
});
}
}
public function boot()
{
$blade = $this->app['view']->getEngineResolver()->resolve('blade')->getCompiler();
$blade->extend(function($value) use ($blade)
{
$matcher = $blade->createMatcher('myfeature');
return preg_replace($matcher, '<?php echo MyFeature::make$2; ?>', $value);
});
}