【问题标题】:Declaration of ... must be compatible with... 的声明必须与
【发布时间】:2021-07-23 16:35:13
【问题描述】:

我正在为我的用户模型使用这个 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'],
        ]
}

【问题讨论】:

    标签: yii yii2


    【解决方案1】:

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

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

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

    但正因为如此,依赖注入器在调用connect() 方法时创建了Da\User\Model\User 的实例。因此,您错过的是设置 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's documentation中有一个完整的例子如何覆盖usuario的User模型

    【讨论】:

    • 感谢您的回复,我实际上正在尝试将名字和姓氏添加到社交连接页面,就像这里一样。但似乎无法在任何地方找到解决方案。 stackoverflow.com/questions/68375873/…。我还把container definitions 放在main.php 中吗?抱歉,yii2 的新手
    • 是的,我也扩展了用户模型 (Da\User\Model\User)
    • 是的,你可以把它放在 main.php 配置中。您可以在此处找到有关配置的更多信息:yiiframework.com/doc/guide/2.0/en/…
    • 添加容器后出现同样的错误:(
    • public function connect(\Da\User\Model\User $user) 没有给我错误,但用户表没有更新为firstnamelastname
    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多