В моем обучении 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',
]