Пример контроллера MVC - PullRequest
       8

Пример контроллера MVC

38 голосов
/ 15 ноября 2009

Я много читал о том, как и зачем использовать подход MVC в приложении. Я видел и понимаю примеры модели, я видел и понимаю примеры View ... но я все еще нечеткий на контроллере. Мне бы очень хотелось увидеть достаточно тщательный пример контроллера (ов). (в PHP, если это возможно, но любой язык поможет)

Спасибо.

PS: Было бы неплохо увидеть пример страницы index.php, которая решает, какой контроллер использовать и как.

РЕДАКТИРОВАТЬ: Я знаю, что такое работа контроллера, я просто не понимаю, как это сделать в ООП.

Ответы [ 6 ]

61 голосов
/ 15 ноября 2009

Пример запроса

Поместите что-то вроде этого в ваш index.php:

<?php

// Holds data like $baseUrl etc.
include 'config.php';

$requestUrl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$requestString = substr($requestUrl, strlen($baseUrl));

$urlParams = explode('/', $requestString);

// TODO: Consider security (see comments)
$controllerName = ucfirst(array_shift($urlParams)).'Controller';
$actionName = strtolower(array_shift($urlParams)).'Action';

// Here you should probably gather the rest as params

// Call the action
$controller = new $controllerName;
$controller->$actionName();

Действительно просто, но вы поняли идею ... (Я также не позаботился о загрузке класса контроллера, но, думаю, это можно сделать либо с помощью автозагрузки, либо вы знаете, как это сделать.)

Пример простого контроллера (controllers / login.php):

<?php    

class LoginController
{
    function loginAction()
    {
        $username = $this->request->get('username');
        $password = $this->request->get('password');

        $this->loadModel('users');
        if ($this->users->validate($username, $password))
        {
            $userData = $this->users->fetch($username);
            AuthStorage::save($username, $userData);
            $this->redirect('secret_area');
        }
        else
        {
            $this->view->message = 'Invalid login';
            $this->view->render('error');
        }
    }

    function logoutAction()
    {
        if (AuthStorage::logged())
        {
            AuthStorage::remove();
            $this->redirect('index');
        }
        else
        {
            $this->view->message = 'You are not logged in.';
            $this->view->render('error');
        }
    }
}

Как видите, контроллер заботится о «потоке» приложения - так называемой логике приложения. Он не заботится о хранении и представлении данных. Скорее, он собирает все необходимые данные (в зависимости от текущего запроса) и присваивает их представлению ...

Обратите внимание, что это не будет работать ни с одним из известных мне фреймворков, но я уверен, что вы знаете, что должны делать функции.

1 голос
/ 15 ноября 2009

Представьте себе экраны в пользовательском интерфейсе, экран, где пользователь вводит некоторые критерии поиска, экран, на котором отображается список сводок соответствующих записей, и экран, на котором после выбора записи она отображается для редактирования. Будет некоторая логика, относящаяся к начальному поиску в строках

if search criteria are matched by no records
    redisplay criteria screen, with message saying "none found"
else if search criteria are matched by exactly one record
    display edit screen with chosen record
else (we have lots of records)
    display list screen with matching records

Куда должна идти эта логика? Не в виде или модели наверняка? Следовательно, это работа контроллера. Контроллер также будет отвечать за выбор критериев и вызов метода Model для поиска.

0 голосов
/ 18 сентября 2017
  1. Создать структуру папок
  2. Настройка .htaccess и виртуальных хостов
  3. Создание класса конфигурации для создания массива конфигурации

Контроллер

  1. Создание класса маршрутизатора с защищенным нестатическим, с геттерами
  2. Создайте init.php с помощью config include & autoload и включите пути (lib, controlelrs, models)
  3. Создать файл конфигурации с маршрутами, значениями по умолчанию (маршрут, контроллеры, действие)
  4. Установить значения в роутере - по умолчанию
  5. Установите пути uri, взорвите uri и установите маршрут, контроллер, действие, параметры, параметры процесса.
  6. Создать класс приложения для запуска приложения, передав uri - (защищенный маршрутизатор obj, запустить func)
  7. Создание родительского класса контроллера для наследования всех других контроллеров (защищенные данные, модель, параметры - не статичны) установить данные, параметры в конструкторе.
  8. Создайте контроллер и добавьте вышеуказанный родительский класс и добавьте метод по умолчанию.
  9. Вызвать класс и метод контроллера в функции run. Метод должен быть с префиксом.
  10. Вызовите метод, если он существует

Просмотры

  1. Создать родительский класс представлений для генерации представлений. (данные, путь) с путем по умолчанию, установить контроллер, функции рендеринга в вернуть полный темплатный путь (не статичный)
  2. Создайте функцию рендеринга с помощью ob_start (), ob_get_clean для возврата и отправки содержимого в браузер.
  3. Изменение класса приложения для анализа данных для просмотра класса. если путь возвращен, перейдите также к классу просмотра.
  4. Layouts .. Layout зависит от маршрутизатора. повторно проанализируйте макет HTML для просмотра и визуализации
0 голосов
/ 18 сентября 2017
<?php

class App {
    protected static $router;

    public static function getRouter() {
        return self::$router;
    }

    public static function run($uri) {
        self::$router = new Router($uri);

        //get controller class
        $controller_class = ucfirst(self::$router->getController()) . 'Controller';
        //get method
        $controller_method = strtolower((self::$router->getMethodPrefix() != "" ? self::$router->getMethodPrefix() . '_' : '') . self::$router->getAction());

        if(method_exists($controller_class, $controller_method)){
            $controller_obj = new $controller_class();
            $view_path = $controller_obj->$controller_method();

            $view_obj = new View($controller_obj->getData(), $view_path);
            $content = $view_obj->render();
        }else{
            throw new Exception("Called method does not exists!");
        }

        //layout
        $route_path = self::getRouter()->getRoute();
        $layout = ROOT . '/views/layout/' . $route_path . '.phtml';
        $layout_view_obj = new View(compact('content'), $layout);
        echo $layout_view_obj->render();
    }

    public static function redirect($uri){
        print("<script>window.location.href='{$uri}'</script>");
        exit();
    }
}
0 голосов
/ 18 сентября 2017
<?php
class Router {

    protected $uri;

    protected $controller;

    protected $action;

    protected $params;

    protected $route;

    protected $method_prefix;

    /**
     * 
     * @return mixed
     */
    function getUri() {
        return $this->uri;
    }

    /**
     * 
     * @return mixed
     */
    function getController() {
        return $this->controller;
    }

    /**
     * 
     * @return mixed
     */
    function getAction() {
        return $this->action;
    }

    /**
     * 
     * @return mixed
     */
    function getParams() {
        return $this->params;
    }

    function getRoute() {
        return $this->route;
    }

    function getMethodPrefix() {
        return $this->method_prefix;
    }

        public function __construct($uri) {
            $this->uri = urldecode(trim($uri, "/"));
            //defaults
            $routes = Config::get("routes");
            $this->route = Config::get("default_route");
            $this->controller = Config::get("default_controller");
            $this->action = Config::get("default_action");
            $this->method_prefix= isset($routes[$this->route]) ? $routes[$this->route] : '';


            //get uri params
            $uri_parts = explode("?", $this->uri);
            $path = $uri_parts[0];
            $path_parts = explode("/", $path);

            if(count($path_parts)){
                //get route
                if(in_array(strtolower(current($path_parts)), array_keys($routes))){
                    $this->route = strtolower(current($path_parts));
                    $this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : '';
                    array_shift($path_parts);
                }

                //get controller
                if(current($path_parts)){
                    $this->controller = strtolower(current($path_parts));
                    array_shift($path_parts);
                }

                //get action
                if(current($path_parts)){
                    $this->action = strtolower(current($path_parts));
                    array_shift($path_parts);
                }

                //reset is for parameters
                //$this->params = $path_parts;
                //processing params from url to array
                $aParams = array();
                if(current($path_parts)){ 
                    for($i=0; $i<count($path_parts); $i++){
                        $aParams[$path_parts[$i]] = isset($path_parts[$i+1]) ? $path_parts[$i+1] : null;
                        $i++;
                    }
                }

                $this->params = (object)$aParams;
            }

    }
}
0 голосов
/ 22 февраля 2017

Пожалуйста, проверьте это:

    <?php
    global $conn;

    require_once("../config/database.php");

    require_once("../config/model.php");

    $conn= new Db;

    $event = isset($_GET['event']) ? $_GET['event'] : '';

    if ($event == 'save') {
        if($conn->insert("employee", $_POST)){
            $data = array(
                'success' => true,
                'message' => 'Saving Successful!',
            );
        }

        echo json_encode($data);
    }

    if ($event == 'update') {
        if($conn->update("employee", $_POST, "id=" . $_POST['id'])){
            $data = array(
                'success' => true,
                'message' => 'Update Successful!',
            );
        }

        echo json_encode($data);
    }

    if ($event == 'delete') {
        if($conn->delete("employee", "id=" . $_POST['id'])){
            $data = array(
                'success' => true,
                'message' => 'Delete Successful!',
            );
        }

        echo json_encode($data);
    }

    if ($event == 'edit') {
        $data = $conn->get("select * from employee where id={$_POST['id']};")[0];
        echo json_encode($data);
    }
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...