首页 > 解决方案 > ... 的声明必须与

问题描述

我正在为我的用户模型使用这个 Yii2 插件

https://yii2-usuario.readthedocs.io/en/latest/

在我的main.php我有这个。

 'user' => [
     'class' => Da\User\Module::class,
     'enableEmailConfirmation' => true,
      'classMap' => [
           'User' => 'app\models\user\Model\User',
           'SocialNetworkAccount' => 'app\models\user\Model\SocialNetworkAccount',
       ], 

然后在目录中models/user/Model我有这个

namespace app\models\user\Model;
use Yii;
use app\models\user\Model\User;
use Da\User\Model\SocialNetworkAccount as BaseClass;

class SocialNetworkAccount extends BaseClass
{
 public function connect(User $user)
    {
        return $this->updateAttributes(
            [
                'username' => null,
                'firstname' =>  $user->firstname,
                'lastname' =>  $user->lastname,
                'email' => null,
                'code' => null,
                'user_id' => $user->id,
            ]
        );
    }
}

但是当我进入我的登录页面时,我收到了这个错误

Declaration of app\models\user\Model\SocialNetworkAccount::connect(app\models\user\Model\User $user) must be compatible with Da\User\Model\SocialNetworkAccount::connect(Da\User\Model\User $user)

我尝试按照此处的教程来覆盖类,但没有运气

https://yii2-usuario.readthedocs.io/en/latest/enhancing-and-overriding/overriding-classes/

我在这里做错了什么?谢谢

更新:

我试过这个

public function connect(\Da\User\Model\User $user)

不再收到错误,但现在我注意到它没有添加名字和姓氏

在我的用户模型规则中,我有这个

public function rules()
    {
        return [
            ...
            [['email', 'firstname', 'lastname'], 'safe'],
        ]
}

标签: yiiyii2

解决方案


根据您的描述,usuario在调用方法User时似乎正在使用 DI 容器创建类实例。connect()

覆盖它时,您必须遵循不能在子类型中加强先决条件的规则。这意味着您不能使用原始方法用作其参数的子类来键入参数。您的连接方法定义必须类似于您在问题中发布的内容:

public function connect(\Da\User\Model\User $user)

但正因为如此,依赖注入器Da\User\Model\User在调用connect()方法时创建了一个实例。所以,你错过的是设置 DI 容器来创建实例,app\models\user\Model\User只要它应该创建这样的实例Da\User\Model\User

'container' => [
    'definitions' => [
        Da\User\Model\User::class => app\models\user\Model\User::class,
    ],
],

当然,要让这个工作你的app\models\user\Model\User类必须扩展Da\User\Model\User类。

在usuario 的文档中有一个完整的示例如何覆盖 usuario 的用户模型


推荐阅读