cakephp UsersController::register()函数

cakephp UsersController::register()函数,php,cakephp,registration,Php,Cakephp,Registration,我对cakephp非常陌生,但我从一开始就喜欢它。经过数小时的研究和教程,我现在觉得能够创建一个符合我要求的User::register()函数。这个函数运行得很好,但在某些方面我对代码不满意。由于我想确保我很好地理解了cakephp的逻辑,我想问您是否有更好的方法,或者它的代码是否很好(请参见注释): 公共函数寄存器(){ 如果($this->request->is('post')){ //设置数据,以便对其进行验证 $this->User->set($this->request->data)

我对cakephp非常陌生,但我从一开始就喜欢它。经过数小时的研究和教程,我现在觉得能够创建一个符合我要求的User::register()函数。这个函数运行得很好,但在某些方面我对代码不满意。由于我想确保我很好地理解了cakephp的逻辑,我想问您是否有更好的方法,或者它的代码是否很好(请参见注释):

公共函数寄存器(){
如果($this->request->is('post')){
//设置数据,以便对其进行验证
$this->User->set($this->request->data);
//如果没有发生错误,请继续
如果($this->User->validates()){
//创建验证码,用户必须在确认电子邮件中单击以激活其帐户
//我认为这个问题没有很好地解决,因为我在两个变量中设置了验证代码。
//另外:有没有比设置$this->request->data['user']['verification_code']更好的方法来设置用户模型的验证码?
$vcode=$this->request->data['User']['verification_code']=sha1($this->request->data['User']['email'].rand(0100));
//在数据库中创建记录
$this->User->create();
//保存,不再验证
如果($this->User->save($this->request->data,array('validate'=>FALSE))){
//发送邮件
$Email=new-CakeEmail();
$Email->from(数组('no-reply@.$\u SERVER['SERVER\u NAME']=>$this->viewVars['appName']))
->到($this->request->data['User']['email'])
->主题('Deine Registrierung bei%s',$this->viewVars['appName']))
->模板('register_confirmation','default')
->emailFormat('两者')
->视图变量(数组)(
'appName'=>$this->viewVars['appName'],
'first_name'=>$this->data['User']['first_name'],
“verificationLink'=>路由器::url(数组('controller'=>'users','action'=>'verifyEmail'),true)。”?vcode='.$vcode//带有验证代码。此处再次需要$vcode变量。
//我认为再次编写$this->request->data['User']['verification_code']会非常难看
));
如果($Email->send()){
$this->Session->setFlash('Registrierung erfolgreich!Wir haben Bestätigungs-email an%s gesendet.Klicke auf den darinstehenden Link,um dein Konto zu aktivieren',array('strong>。$this->请求->数据['User']['email'.),'flash警报成功');
返回$this->redirect(数组('controller'=>'users','action'=>'login');
}                     
$this->Session->setFlash('Die E-mail konnte nicht versendet werden.Fordere eine neue Bestätigungs E-mail an.'),'flash_alert_error';
}
$this->Session->setFlash('Die Registrierung ist fehlgeschlagen.bite versuche es ernut'),'flash\u alert\u error');
}否则{
//是否有更好的方法捕获和显示验证错误?
$errmsg=uuuuu(“%sDie Registrierung konnte nicht abgeschlossen werden:%s'、“”、“
”); foreach($this->User->validationErrors as$key=>$val){ $errmsg.=\$val[0])。
; } $this->Session->setFlash($errmsg,'flash\u alert\u error'); } } }
如有任何意见,将不胜感激

提前谢谢大家,,
奥利金结构

将电子邮件发送代码移动到单独的方法中。良好的OOP意味着一个方法只执行一项任务,您的注册方法也处理电子邮件发送,将其分离到另一个方法中,并从您的注册方法中调用它。为了能够更好地进行单元测试,我通常会创建一个这样的方法

public function getCakeEmail($config = null) {
    return new CakeEmail($config);
}
在我的AppModel中,很容易在测试中模拟该方法,然后返回一个模拟的CakeEmail对象,然后断言对该对象的方法调用

将整个数据处理逻辑移到模型层中它应该在的位置(显示调用模型方法的控制器):

最佳实践

$errmsg, $vcode
不要使用短变量名,这是可以猜测的,但通常易于阅读和理解的代码比缩短任何代码都要好。那么为什么不叫它$errorMessage和$verficationCode呢

if($this->User->validates()) {  
if后面缺少空格。您可以使用phpcs之类的工具来验证代码

MVC冲突,除了在视图层之外,您永远不希望在脚本中使用HTML

$errmsg .= __($val[0]).'<br />';
$errmsg.=_($val[0])。
这里甚至没有使用

,请使用CSS在元素之间创建空间<代码>
是一种换行符,不被认为是用于创建间距的“设计元素”。无需运行验证错误数组并添加该


如果您遵循约定,如果每个输入字段的验证规则失败,CakePHP应自动在每个输入字段下方显示错误消息。

hi burzum,非常感谢您的详细评论!我会重做一些东西。。也许再问你一次是否可以?欢迎,你介意把答案标记为正确吗?非常感谢。
if($this->User->validates()) {  
$errmsg .= __($val[0]).'<br />';