Php Yii2在表单字段中基本隐藏模型名称

Php Yii2在表单字段中基本隐藏模型名称,php,yii2,yii2-basic-app,Php,Yii2,Yii2 Basic App,在我的表单中,在yii2basic中,如果我尝试检查字段的元素,我会得到模型和表行的名称 范例 <input id="userlogin-username" class="form-control" name="Userlogin[Username]" maxlength="30" aria-required="true" type="text"> name=显示型号名称:Userlogin,表行为Username。是否可以隐藏模型和表行的名称,例如,name=“user”而不

在我的表单中,在yii2basic中,如果我尝试检查字段的元素,我会得到模型和表行的名称

范例

<input id="userlogin-username" class="form-control" name="Userlogin[Username]" maxlength="30" aria-required="true" type="text">

name=
显示型号名称:
Userlogin
,表行为
Username
。是否可以隐藏模型和表行的名称,例如,
name=“user”
而不是
name=“Userlogin[Username]”

这是可能的还是不可能的


谢谢

您可以通过在模型中实现“formName”来隐藏模型的名称:

如果您选择Yii方式,您应该使用模型设置和传递数据。现在要做您需要的事情(模糊安全性),您将结束或使用无模型表单或使用
DynamicModel

要做到这一点,您必须在控制器上做大量额外的工作来读取字段

Op1:手写表格 这也是一个很大的工作,您将结束表单与yii的断开连接。 像手工一样制作表格

<form method="post">
  First name:<br>
  <input type="text" name="username">
  <input type="submit" value="Submit">
</form>
Op2:
DynamicModel
way。 通过制作哑模型进入控制器o时,使用
DynamicModel
设置字段

然后,当使用
$model->load()
时,您将加载
动态模型
,加载时,您必须手动加载类似
$userModel->usewr\u name=$dModel->user\u name的字段

现在,您的表单将显示
DynamicModel[用户名]
。 使用此选项可以隐藏模型

打造你喜欢的身材:

我不是说这是最好的方法,这是一种做你需要的事情的方法。希望这对你有帮助

$name = isset($options['name']) ? $options['name'] : static::getInputName($model, $attribute);
yii/helpers/BaseHtml::activeInput()中的上述行用于为模型字段生成字段名。所以,可以安全地假设,在选项中设置字段名将完全从字段名中删除模型名。[警告:我从未尝试过。这只是因为我对代码的理解有限]示例:

$form->field($model, 'username')->textInput(['name' => 'myusername']);
然而,这将产生比解决一些问题更多的问题。Model::load()使用模型的表单名称根据场景和规则设置填充属性(有关详细信息,请阅读关于安全属性的内容)。这意味着您必须记住在控制器操作中将所有字段从您的请求加载到您的模型,从长远来看,当模型发展时,这是不友好的。所以,更好的解决方案是重写Model::formName()方法

这将产生诸如
myUser[Username]
之类的名称


还有其他选项,比如创建一个模型作为表单,选择表单名和字段名,并在提交到当前模型时复制值,但这通常不是必需的。

它们以特定的方式使用,因为当您调用
$Model->load()时
发布表单后,它将加载名为
UserLogin的模型数组
我不建议您这样做,但您为什么要这样做?您能解释一下吗?也许我们可以想出更好的解决方案。我正在创建一个网站,因此为了安全起见,我不会让用户知道模型名称和表格。哈哈,别担心,即使他们知道模型名称,做任何事情都不是那么容易。是可以改变还是不可能?几乎任何事情都有可能,实际的做法更取决于你的情况。你试过什么?您可以在模型中定义其他属性(如
用户
)和/或将不同字段传递给您的身份验证(如
电子邮件
),这实际上取决于您的应用程序和维护成本/效益。正如@MuhammadOmerAslam提到的,不太可能有人知道该模式会危害您的安全性,如果是这样,您就有更大的问题。形式本身将是主要的攻击向量。
$name = isset($options['name']) ? $options['name'] : static::getInputName($model, $attribute);
$form->field($model, 'username')->textInput(['name' => 'myusername']);
public function formName() {
    return 'myUser';
}