Получите данные из модели в каждое представление, используя ООП и СУХОЙ

У меня есть данные, которые я хочу передать каждому представлению. Я использую 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 в качестве параметра. Как я могу сделать это?

0

Решение

Опция 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);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector