我有一个 Laravel 应用程序,已从 Laravel 10 升级到 Laravel 11。它位于 Alpine/Docker 容器中。我最初使用
artisan serve
系统作为 Web 服务器,但由于该组件中的错误,我最终升级到 Apache。因此,这个过程导致我从 PHP 8.2 升级到 8.3(我有点想知道我是否应该一次升级一件事,但 Docker 的挑战在某种程度上迫使我这么做)。
看起来整个应用程序正在运行,而不是一件琐碎的事情。我使用的是 Laravel Breeze 制作的 Livewire 登录系统,它完全是现货。但是,升级后,登录将无法工作,尽管没有显示错误,但我可以在“网络”选项卡响应中看到电子邮件地址未通过验证。以前没有这样做过。
因此,我尝试以独立的方式使用电子邮件验证器系统,如下所示:
<?php
use Egulias\EmailValidator\EmailValidator;
use Egulias\EmailValidator\Validation\RFCValidation;
require_once __DIR__ . '/vendor/autoload.php';
$validator = new EmailValidator();
$ok = $validator->isValid("{redacted email address}", new RFCValidation());
echo $ok ? "OK" : "ERROR";
echo "\n";
在此代码中,电子邮件地址通过了验证。
这是登录表单的片段:
class LoginForm extends Form
{
#[Validate('required|string|email')]
public string $email = '';
#[Validate('required|string')]
public string $password = '';
#[Validate('boolean')]
public bool $remember = false;
如果我从验证注释中删除
email
,它就可以工作。
因此,我如何跟踪此电子邮件检查的 Laravel 版本,看看出了什么问题?我不知道该值是否没有传递给验证器,或者它正在执行过于严格的检查,导致该地址/域失败。
在 Laravel 代码的核心中,我正在进行一些临时更改以记录幕后发生的情况。我发现我可以让第三方电子邮件验证库发出错误和警告,确实有错误:
iconv(): 编码错误,不允许从“WINDOWS-1252”转换为“UTF-8//IGNORE”
错误来自
/project/vendor/symfony/polyfill-mbstring/Mbstring.php
。调用的页面的 HTML 头部有 <meta charset="utf-8">
,所以我不确定 WINDOWS-1252 字符集来自哪里。我想知道我加载的扩展是否不同,这让某些事情感到不安。
我还注意到 phpinfo 中的 iconv 配置相当空白。也许这就是原因?
最后我还注意到我没有加载 mbstring,我也会尝试修复它。
这里的问题是根据我在更新部分的怀疑。 Iconv 安装被破坏,可能是因为我使用 Alpine 而不是 Debian 衍生版本。
虽然我希望可以修复 Iconv 扩展,但我发现安装 Mbstring 更简单。看来优先尝试这个,只有在Mbstring不可用的情况下才使用Iconv。