Динамический сайт PHP с MVC - Что это за шаблон навигации? - PullRequest
0 голосов
/ 25 ноября 2010

All

Я изучаю некоторый пример кода, приведенный в моем классе веб-разработки, в качестве примера MVC (опять же, для Интернета). В этом коде есть система для перехода от страницы index.php к различным контроллерам (которые затем вызывают модули Model и View), а затем обратно в index.php.

Я понимаю, как работает MVC.

То, с чем я борюсь, - это механизм навигации. У меня возникают трудности с пониманием того, как все части работают вместе.

Может ли кто-нибудь взглянуть на приведенный ниже код и сказать мне, соответствует ли это общеизвестному методу / шаблону для динамической навигации по сайту? (Может быть, передний контроллер?) Если это так, то я надеюсь, что мне будет легче провести еще какое-то исследование по этому вопросу.

Большое спасибо!

JDelage

Index.php

<?php
require_once("User.php");
session_start();

if (isset($_GET['action'])) 
  $action= $_GET['action'];
 else
   $action="";

switch ($action) {
 case 'login':
   require_once('Login.php');
   $command= new LoginControler();
   break;
 case 'logoff':
   require_once('Logoff.php');
   $command= new LogoffControler();
   break;
// Several other cases
 default:
   require_once('Unknown.php');
   $command= new UnknownControle();
}


$command->execute();
require_once('EntryMenu.php'); // Those are objects that represent both the 
// menu label and the links.
$menu= array(
         new EntryMenu("Login", "index.php", array("action" => "logon")),
         new EntryMenu("Logoff", "index.php", array("action" => "logoff")),
         new EntryMenu("Write", "index.php", array("action" => "write")),
         new EntryMenu("Read", "index.php", array("action" => "read"))
);

if ($command->redirect) {
  header('Location: ' . $command->redirect);
 } else if ($command->page) {

  include("ui/header.php");
  include("ui/menu.php");
  echo "<div class='content'>";
  include("ui/". $command->page);
  echo "</div>";
  include("ui/footer.php");
 }
?>

Controler.php

<?php
class Controler {
    public $page= "problem.php";
    function execute() {}
}
?>

LogoffControler.php

<?php
require_once('Controler.php');
class LogoffControler extends Controler {

  function execute() {
    $this->redirect= "index.php";
    unset($_SESSION['user']);
  } 
}
?>

LoginControler.php

<?php
 require_once('LoginModel.php'); // This manages the exchanges with the user db
 require_once('Controler.php');

 class ConnexionControle extends Controler {
  public $page= "LoginForm.php";

  function execute() {

  // More code to deal with incorrectly filled login forms

  $login = new LoginModel();
  $login->loginUser($_POST['login'], $_POST['password']);
  if ($login->userLogedIn()) {
    $_SESSION['user']= $login->user;
    $this->redirect= "index.php";
  }

// More code to deal with invalid logins

 } 
}
?>

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Я предполагаю, что вы понимаете часть контроллера, и спрашивает о выражениях switch..case.Я еще не встречал официального названия для этого, но большинство сред MVC для PHP (Kohana, CakePHP, CodeIgniter, Fat Free и т. Д.) Называют эту «маршрутизацию».Это сопоставление URL с контроллером.

Использование набора операторов switch..case - один из самых простых способов.Более сложные решения используют RegEx для сопоставления предопределенных шаблонов URL, чтобы определить, какой контроллер вызывать, и каковы его параметры (обычно связанные как «запрос»)

Другие методы включают использование перезаписи URL для получения довольноURL-адреса, такие как /articles/month/nov/article-id/3

, что в «форме уродливого URL»:

action=articles&month=nov&article-id=3
1 голос
/ 25 ноября 2010

Если вы хотите легко разобраться с версией системы MVC, вы можете попробовать 1kb PHP MVC , который обрабатывает все, что вы пытаетесь, гораздо чище. Хотя вам, возможно, придется разбить код, если вы действительно хотите прочитать его в сжатом виде.

С помощью этой системы вы просто помещаете контроллер в /classes/controller/ с именем somthing.php и затем можете получить к нему доступ с URL-адреса, например http://site.com/something.

Загрузка моделей также проста и не требует вызовов include или require.

class Controller_Something
{
 public function index()
 {

  $model = new Model_User();
 }
}
...