У меня есть данные, которые я хочу передать каждому представлению. Я использую CodeIgniter 3 и мне доступен PHP 7. В настоящее время я использую что-то подобное в каждой функции.
$data['foobar'] = $this->general_model->foobar();
// More code
$this->load->view('homepage', $data);
Я бы предпочел не звонить $data['foobar'] = $this->general_model->foobar();
на каждую функцию.
Я перепробовал много подходов, чтобы исправить это, не прибегая к чему-то, что делает код слишком глупым. Я пробовал конструкторы, автозагрузку и хуки. Проблема в каждом случае сводится к тому, что $data
является локальным для каждой функции. Лучшее, что я получил, это обычно что-то вроде этого.
$data['foobar'] = $this->foobar;
// More code
$this->load->view('homepage', $data);
Это немного лучше, но это все равно приводит к тому, что я помещаю эту строку в каждую функцию.
Я хотел бы, чтобы мои функции каким-то образом наследовали $data
с указателем foobar
уже установлено. Я предпочел бы избежать решения, которое требует, чтобы каждая функция получала $data
в качестве параметра. Как я могу сделать это?
Опция 1:
Не уверен, что вы попробовали это, но вы можете установить $ data как свойство вашего класса
protected $data = [];
Затем в вашем конструкторе установите его.
$this->data['foobar'] = $this->general_model->foobar();
Это будет означать, что ваши $ data станут доступны для всех ваших методов в контроллере, и вам нужно будет ссылаться на них как $this->data['data_name']
и использовать его в виде, как
$this->load->view('homepage', $this->data);
Вариант 2:
Второй способ — создать метод, подобный render (), который является общим для всех ваших методов, которые загружают представления и заменяют существующие вызовы представлений.
Таким образом, вы бы что-то вроде …
public function one_of_my_methods(){
$data['content'] = 'This is content 1';
$this->render('test_view',$data); // Call the new view handler
}
// All methods using views now call this to load the final view
public function render($view,$data){
$data['foobar'] = 'I am common'; // DRY
$this->load->view($view, $data);
}
Других решений пока нет …