Welcome Guest, Not a member yet? Register   Sign In
problem with custom controller constructor
#14

(05-29-2021, 10:18 AM)tino Wrote: i have a SignupController with some methods in it.
these methods use the $session object, which is declared in BaseController::initController(), and everything works fine.

BaseController, i only declared the protected $session property and initialized in initController():
PHP Code:
<?php

namespace App\Controllers;

use 
CodeIgniter\Controller;
use 
CodeIgniter\HTTP\CLIRequest;
use 
CodeIgniter\HTTP\IncomingRequest;
use 
CodeIgniter\HTTP\RequestInterface;
use 
CodeIgniter\HTTP\ResponseInterface;
use 
Psr\Log\LoggerInterface;

/**
 * Class BaseController
 *
 * BaseController provides a convenient place for loading components
 * and performing functions that are needed by all your controllers.
 * Extend this class in any new controllers:
 *    class Home extends BaseController
 *
 * For security be sure to declare any new methods as protected or private.
 */

class BaseController extends Controller
{
 
/**
 * Instance of the main Request object.
 *
 * @var IncomingRequest|CLIRequest
 */
 
protected $request;

 
/**
 * An array of helpers to be loaded automatically upon
 * class instantiation. These helpers will be available
 * to all other controllers that extend BaseController.
 *
 * @var array
 */
 
protected $helpers = [];

 protected 
$session;

 
/**
 * Constructor.
 *
 * @param RequestInterface  $request
 * @param ResponseInterface $response
 * @param LoggerInterface  $logger
 */
 
public function initController(RequestInterface $requestResponseInterface $responseLoggerInterface $logger)
 {
 
// Do Not Edit This Line
 
parent::initController($request$response$logger);

 
//--------------------------------------------------------------------
 // Preload any models, libraries, etc, here.
 //--------------------------------------------------------------------
 // E.g.: $this->session = \Config\Services::session();
 
$this->session session();
 }


i want the SignupController to be accessible only if the session isn't set, so i used to to an if like this in the multiple methods of the SignupController
PHP Code:
if ($this->session->is_logged_id) {
    return redirect()->to("/")


the fact is that i'm trying to refactor everything for better readability and i decided to create a constructor in the SignupController and move the above if in it, so the code looks like this:

PHP Code:
<?php

namespace App\Controllers\Signup;

use 
App\Controllers\BaseController;
use 
CodeIgniter\HTTP\RedirectResponse;

class 
SignupController extends BaseController {

    /**
    * when an instance of this class is created
    * redirect if the user is already logged in
    */
    public function __construct() {
        if ($this->session->is_logged_in) {
            return redirect()->to("/");
        }
    }

    /**
    * shows the signup page
    */
    public function index() {
        // do stuff...
        echo view("signup");
    }

    public function signup() {
        // do stuff...
    }


the problem is that it's like BaseController::initController() is called after my own constructor, so the $session property is set only after the execution of my SignupController::__constructor()

i say this because i tried to do a var_dump() of the $session property inside of SignupController::__constructor() and the output is null, but if i try to do the same thing in the other SignupController methods i can actually see that $session is an object with its properties and methods...



Hi,

Try to create 
app/Filters create an auth file there to validate exp: auth.php

<?php namespace App\Filters;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;
class Auth implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
// if user not logged in
if(! session()->get('logged_in')){
// then redirct to login page
return redirect()->to('/login');
}
}
//--------------------------------------------------------------------
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// Do something here
}
}


After that, open the “Filters.php” file located in the “app/Config” folder, then find the following code:

public $aliases

add one line with

public $aliases = [
'csrf'    => \CodeIgniter\Filters\CSRF::class,
'toolbar'  => \CodeIgniter\Filters\DebugToolbar::class,
'honeypot' => \CodeIgniter\Filters\Honeypot::class,
'auth'    => \App\Filters\Auth::class,---------------------------------this line

Next, open the “Routes.php” file located in the “app/Config” folder, then find the following code:


$routes->get('/dashboard', 'Dashboard::index',['filter' => 'auth']);

this is a better approach to deal with redirect to login
Reply


Messages In This Thread
RE: problem with custom controller constructor - by jagdeepphull - 01-17-2023, 09:19 PM



Theme © iAndrew 2016 - Forum software by © MyBB