让Doctrine迁移类实现ContainerAwareInterface遇兼容错误求助
解决Doctrine迁移中setContainer方法签名兼容问题
哦,这个问题我一眼就看出来了——你忘记引入ContainerInterface的命名空间了!虽然你复制了接口的方法签名,但PHP不知道你写的ContainerInterface是Symfony框架里的那个接口,它会默认把这个类名解析为当前命名空间(Application\Migrations)下的类,这就导致你的方法签名和ContainerAwareInterface定义的签名完全不匹配,所以才会抛出这个看似奇怪的错误。
问题根源
你的迁移类实现了ContainerAwareInterface,但只引入了这个接口的命名空间,却没有引入它的setContainer方法依赖的ContainerInterface类,导致PHP无法识别参数的正确类型。
修复方案
有两种简单的修复方式:
方式一:添加use语句
在类顶部的use声明区域,新增ContainerInterface的引入:
use Doctrine\ORM\Mapping\PushNotification; use Doctrine\DBAL\Migrations\AbstractMigration; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; // 新增这一行 use Doctrine\DBAL\Schema\Schema;
方式二:使用完整命名空间
如果不想添加use语句,可以直接在方法参数中写出ContainerInterface的完整命名空间:
public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null) { $this->container = $container; }
验证效果
完成上述修改后,你的setContainer方法签名就会和ContainerAwareInterface定义的完全一致,PHP就不会再抛出方法签名不兼容的错误,迁移也能正常执行了。
内容的提问来源于stack exchange,提问作者Mayor of the Plattenbaus
相关产品推荐
相关产品推荐

