I'm happy a bit of a variable scoping problem. Maybe I just need more coffee...
Here's my (simplified) code - this is in CodeIgniter 2:
class Agent extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('agent_model');
// Get preliminary data that will be often-used in Agent functions
$user = $this->my_auth_library->get_user();
$agent = $this->agent_model->get_agent($user->id);
}
public function index()
{
$this->template->set('info', $this->agent_model->get_info($agent->id));
$this->template->build('agent/welcome');
}
Unfortunately, when I run the index function, I'm told:
A PHP Error was encountered
Severity: Notice
Message: Undefined variable: agent
Filename: controllers/agent.php
Line Number: 51
Line 51 is the first line of the index function. What's going wrong? Is this a scope issue or something else?
Thanks!
You haven't set $agent
in your index action, if you want variables set in the constructor accessible then you have to set them as a class property ie: $this->Agent = ...;
, and access them in the same way with $this->Agent->id
. (I would capitalise them to show that they are objects and not just variables) For example:
$this->User = $this->my_auth_library->get_user();
$this->Agent = $this->agent_model->get_agent($user->id);
The constructor behaves the same as any other class methods, its only special property is that it's automatically ran when the class is instantiated, normal variable scope still applies.
you need to define the variables outside the constructor, like this:
class Agent extends CI_Controller {
private $agent;
private $user;
public function __construct() {
parent::__construct();
$this->load->model('agent_model');
// Get preliminary data that will be often-used in Agent functions
$this->user = $this->my_auth_library->get_user();
$this->agent = $this->agent_model->get_agent($user->id);
}
public function index() {
$this->template->set('info', $this->agent_model->get_info($this->agent->id));
$this->template->build('agent/welcome');
}
}
then you can set and get them using $this->agent