PHP & Codeigniter — как передать параметры в модель?

Я использую следующий код для инициализации модели из моего контроллера:

$this->load->model('model_name');

Можно ли как-то изменить приведенную выше строку, чтобы конструктор модели получил параметр? Я хочу использовать следующий код в конструкторе модели:

function __construct($param_var) {
   parent::Model();

   $this->$param_var = $param_var; //I'm not even sure this works in PHP..but different issue
}

Это было бы очень полезно, чтобы я мог повторно использовать свои классы моделей. Спасибо.

ОБНОВЛЕНИЕ: (из одного из ответов мой первоначальный вопрос решен .. спасибо!) Просто чтобы объяснить, почему я хотел это сделать: идея состоит в том, чтобы иметь возможность повторно использовать класс модели. Итак, в основном, чтобы привести простой пример, я хотел бы иметь возможность передать переменную "order_by" в класс модели, чтобы я мог повторно использовать логику в классе модели (и динамически изменять значение порядка в sql), не имея создать отдельный класс или отдельную функцию.

Это плохой дизайн? Если да, не могли бы вы объяснить, почему вы бы не сделали что-то подобное и как бы вы сделали это вместо этого?


person oym    schedule 19.07.2009    source источник
comment
Мне любопытно, почему вы хотите передать параметр конструктору вашей модели. Я предполагаю, что вам нужна библиотека вместо модели.   -  person Randell    schedule 19.07.2009
comment
я только что обновил свой вопрос с объяснением, почему я бы это сделал   -  person oym    schedule 19.07.2009


Ответы (4)


Я понимаю ваши доводы в пользу этого, но могу ли я предложить взглянуть на Object-Relational Mapping для потребности вашей базы данных. Существует пользовательская библиотека ORM для CodeIgniter под названием DataMapper, которую я использую в последнее время. Вы можете использовать таблицы в своих контроллерах в качестве объектов, и это может лучше подойти для вашей проблемы.

person Dom M.    schedule 19.07.2009
comment
спасибо за ссылку, но я думаю, что это может быть излишним. Я знаю, что не дал много описания своего приложения, но когда вы порекомендуете использовать эту библиотеку ORM? Разве приложение не должно быть очень интенсивным по данным (с точки зрения доступа к БД), чтобы гарантировать это? - person oym; 20.07.2009
comment
В каком-то смысле да, мне нравится его использовать, потому что это приводит к меньшему количеству кода, если ваше приложение несколько интенсивно использует данные, но если ваша БД действительно мала, это может быть немного излишним. - person Dom M.; 23.07.2009

Вы не можете передавать параметры через функцию load. Вам нужно будет сделать что-то вроде:

$this->load->model('model_name');
$this->model_name->my_constructor('stuff');

В модели:

function my_constructor($param_var) {
...
}

Ответ на обновление:

Вы можете просто передать значение order_by при вызове функции модели. Я предполагаю, что в вашем действии контроллера у вас есть что-то вроде $this->model_name->get($my_id); Просто добавьте параметр order_by в эту функцию. IMO, это делает логику вашей модели более гибкой/пригодной для повторного использования, потому что, как вы это делали, я предполагаю, что установка order_by в конструкторе установит значение order_by для каждой функции.

person jimyi    schedule 19.07.2009
comment
Спасибо, и не забывайте, что вы также можете установить значения по умолчанию $param_var=true в функции модели. - person svandragt; 01.03.2010
comment
Отличный ответ! Однако CodeIgniter каким-то образом блокирует эту парадигму. - person Abel Callejo; 04.12.2018

В модели

<?php

/* Load Model core model */
/* BASEPATH = D:\xampp\htdocs\ci_name_project\system\ */
include BASEPATH . 'core\\Model.php';

class User_model extends CI_Model {

    /* Properties */
    private $name;


    /* Constructor parameter overload */
    public function __construct($name) {
        $this->set_name($name);
    }    


    /* Set */
    public function set_name($name) {
        $this->name = $name;
    }


    /* Get */
    public function get_name() {
        return $this->name;
    }

}

в контроллере

<?php

class User_controller extends CI_Controller {

    public function index() {

        /* Load User_model model */
        /* APPPATH = D:\xampp\htdocs\ci_name_project\application\ */
        include APPPATH . 'models\\User_model.php';

        $name = 'love';

        /* Create $object_user object of User_model class */
        $object_user = new User_model($name);     

        echo $object_user->get_name(); // love

    }

}
person antelove    schedule 31.08.2018

Вместо использования DataMapper я предложил использовать IgnitedRecord, потому что DataMapper больше не поддерживается, более того, он был заменен на Ruby

person vinothvetrivel    schedule 08.02.2012