【问题标题】:Laravel 5.5 won't render email with PHP 7.4Laravel 5.5 不会使用 PHP 7.4 呈现电子邮件
【发布时间】:2020-09-21 20:57:31
【问题描述】:

我正在尝试在 Laravel 5.5 中渲染电子邮件,但无论我做什么,渲染时都会出现以下错误: ErrorException (E_NOTICE) Trying to access array offset on value of type null

发生在 \vendor\egulias\email-validator\EmailValidator\Parser\Parser.php

我正在运行 php 7.4,我相信错误不会发生在 php 7.3 上。

web.php:

Route::get('scratch', function(){
  $mail = new Test();
  return $mail->render();
});

Test.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Test extends Mailable
{
  use Queueable, SerializesModels;

  public $subscription;

  /**
   * Create a new message instance.
   *
   * @return void
   */
  public function __construct()
  {
  }

  /**
   * Build the message.
   *
   * @return $this
   */
  public function build()
  {
    return $this->view('emails.test');
  }
}

test.blade.php

Hello from world

我认为这一定是 Laravel 5.5 和 PHP 7.4 的问题。我可以更改我的版本,但如果可能的话,我想避免这种情况。升级 Laravel 不适用于此应用程序。


编辑

vendor\egulias\email-validator\EmailValidator\Parser\Parser.php 这一行失败

 protected function escaped()
    {
        $previous = $this->lexer->getPrevious();
 
        if ($previous['type'] === EmailLexer::S_BACKSLASH  // here
            &&
            $this->lexer->token['type'] !== EmailLexer::GENERIC
        ) {
            return true;
        }
 
        return false;
    }

【问题讨论】:

  • 你能通过堆栈跟踪找出数组访问发生在哪里吗?它应该是一个错误,所以 PHP 7.4 是正确的,但在过去它会返回 null(不是错误)
  • @lagbox 已更新以显示失败位置。
  • 你尝试过什么调试问题?
  • 除非您通过您的代码可以调整最终从$this-&gt;lexer-&gt;getPrevious() 返回的内容,否则您将无法使用它,除非有较新的版本,或者您分叉此包并调整该代码以检查对于null
  • github.com/egulias/EmailValidator/issues/234 上已经有一个错误报告,并且从 v2.1.16 开始提供修复 - 您使用的是哪一个?

标签: php laravel


【解决方案1】:

问题是egulias/email-validator 2.1.7 有 php 7.4 问题。简单的composer update 修复了它。

【讨论】:

  • 我刚刚使用 php-7.3 修复了它。因为共享主机上的项目,我无权访问服务器
【解决方案2】:

就我而言,我刚刚更新了此文件 vendor\egulias\email-validator\EmailValidator\Parser\Parser.php 第 147 行中的代码 我刚刚将其更新为

之前的代码是 if ($previous['type'] === EmailLexer::S_BACKSLASH 新代码 if (isset($previous['type']) && $previous['type'] === EmailLexer::S_BACKSLASH 我的问题解决了。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2018-07-29
  • 2014-03-20
  • 2018-06-17
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多