Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trait in CodeIgniter

I'm trying to use traits in CodeIgniter. I put the Trait in the libraries directory and then loaded the library in the controller. Then I used the trait in the model, but it didn't work and I received the following error

Trait file (in library):

trait DataTablesTrait{
    public function query(){
        $this->db->select('*');
        $this->db->limit(10, 1);
        return $this->db->get('my_table');
    }
}
?>

Controller:

class myController extends CI_Controller {  

    public function __construct(){
        parent::__construct();
        $this->load->library('DataTablesTrait');
        $this->load->model('ABC_Model');
    }
} 

Model:

class ABC_Model extends CI_Model {
    use DataTablesTrait;
    function callQuery(){
        $this->query();
    }
}

I got this error:

Non-existent class: DataTablesTrait

Please advise

like image 793
adwairi Avatar asked Dec 18 '17 15:12

adwairi


1 Answers

CodeIgniter (CI) isn't trait or namespace friendly but they can be used. It requires working around CI a bit though.

The main problem, the CI thing you have to work around, is the call

$this->load->library('DataTablesTrait');

CI will find this file but load->library will try to instantiate the trait which fails because it is not possible to instantiate a Trait on its own.

Replace the line above with

include APPPATH.'/libraries/DataTablesTrait.php';

You should be free of the error with that. But you're not going to get results because callQuery() does not return anything. To round out the test have callQuery() return the CI_DB_result object the Trait should produce

public function callQuery()
{
    return $this->query();
}

Add an index function to the controller so we can dump the output

public function index()
{
    $DB_result = $this->ABC_Model->callQuery();
    var_dump($DB_result->result());
}

This should produce the expected output - assuming that 'my_table' has data :)

like image 75
DFriend Avatar answered Oct 06 '22 19:10

DFriend