升级php7.4 laravel lumen报错Trying to access array offset on value of type null


最近升级php 7.0 到 php7.4,升级完后发现lumen跑不起来了,报如下错误:

lumen 环境是 5.5.2

In ServiceProvider.php line 84:

  Trying to access array offset on value of type null

[2021-05-06 20:19:14] lumen.ERROR: ErrorException: Trying to access array offset on value of type null in E:\PHPRoot\gancao_workgroup\gapis_medicine\vendor\illuminate\support\ServiceProvider.php:84
Stack trace:
#0 E:\PHPRoot\gancao_workgroup\gapis_medicine\vendor\illuminate\support\ServiceProvider.php(84): Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(8, 'Trying to acces...', 'E:\\PHPRoot\\ganc...', 84, Array)

看了源码,是因为这段代码导致的错误,php7.4强制校验对象为null时不可进行数组操作,因此引发了上面的这个 报错信息。

/**
 * Register a view file namespace.
 *
 * @param  string|array  $path
 * @param  string  $namespace
 * @return void
 */
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);
}

$this->app->config'view' 这个view不存在时为 null,所以就报错了,php7.4以下没有强制检查,所以正常能过。

但是这个代码是在 vendor 中的,没法修改。

解决方案:

因此想了一个变通的办法,在 /bootstrap/app.php 中完成$app加载时,塞入一个 view对象($app->configure('view')),临时解决这问题。

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);

//此处为增加的代码

if(version_compare(PHP_VERSION,'5.4.0','>=')){
    $app->configure('view'); //bug fixd :In ServiceProvider.php line 84
}

希望能帮助到大家,这问题折腾了一个下午。

声明:小小博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 升级php7.4 laravel lumen报错Trying to access array offset on value of type null


Carpe Diem and Do what I like