Poprawne korzystanie z widoków w MVC

0

Witam
Od ostatniego czasu "walczę" z MVC ale zatrzymuje się na widokach, mianowicie staram się ogarnąć ten temat jak najlepiej/wydajniej aby zrobić dużo a się nie narobić. ;)
Korzystam z CodeIgniter'a, i nie mogę doszukać się najlepszej metody na ładowanie widoków z różnymi danymi.
W pierwszej fazie moje widoki podzieliłem na

  1. nagłówek
  2. content
  3. stopka

A tu przykładowy kod który aktualnie używam:

$this->load->view('naglowek', $data_nag);
// content
$this->load->view('panel/sidebar');
$this->load->view('panel/index', $data_content);
//
$this->load->view('stopka');

Nie oceniam go jakoś dobrze bo co jak będe chciał dodać jakiś element z danymi przed stopką? Albo przed contentem? Wtedy będe musiał edytować każdy z elementów kontrolera/ów.

Ładowanie jednego widoku z tablicą danych gdzie będe miał kolejne tablice z danymi dla poszczególnych widoków które są ładowane w głównym widoku jest dla mnie trochę topornę ale już chyba lepsze?
Gdzieś na końcu głowy mam jeszcze jeden pomysł jak korzystać z widoków ale też nie jest on (chyba) idealny.
Przeglądałem parę projektów opartych o CI ale większość korzysta z jakiejś biblioteki do widoków, albo posiada jakieś własne rozwiązanie tego.

Mógłby ktoś poradzić/pomóc z tym tematem?

Pozdrawiam :)

1

Korzystaj z layoutów, wtedy pozbędziesz się kwestii nagłówka i stopki.

<html>
<head>
  <title><?= $this->title ?></title>
</head>
<body class="body ale-fajne-ciałko">
  <div class="content">
    <div class="main">
      <?= $this->content ?>
    </div>
    <div class="footer">
      Stopka i w ogóle
    </div>
</body>

A potem w kontrolerze ładujesz tylko jeden widok, odpowiedzialny za daną akcję kontrolera i po problemie, np.:

class ShowController extends Controller {
  
  protected $layout = 'main';

  public function ladiesAction() {
    $model = new LadiesModel();

    /* jakieś tam przetwarzanie */
    $this->view->render('show/ladies', [
      'list' => $model->getList(),
      jakieś inne zmienne
    ]);
  }

}

A gdy chcesz inny widok, bo np. user się zalogował, zmieniasz layout, np. gdzieś w akcji init kontrolera:

public function init() {
  if (MyFramework::getUser() !== null) {
    $this-layout = 'logged_in';
  }
}

Niemalże identyczne rozwiązanie jest w praktycznie każdym frameworku.

Bez drobnego nagięcia zasady DRY się nie obejdzie, jak sam widzisz, lecz w razie czego w lejałcie możesz korzystać z view helpers, jeżeliby się rozrósł za bardzo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1