PHP & Codeigniter - как передать параметры модели? - PullRequest
16 голосов
/ 19 июля 2009

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

$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
}

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

UPDATE: (из одного из ответов мой оригинальный вопрос решен .. спасибо!) Просто чтобы объяснить, почему я хотел сделать это: идея в том, чтобы иметь возможность повторно использовать модельный класс. Таким образом, в основном, чтобы привести простой пример, я хотел бы иметь возможность передавать переменную "order_by" в класс модели, чтобы я мог повторно использовать логику в классе модели (и динамически изменять значение order-by в sql) без необходимости создать отдельный класс или отдельную функцию.

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

Ответы [ 4 ]

21 голосов
/ 19 июля 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 для каждой функции.

3 голосов
/ 19 июля 2009

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

1 голос
/ 08 февраля 2012

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

0 голосов
/ 01 сентября 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

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...