【问题标题】:How to override laravel illuminate ServiceProvider如何覆盖 laravel 照亮 ServiceProvider
【发布时间】:2021-04-27 07:36:26
【问题描述】:

我升级了 php 版本,现在从 vendor/illuminate/support/ServiceProvider.php 调用 loadViewsFrom 方法 生成错误,因为 $this->app->config['view'] 不是数组。

protected function loadViewsFrom($path, $namespace)
{
    if (is_array($this->app->config['view']['paths'])) {
        foreach ($this->app->config['view']['paths'] as $viewPath) {
            if (is_dir($appPath = $viewPath.'/vendor/'.$namespace)) {
                $this->app['view']->addNamespace($namespace, $appPath);
            }
        }
    }

    $this->app['view']->addNamespace($namespace, $path);
}

如何在不升级 laravel 版本且不修改供应商文件的情况下解决此问题?

我试图从 composer autoload 覆盖地图类并运行 composer dump-autoload,但没有成功。

我的作曲家是这样的:

...
"autoload": {
    "exclude-from-classmap": ["vendor/illuminate/support/ServiceProvider.php"],
    "psr-4": {
        "App\\": "app/",
        "Illuminate\\": "app/illuminate/"
    }
},
...

在 app/illuminate/support 我添加了我的自定义 ServiceProvider.php。

另外,我尝试在 bootstrap/app.php 中映射:

$app->singleton(
    Illuminate\Support\ServiceProvider::class,
    App\illuminate\support\ServiceProvider::class
);

供应商类仍在使用。

框架和php版本:

Laravel Framework Lumen (5.6.4) (Laravel Components 5.6.*)

php version: 7.4.13

【问题讨论】:

    标签: php laravel lumen


    【解决方案1】:

    如果$this->app->config['view'] 不是数组,那么您的问题出在您的config/view.php 文件中。

    默认情况下,此文件如下所示

    <?php
    
    return [
    
        /*
        |--------------------------------------------------------------------------
        | View Storage Paths
        |--------------------------------------------------------------------------
        |
        | Most templating systems load templates from disk. Here you may specify
        | an array of paths that should be checked for your views. Of course
        | the usual Laravel view path has already been registered for you.
        |
        */
    
        'paths' => [
            resource_path('views'),
        ],
    
        /*
        |--------------------------------------------------------------------------
        | Compiled View Path
        |--------------------------------------------------------------------------
        |
        | This option determines where all the compiled Blade templates will be
        | stored for your application. Typically, this is within the storage
        | directory. However, as usual, you are free to change this value.
        |
        */
    
        'compiled' => env(
            'VIEW_COMPILED_PATH',
            realpath(storage_path('framework/views'))
        ),
    
    ];
    

    如您所见,返回了 array。所以你应该更好地解决这个问题,而不是覆盖服务提供者。

    【讨论】:

    • 好点,我同意你的观点,但我不知道为什么有时 $this->app->config['view'] 返回 null。我添加了一个日志: protected function loadViewsFrom($path, $namespace) { Log::info(json_encode($this->app->config['view'])); ...看起来像: local.INFO: null local.INFO: {"paths":["\/var\/www\/html\/my-project\/resources\/views"],"compiled": "\/var\/www\/html\/my-project\/storage\/framework\/views"} local.INFO: null local.INFO: {"paths":["\/var\/www\/ html\/my-project\/resources\/views"],"编译":"\/var\/www\/html\/my-project\/storage\/framework\/views"}
    • 一次返回 null 一次从 config/view.php 返回正确值
    • 那你需要回溯那些为空的。抱歉,但在这里我们无法调试您的整个应用程序。粗略猜测:有些东西正在修改配置并将其设置为 null。
    猜你喜欢
    • 2017-12-07
    • 2021-11-16
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多