如何在模型中获取会话?CakePHP 3.x

9

Cakephp 3.x

我想自定义我的验证码验证,但我无法访问会话。

$validator->notEmpty('securityCode', __('not empty message'))
    ->add('securityCode','custom', 
        ['rule' => function ($value, $context) use ($extra) {
            if($this->request->Session()->read('captcha') != $value) {
                return false;
            }
            return true;
        }, 'message' => 'error security code']);
 return $validator;

我可以给自定义验证函数提供自定义参数吗?
public function validationLogin(Validator $validator, $customParameter)
{ //bla bla }

我使用:http://book.cakephp.org/3.0/zh-cn/core-libraries/validation.html#自定义验证规则

2个回答

11
您可以像这样将会话数据作为验证函数的参数传递:

// In Controller
$sessionData = $this->request->Session()->read('captcha');
$validator = $this->{YourModel}->validationLogin(new Validator(), $sessionData);

$errors = $validator->errors($this->request->data());
if (!empty($errors)) {
    // Captcha validation failed
}


// In Model
public function validationLogin(Validator $validator, $sessionData)
{
    $validator
        ->notEmpty('securityCode', __('not empty message'))
        ->add('securityCode', 'custom', [
            'rule' => function ($value, $context) use ($sessionData) {
                if ($sessionData != $value){
                    return false;
                }
                return true;
            },
            'message' => 'error securty code'
        ]);

        return $validator;
}

编辑:你可以从模型中访问会话,但这不是一个好的做法,最好避免使用。相反,像上面的例子一样,最好从控制器传递它。

// In model
use Cake\Network\Session;
$session = new Session();
$sessionData = $session->read('captcha');

谢谢兄弟。:) 我看到我的工作了。但是模型中可以访问会话吗? - Sinan Bay

5

对于CakePHP 3:在你的模型类顶部添加以下代码:

use Cake\Network\Session;

在你需要访问会话的地方,添加以下内容:

$this->session = new Session();
$messages = $this->session->read('captcha'); // Example for the default flash messages

在模型中设置一个闪存信息使用以下代码:

$this->session = new Session();
$messages      = $this->session->read('Flash.flash');
$messages[]    = ['message' => 'YOUR FLASH MESSAGE', 'key' => 'flash', 'element' => 'Flash/default', 'params' => []];
$this->session->write('Flash.flash', $messages);

2
我知道已经过去了四年,但我在寻找答案时偶然发现了这个问题,所以如果其他人也遇到了同样的问题,请不要这样做。在模型中调用新的会话可能会干扰Auth组件,导致“会话已启动”错误。 - Michał Skrzypek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接