求助:routeNotificationForNexmo方法为何无效果?
这种情况我碰到过好几次,大概率是几个常见的小坑导致的,咱们一步步排查:
1. 方法放错了位置
routeNotificationForNexmo 必须定义在你的Notifiable模型里(比如User模型),而不是在你的Notification类里。很多人会不小心把这个方法写到通知类里,这就完全没用了——Laravel只会去你发送通知的那个模型实例里找这个路由方法。
2. 方法名拼写错误
仔细检查方法名:必须是routeNotificationForNexmo,注意大小写(Nexmo的首字母N是大写的),不能写成routeNotificationFornexmo或者routeNotificationForSms这类变体。Laravel是严格匹配方法名的,拼写错了就会直接忽略, fallback到默认逻辑。
3. 发送通知时用错了模型实例
比如你本来应该给User模型实例发通知,但不小心用了另一个没有定义这个方法的模型(比如Admin模型),或者手动创建了一个没有这个方法的对象。可以在发送通知的地方加个dd($user),确认你调用notify()的对象确实是那个定义了routeNotificationForNexmo的模型实例。
4. Notification类里直接指定了路由
如果你的Notification类的toNexmo方法里直接用了->route('nexmo', '具体手机号'),那模型里的routeNotificationForNexmo会被直接覆盖。比如:
public function toNexmo($notifiable) { return (new NexmoMessage) ->content('你的消息内容') ->route('nexmo', '+1234567890'); // 这里会覆盖模型的路由方法 }
如果有这行代码,删掉它,Laravel才会去调用模型里的路由方法。
5. 方法返回值无效
routeNotificationForNexmo必须返回一个有效的带国家码的手机号字符串,比如+1234567890,不能是空字符串、null,也不能是不带国家码的格式(比如1234567890)。可以在方法里加个调试输出:
public function routeNotificationForNexmo() { dd($this->custom_phone); // 看看实际返回的是什么 return $this->custom_phone; }
如果返回的格式不对,Nexmo可能会静默失败,或者用默认值,看起来就像方法没生效。
6. 缓存问题(虽然概率低,但值得排查)
如果你的项目用了模型缓存或者配置缓存,有时候新添加的方法可能不会被立即识别。可以运行以下命令清缓存:
php artisan cache:clear php artisan config:clear php artisan optimize:clear
调试的关键是先确认这个方法到底有没有被调用——加个dd()在方法里,如果执行到了,就看返回值是否符合要求;如果没执行到,那就是调用的对象不对或者方法名拼写错误。
内容的提问来源于stack exchange,提问作者sersun

