Dear Php freaks,
I'm developing one application where i used codeigniter shiled package for authorization, everything works fine but i need to customize my registration controller.
I copied entire controller from shield to app/controlers folder like this as per documentation.
Code:
<?php
namespace App\Controllers;
use CodeIgniter\Shield\Controllers\RegisterController as ShieldRegister;
use CodeIgniter\HTTP\RedirectResponse;
use App\Controllers\BaseController;
use CodeIgniter\Events\Events;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Shield\Authentication\Authenticators\Session;
use CodeIgniter\Shield\Entities\User;
use CodeIgniter\Shield\Exceptions\ValidationException;
use CodeIgniter\Shield\Models\UserModel;
use CodeIgniter\Shield\Traits\Viewable;
use CodeIgniter\Shield\Validation\ValidationRules;
use Psr\Log\LoggerInterface;
class RegisterController extends ShieldRegister
{
use Viewable;
public function initController(
RequestInterface $request,
ResponseInterface $response,
LoggerInterface $logger
): void {
parent::initController(
$request,
$response,
$logger
);
}
/**
* Displays the registration form.
*
* @return RedirectResponse|string
*/
public function registerView()
{
if (auth()->loggedIn()) {
return redirect()->to(config('Auth')->registerRedirect());
}
// Check if registration is allowed
if (! setting('Auth.allowRegistration')) {
return redirect()->back()->withInput()
->with('error', lang('Auth.registerDisabled'));
}
/** @var Session $authenticator */
$authenticator = auth('session')->getAuthenticator();
// If an action has been defined, start it up.
if ($authenticator->hasAction()) {
return redirect()->route('auth-action-show');
}
return $this->view(setting('Auth.views')['register']);
}
/**
* Attempts to register the user.
*/
public function registerAction(): RedirectResponse
{
if (auth()->loggedIn()) {
return redirect()->to(config('Auth')->registerRedirect());
}
// Check if registration is allowed
if (! setting('Auth.allowRegistration')) {
return redirect()->back()->withInput()
->with('error', lang('Auth.registerDisabled'));
}
$users = $this->getUserProvider();
// Validate here first, since some things,
// like the password, can only be validated properly here.
$rules = $this->getValidationRules();
if (! $this->validateData($this->request->getPost(), $rules, [], config('Auth')->DBGroup)) {
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
}
// Save the user
$allowedPostFields = array_keys($rules);
$user = $this->getUserEntity();
$user->fill($this->request->getPost($allowedPostFields));
// Workaround for email only registration/login
if ($user->username === null) {
$user->username = null;
}
try {
$users->save($user);
} catch (ValidationException $e) {
return redirect()->back()->withInput()->with('errors', $users->errors());
}
// To get the complete user object with ID, we need to get from the database
$user = $users->findById($users->getInsertID());
// Add to default group
$users->addToDefaultGroup($user);
Events::trigger('register', $user);
/** @var Session $authenticator */
$authenticator = auth('session')->getAuthenticator();
$authenticator->startLogin($user);
// If an action has been defined for register, start it up.
$hasAction = $authenticator->startUpAction('register', $user);
if ($hasAction) {
return redirect()->route('auth-action-show');
}
// Set the user active
$user->activate();
$authenticator->completeLogin($user);
// Success!
return redirect()->to(config('Auth')->registerRedirect())
->with('message', lang('Auth.registerSuccess'));
}
/**
* Returns the User provider
*/
protected function getUserProvider(): UserModel
{
$provider = model(setting('Auth.userProvider'));
assert($provider instanceof UserModel, 'Config Auth.userProvider is not a valid UserProvider.');
return $provider;
}
/**
* Returns the Entity class that should be used
*/
protected function getUserEntity(): User
{
return new User();
}
/**
* Returns the rules that should be used for validation.
*
* @return array<string, array<string, list<string>|string>>
*/
protected function getValidationRules(): array
{
$rules = new ValidationRules();
return $rules->getRegistrationRules();
}
}
I also changed routes like this :
Code:
service('auth')->routes($routes, ['except' => ['register']]);
$routes->get('register', '\App\Controllers\RegisterController::registerView');
$routes->post('register', '\App\Controllers\RegisterController::registerView');
But when i access my registration page i can see that it works but when i click register button it does not produce any validation errors like before.
What actually i want to do ? :
I have added a extra field called "eid_number" in registration page and once the user submit the form, i will get eid number and get the employee id from employees_master table and attach to the user table so i can link the user with my employees table.