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


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

Спасибо.

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

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

Author: James A Mohler, 2009-11-15

6 answers

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

Поместите что-то подобное в свой 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');
        }
    }
}

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

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

 60
Author: Franz, 2017-12-18 10:14:38

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

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

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

 1
Author: djna, 2009-11-15 15:47:02
<?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
Author: David, 2017-09-18 16:53:40
  1. Создать структуру папок
  2. Настройка.htaccess и виртуальных хостов
  3. Создайте класс конфигурации для построения массива конфигурации

Контроллер

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

Просмотры

  1. Создайте родительский класс представлений для создания представлений. (данные, путь) с путем по умолчанию, заданным контроллером, , функциями визуализации для возврата полного временного пути (нестатического)
  2. Создайте функцию визуализации с помощью ob_start(), ob_get_clean для возврата и отправки содержимого в браузер.
  3. Измените класс приложения, чтобы проанализировать данные для просмотра класса. если путь возвращен, перейдите также в класс просмотра.
  4. Макеты..планировка зависит от маршрутизатор. повторно проанализируйте html-код макета для просмотра и визуализации
 0
Author: David, 2017-09-18 18:09:06
<?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
Author: David, 2017-12-16 11:56:39

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

    <?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);
    }
?>
 -1
Author: irenecarnay, 2017-02-22 07:55:02