【问题标题】:How I do do get session in model? CakePHP 3.x我如何在模型中获取会话? CakePHP 3.x
【发布时间】:2015-07-01 12:56:49
【问题描述】:

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/en/core-libraries/validation.html#custom-validation-rules

【问题讨论】:

    标签: session model cakephp-3.0


    【解决方案1】:

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

    // 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');
    

    【讨论】:

    • 谢谢兄弟。 :) 我看到了我的工作。但是模型中的会话可以访问吗?
    【解决方案2】:

    对于 CakePHP 3:在 Model 类的顶部添加

    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);
    

    【讨论】:

    • 我知道已经四年了,但我偶然发现了这个寻找答案,所以如果其他人都有 - 不要这样做。在模型中调用新会话可能会导致 Auth 组件出现“会话已启动”错误。
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 2017-02-12
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2016-04-27
    • 2016-11-07
    相关资源
    最近更新 更多