Передача параметров в конструктор контроллера - PullRequest
5 голосов
/ 18 декабря 2009

У меня есть контроллер, который имеет несколько методов, которые все должны делиться общей информацией. Допустим, мой формат URI выглядит так:

http://server/users/id/admin/index
http://server/users/id/admin/new
http://server/users/id/admin/list
http://server/users/id/admin/delete

Мне нужно получить некоторую информацию из базы данных для id и сделать ее доступной для всех методов вместо того, чтобы писать в каждом из них строку для вызова модели. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 19 декабря 2009
class users extends Controller {

 private $mydata = array();

 function users()
 {   
     parent::Controller();
     ....

     $this->mydata = $this->model->get_stuff($this->uri->segment(2));
 }

 function index()
 { 
     $this->mydata; //hello data!
 }

Здесь я просто жестко запрограммировал массив (что, вероятно, является действительно плохой идеей). Тем не менее, вы можете хранить данные в сеансе codeigniter, если вам нужно. Codeigniter может хранить эти данные в cookie-файле (если их общий объем составляет менее 4 КБ), в противном случае вы можете хранить большие объемы данных в базе данных (см. Документацию по этому вопросу).

См .: http://codeigniter.com/user_guide/libraries/sessions.html

Подраздел: Сохранение данных сеанса в базе данных

Вот несколько упражнений:

$this->session->set_userdata('mydata', $mydata);
....
$mydata = $this->session->userdata('mydata');
0 голосов
/ 18 декабря 2009

Исходя из вашей структуры URL и того факта, что codeignitor использует шаблон MVC, я предполагаю, что вы используете mod_rewrite для форматирования пути URL в строку запроса для index.php. В этом случае значение «id» должно быть доступно в $ _REQUEST ['id'] в любой момент выполнения скрипта ...

0 голосов
/ 18 декабря 2009

Если это не может быть решено с помощью механизма CodeIgniters Hook , вы можете переопределить метод конструктора в вашем контроллере и вызвать свой собственный. Судя по их хранилищу SVN , вы, вероятно, сделали бы что-то вроде

class YourController extends Controller
{
    function YourController()
    {
        parent::Controller();
        $this->_preDispatch();
    }

    function _preDispatch()
    {
         // any code you want to run before the controller action is called
    }

Возможно, вызов preDispatch должен быть перед вызовом parent. Просто попробуйте и посмотрите, работает ли он. Я не знал, что они все еще используют синтаксис PHP4. Тьфу: (

...