Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel服务提供商中,更换服务的最佳方式是什么?_Php_Laravel - Fatal编程技术网

Php 在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) {

我想将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这一部分的任何修改都会破坏我的应用程序

我真正想做的是创建另一个类来扩展默认的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']);
}

我相信你有两个选择:

  • 用您自己的覆盖服务提供商
  • 利用BladeCompiler的
    extend()
    方法
  • 选项1:服务提供商复制和粘贴 您要做的关键事情是用扩展版本覆盖Blade编译器。由于整个继承过程,您必须以与默认服务提供者几乎完全相同的方式定义它;特别是这段代码:

    $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);
        });
    }