Czy poprawnie zrobiłem wzorzec MVC?

0

Proszę o sprawdzenie poniższego kodu ze wzorcem MVC, i ocenę - czy prawidłowo, co jest źle. Z góry bardzo dziękuję i bardzo proszę o pomoc, tydzień czasu czekam na obu forach i w kij czasu stracone.. Chodzi mi o te kontrolery i widoki, czy te widoki prawidłowo napisałem, zrobiłem, czy inaczej je powinienem ładować.

controllers/controller.php

<?php 

  class Controller {
  
    public $view;
    
    public function __construct() {  
      $this->view = new View;  
    }
    
  }
  
?>

controllers/index.php

<?php 

  class indexController extends Controller {
  
    public function index()
    {
      $this->view->setHeader('views/head.php');
      $this->view->setContent('views/index.php');
      $this->view->setFooter('views/footer.php');
      $this->view->render();  
    }
  }
  
?>

view/view.php

<?php 

  class View {
    
    private $header_path;
    private $content_path;
    private $footer_path;
    
    public function setHeader($path) // ustawia header
    {
      $this->header_path = $path;
    }
    public function setContent($path) // ustawia content
    {
      $this->content_path = $path;
    }
    public function setFooter($path) // ustawia stopke
    {
      $this->footer_path = $path;
    }
    public function render() // wyswietla widok
    {
      // header
      if(!empty($this->header_path) && file_exists($this->header_path))
        require_once $this->header_path;
      
      // content  
      if(!empty($this->content_path) && file_exists($this->content_path))
        require_once $this->content_path;
      
      // footer  
      if(!empty($this->footer_path) && file_exists($this->footer_path))
        require_once $this->footer_path;
    }
    
  }

?>

w views/index.php mam tylko html

1

Wygląda sensownie. Pytanie teraz jeszcze jak wygląda model :-)

Zastanów się tylko czy nie chcesz zrezygnować pełnych ścieżek w ustawianiu ścieżek w kontrolerze do widoku - skoro views się powtarza, to może po prostu zawsze ładować z tego katalogu (względnie ustawić jego nazwę w jakiejś konfiguracji)? Albo może w ogóle chcesz wyjść z założenia w stylu ASP.NET MVC, gdzie każda akcja ma swój widok - znaczy akcja index w kontrolerze home jest postaci views/home/index.html.

Za każdym razem też chcesz ustawiać nagłówek i stopkę? Możesz też pójść w drugą stronę i includować te elementy bezpośrednio już w widoku, samym content.

0

Próbowałem wcześniej już ładować header i footer w konstruktorze klasy Views, ale pisali mi, że tak nie można robić, i co jeżeli będę chciał ustawić inny header..

teraz zrobiłem tak:
w /index.php dodałem na samej górze

define('VIEWS_DIRECTORY', 'views/');

/views/view.php teraz wygląda tak

<?php 

  class View {
    
    private $header_path;
    private $content_path;
    private $footer_path;
    
    public function setHeader($path) // ustawia header
    {
      $this->header_path = VIEWS_DIRECTORY.$path;
    }
    public function setContent($path) // ustawia content
    {
      // domyslny header
      if(empty($this->header_path))
        $this->header_path = VIEWS_DIRECTORY.'head.php';
    
      // content
      $this->content_path = VIEWS_DIRECTORY.$path;
      
      // domyslna stopka
      if(empty($this->footer_path))
        $this->footer_path = VIEWS_DIRECTORY.'footer.php';
    }
    public function setFooter($path) // ustawia stopke
    {
      $this->footer_path = VIEWS_DIRECTORY.$path;
    }
    public function render() // wyswietla widok
    {
      // header
      if(!empty($this->header_path) && file_exists($this->header_path))
        require_once $this->header_path;
      
      // content  
      if(!empty($this->content_path) && file_exists($this->content_path))
        require_once $this->content_path;
      
      // footer  
      if(!empty($this->footer_path) && file_exists($this->footer_path))
        require_once $this->footer_path;
    }
    
  }

?>

/controllers/index.php

<?php 

  class indexController extends Controller {
  
    public function index()
    {
      $this->view->setContent('index.php');
      $this->view->render();  
    }
  }
  
?>

Czy w /views/views.php dobrze napisałem te metody, czy tworząc tam w metodzie setContent domyślny header i stopkę - czy jest to poprawnie zrobione, i czy jeżeli podałem tam nazwy head.php i footer.php to czy nie jest to jakiś błąd że podałem "ścieżkę", nazwę pliku ?

1

To nie jest tak, że jest błąd, albo że się coś powinno robić tak, a nie inaczej. Sam wzorzec MVC nie zajmuje się takimi sprawami, tylko mówi o rozdzieleniu warstw. Więc to, że masz zmienną konfiguracyjną, a potem nazwy plików wpisane na stałe to nie jest błąd - zrób tak, aby ci było wygodnie!

Ja na przykład przeniósłbym definiowanie VIEWS_DIRECTORY do jakiegoś config.php... ale głównie dlatego, że tak się przyzwyczaiłem, że tak się robi we frameworkach, których używałem. I w sumie nigdy nie zmieniłem nazwy katalogu views...

0

Ja bym przeniósł metodę render() do kontrolera i zrezygnował z klasy View ;)

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