如何让自定义LoginLinkNotification通过phpStan校验
Symfony登录链接自定义模板邮件phpStan报错解决方案
报错原因
LoginLinkHandler提供的createLoginLinkEmail方法的返回类型声明为Symfony\Component\Mime\RawMessage,该类是所有邮件类的通用父类,本身没有htmlTemplate方法。你要调用的htmlTemplate是Symfony\Bridge\Twig\Mime\TemplatedEmail子类的专属方法,phpStan静态分析时仅识别声明的父类返回类型,因此抛出方法未定义的错误。
解决方案
方案1:手动创建TemplatedEmail实例(最推荐)
不要直接复用createLoginLinkEmail返回的邮件实例,自行创建支持模板的TemplatedEmail实例,示例代码如下:
use Symfony\Bridge\Twig\Mime\TemplatedEmail; // 第一步:生成登录链接对象 $loginLink = $loginLinkHandler->createLoginLink($user); // 第二步:手动创建支持模板的邮件 $email = (new TemplatedEmail()) ->to($user->getEmail()) ->subject('你的账号登录验证链接') // 自定义模板路径 ->htmlTemplate('emails/login_link_reset.html.twig') ->context([ // 传递模板需要的参数 'login_link' => $loginLink, 'expire_time' => $loginLink->getExpiresAt(), 'user' => $user ]); // 第三步:发送邮件 $mailer->send($email);
操作完成后phpStan可以正常识别TemplatedEmail类的方法,不会再抛出报错。
方案2:添加类型判断兼容原有逻辑
如果需要复用createLoginLinkEmail的默认配置,可添加instanceof类型判断让phpStan识别实际子类类型:
use Symfony\Bridge\Twig\Mime\TemplatedEmail; $rawEmail = $loginLinkHandler->createLoginLinkEmail($user); // 类型判断后phpStan会识别下方$rawEmail为TemplatedEmail实例 if ($rawEmail instanceof TemplatedEmail) { $rawEmail->htmlTemplate('emails/custom_login_link.html.twig'); $rawEmail->context([ 'custom_param' => '自定义参数' ]); } $mailer->send($rawEmail);
前置依赖检查
确认已安装symfony/twig-bridge扩展,TemplatedEmail类由该扩展提供,未安装可执行命令安装:composer require symfony/twig-bridge
内容的提问来源于stack exchange,提问作者Micka Bup
相关产品推荐
相关产品推荐

