Gdzie, jak pisać widok podstron ze wzorcem MVC

0

Witam. Zacząłem naukę o klasach i wzorcu MVC. Napisałem jako pierwsze takie "coś" w formie ćwiczenia. Prosiłbym o sprawdzenie tego kodu i o podpowiedzenie mi, czy poprawnie te klasy, metody oraz kod w nich, napisałem, i gdzie tworzy się widok? Tak jak teraz to zrobiłem w klasie View z wykorzystaniem switch'y, czy powinno się includować plik html z widokiem? A i przypomniało mi się jeszcze jedno, mając widok z wieloma zmiennymi (z php), to miesza się - dodaje się je od razu w widoku czy jakos inaczej sie to robi np jakies parsowanie? Z góry dziękuję za pomoc.

index.php

<?php 

  require_once 'classes.php';

?>

<html>
<head>
  <link rel="stylesheet" href="main.css" type="text/css" />
  
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>

  <div class="page">
    <div class="top"></div>
    
    <a href="?page=kontakt">Kontakt</a>
    <a href="?page=pomoc">Pomoc</a>
    <a href="?page=oferta">Oferta</a>
    
    <?php 
      
      $controller = new Controller();
      $controller->load();
      
    
    
    ?>
    
    elo
  </div>
</body>
</html>         

classes.php

<?php 

  class Model {
  
  }
  class View {
    
    public function showPage($param) // protected
    {
      switch($param)
      {
        case 'kontakt':
        {
          echo '<div><b>Kontakt</b></div>';
          echo '<p>Jesli chcesz sie z nami skontaktowac napisz do nas na adres email</p>';
          
          break;
        }  
        case 'pomoc':
        {
          echo '<div><b>Pomoc</b></div>';
          echo '<p>Nie udzielamy pomocy, spierniczac.</p>';
          
          break;
        }  
        case 'oferta':
        {
          echo '<div><b>Oferta</b></div>';
          echo '<p>Oferujemy wszystko i nic, za darmo i drogo.</p>';
          
          break;
        }
      }
    }
    
  }
  class Controller {
  
    private $page;
    private $view;
      
    public function load()
    {
      $this->page = $_GET['page'];
      $this->view = new View;
      
      switch($this->page)
      {
        case 'kontakt':
          $this->view->showPage('kontakt');
          break;
          
        case 'pomoc':
          $this->view->showPage('pomoc');
          break;
          
        case 'oferta':
          $this->view->showPage('oferta');
          break;
      }
    }
  
  }
  

?>
1

Najlepiej zrobić sobie Front Controller (http://pl.wikipedia.org/wiki/Front_Controller_(wzorzec_projektowy)).

Tutaj prosty przykład z dokumentacji frameworka Symfony 2:

<?php
// index.php

// load and initialize any global libraries
require_once 'model.php';
require_once 'controllers.php';

// route the request internally
$uri = $_SERVER['REQUEST_URI'];
if ('/index.php' == $uri) {
    list_action();
} elseif ('/index.php/show' == $uri && isset($_GET['id'])) {
    show_action($_GET['id']);
} else {
    header('Status: 404 Not Found');
    echo '<html><body><h1>Page Not Found</h1></body></html>';
}

i dalej akcje wraz z templatkami:

function list_action()
{
    $posts = get_all_posts();
    require 'templates/list.php';
}

function show_action($id)
{
    $post = get_post_by_id($id);
    require 'templates/show.php';
}

Oczywiście to tylko jedno z podejść, dosyć proste i łatwe do zrozumienia. Twoje modele i kontrolery możesz napisać w postaci klas, tutaj dla zobrazowania proste funkcje.

Ten twój kod nadal ma mało wspólnego z MVC :).

Jeżeli chodzi o same widoki, to po prostu HTML z wstawkami php:

<!DOCTYPE html>
<html>
    <head>
        <title>List of Posts</title>
    </head>
    <body>
        <h1>List of Posts</h1>
        <ul>
            <?php foreach ($posts as $post): ?>
            <li>
                <a href="/read?id=<?php echo $post['id'] ?>">
                    <?php echo $post['title'] ?>
                </a>
            </li>
            <?php endforeach; ?>
        </ul>
    </body>
</html>
0

z tego co podałeś na początku, wnioskuję, że to co powinno być w kontrolerze - obsługa żądań, zrobiłeś w index.php
Co robię źle, że ten mój kod ma mało wspólnego z MVC? W kontrolerze przecież mam obsługę żądań, w widoku jest kod html od widoku.

1

Nie jestem turbo znawcą w temacie wzorców projektowych ;). Plik index.php obsługuje żądania zgodnie z ideą wzorca Front Controller.

Co mi się nie podoba w twoim podejściu to np: klasa View. Według mnie widok to tylko sztywny szablon który przyjmuje pewnie dane i je wyświetla, a Ty w klasie View masz pewną logikę, która decyduje o tym który widok ma być wyświetlany(ten switch w funkcj showPage).

Ogólna idea jest prosta, mamy model(abstrakcja danych), widok('szablon' tego jak nasze dane mają być prezentowane) i kontroler, który ładnie łączy nam te warstwy. Zazwyczaj działanie kontrolera(akcji) polega na odebraniu żądania i przekształceniu go w odpowiedź(np: żądanie 'pokazania' użytkownika, czyli bierzemy model użytkownika, pobieramy dane i przekazujemy je do widoku) i tyle ;).

Na początek możesz przyjąć prostą strukturę projektu:

-/model/
-/view/
-/controller/
-index.php

W katalogu model trzymasz klasy reprezentujące twoje dane i klasy które umożliwiają manipulacje tymi danymi np:

class User
{
    $username;
    $password;

    function getUsername()
    {
         return $this->username;
    }
    //itd...
}

class UserRepository
{
    function getUsers()
    {
    }

    function getUserById()
    {
    }
    //itd..
}

W katalogu view trzymasz szablony widoków np:

    //user_profile.php
    //kod html odpowiadąjący za wygląd twojej strony
    <ul>
        <li>username: <?php $user->getUsername(); ?></li>
        <li>password: <?php $user->getPassword(); ?></li>
    </ul>
    //itd..

W katalogu controller masz klasy kontrolerów np:

class ProfileController
{
    function showAction($id)
    {
         $user = $userRepository->getUserById($id);
         
         require 'view/user_profile.php';
    }
}

W pliku index.php masz Front Controller, który przyporządkowuje akcje według URI. Prościej się chyba nie da :)

0

Coś tam "namazałem" od nowa, prosiłbym o sprawdzenie struktury i kodu (po maks. kilkanascie linijek w pliku wiec nie duzo) http://www.sendspace.com/file/bn7n5f Z góry dziękuję.

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