CodeIgniter 4 - Проверка функции пользовательского правила Quandry - PullRequest
0 голосов
/ 12 октября 2019

В моем обучении CI4 я начал с попытки симулировать функциональность входа пользователя. У меня есть Контроллер, два Представления (здесь не показаны, но на самом деле просто страницы - одна в значительной степени просто одна форма, а другая - «пустая» успешная HTML-страница), набор пользовательских правил в файле Validation.php,и файл CustomRule.php с первым из методов, которые будут реализовывать все мои пользовательские правила (которые, в конечном счете, я бы хотел, чтобы все было установлено в файле Validation.php). Из-за отсутствия лучшей идеи, я вставил файл CustomRules.php в папку app \ Config \.

Вот моя проблема:

Для жизни я могу 'Не могу понять, как заставить службу валидации передавать дополнительные параметры (из формы) в мою функцию пользовательских правил под названием user_validated. Документация CI4 описывает, что должна обслуживать пользовательская функция при приеме дополнительных параметров, но не рассказывает, как запустить службу проверки для передачи этих дополнительных параметров в свою пользовательскую функцию… поэтому, хотя вызывается user_validated, всегда передается только user_email_offeredкак в виде строки - больше ничего не входит, из того, что я могу сказать. Как мне обойти это?

Я попытался вставить <$ validation-> setRuleGroup ('user_signin');> перед вызовом для проверки, но обнаружил, что я могу переместить настройку группы правил в вызов для проверки, используя: $ validationResult = $ this-> validate ('user_signin'), который, кажется, делает то же самое, и которыйкажется, не работает без группы правил в качестве параметра (?). Это все еще не похоже на то, что запускает дополнительные данные для передачи в метод пользовательского правила.

Выдержки из моего хака добавлены ниже.

Я был бы очень признателен, один из вас, знающий народ, может указать мне правильное направление.


Вapp \ Controllers \ RegistrationTest.php:

<?php

    namespace App\Controllers;

    use CodeIgniter\Controller;

    class SignupTest extends BaseController
    {

            public function index() {   // redirection from the default to signup(), signin(), ...

                return $this->signup();

            }


            public function signup() {

                helper(['form']);

                $validation = \Config\Services::validation();

                if ($this->request->getPost()) {     // still TBD: any different to using $this->request->getGetPost() ?

                    $validationResult = $this->validate('user_signin'); // set the rules to use: 'user_signin', 'user_signup'

                    if (!$validationResult) {

                        $validationErrors = $validation->getErrors();

                        return view('SignupTestView', $validationErrors);   // redisplay simple html form view with list of validation errors

                    } else {

                        return view('SignupTestViewSuccess');  // display view to show success 
                    }
                } else {

                    return view('SignupTestView');   // initial display, in the event of there being no POST data 

                }
            }
    }

В \ app \ Config \ CustomRules.php:

<?php

    namespace Config;

    use App\Models\UserModel;

    //--------------------------------------------------------------------
    // Custom Rule Functions 
    //--------------------------------------------------------------------

    class CustomRules
    { 


        public function user_validated(string $str, string $fields = NULL, array $data = NULL, string &$error = NULL) : bool{            

             $user_email_offered = $str;
             $user_password_offered = '';    // to be extracted using $fields = explode(',', $fields), but $fields is never provided in the call to this user_validated method


            if (($user_email_offered !== NULL) && ($user_password_offered !== NULL)) {

                $usermodel = new UserModel();   // intended to create a UserEntity to permit connectivity to the database 

                $user_found = $usermodel->find($user_email_offered);    // we're going to assume that user_email is unique (which is a rule configured in the database table)

                if ($user_found === NULL) { // check if user exists before doing the more involved checks in the else-if section below, which may throw exceptions if there's nothing to compare (?)

                ...   

          }

}

В \ app \ Config \ Validation.php:

?php 
    namespace Config;

    class Validation
    {
        //--------------------------------------------------------------------
        // Setup
        //--------------------------------------------------------------------

        /**
         * Stores the classes that contain the
         * rules that are available.
         *
         * @var array
         */
        public $ruleSets = [
            \CodeIgniter\Validation\Rules::class,
            \CodeIgniter\Validation\FormatRules::class,
            \CodeIgniter\Validation\FileRules::class,
            \CodeIgniter\Validation\CreditCardRules::class,
            \Config\CustomRules::class,
        ];

        /**
         * Specifies the views that are used to display the
         * errors.
         *
         * @var array
         */
        public $templates = [
            'list'   => 'CodeIgniter\Validation\Views\list',
            'single' => 'CodeIgniter\Validation\Views\single',
        ];

        //--------------------------------------------------------------------
        // Custom Rules
        //--------------------------------------------------------------------

        /* configurable limits for validation rules array below*/
        const user_email_min_lenth = 9;  
        const user_email_max_lenth = 50; 
        const user_password_min_lenth = 6;   
        const user_password_max_lenth = 25;  


        public $user_signin = [
            'user_email' => [
                'label' => 'e-mail address',
                'rules' => 'trim|required|valid_email|user_validated',  // user_validated is custom rule, that will have a custom error message
                'errors' => [
                    'required' => 'You must provide an {field}',
                    'valid_email' => 'Please enter a valid {field}',
                ]
            ],
            'user_password' => [
                'label' => 'password',
                'rules' => 'trim|required',
                'errors' => [
                    'required' => 'Enter a {field} to sign in',
                    'user_password_check' => 'No such user/{field} combination found',
                ] 

1 Ответ

0 голосов
/ 05 ноября 2019

Вызов пользовательского правила с параметрами должен быть точно таким же, как и вызов обычных правил CI4. Давайте возьмем для примера «required_without». Вы используете это как в этом примере:

$validation->setRule('username', 'Username', 'required_without[id,email]');

И функция объявлена ​​так:

public function required_without($str = null, string $fields, array $data): bool
{
    $fields = explode(',', $fields);
//...
}

где $ str - это ваше основное поле, $ fields - строка, упаковкамассив, разделенный запятыми.

Что касается правил группировки, вам не нужно группировать правила, чтобы иметь возможность использовать пользовательские правила с параметрами.

Если у вас есть только 2 поля для проверки против васможет пойти немного дешевле, что не будет идеально, но все еще работает:

Функция:

public function myrule(string $mainfield, string $fieldtotestwith): bool
{
//doing stuff
}

Правило валидации:

$validation->setRule('somemainfield', 'Something', 'myrule[somesecondfield]');
...