An example of an MVC controller

后端 未结 6 520
有刺的猬
有刺的猬 2020-12-22 16:09

I have been reading a lot about how and why to use an MVC approach in an application. I have seen and understand examples of a Model, I have seen and understand examples of

相关标签:
6条回答
  • 2020-12-22 16:50

    Imagine three screens in a UI, a screen where a user enters some search criteria, a screen where a list of summaries of matching records is displayed and a screen where, once a record is selected it is displayed for editing. There will be some logic relating to the initial search on the lines of

    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
    

    Where should that logic go? Not in the view or model surely? Hence this is the job of the controller. The controller would also be responsible for taking the criteria and invoking the Model method for the search.

    0 讨论(0)
  • 2020-12-22 16:50

    Please check this:

        <?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);
        }
    ?>
    
    0 讨论(0)
  • 2020-12-22 16:53
    1. Create folder structure
    2. Setup .htaccess & virtual hosts
    3. Create config class to build config array

    Controller

    1. Create router class with protected non static, with getters
    2. Create init.php with config include & autoload and include paths (lib, controlelrs,models)
    3. Create config file with routes, default values (route, controllers, action)
    4. Set values in router - defaults
    5. Set uri paths, explode the uri and set route, controller, action, params ,process params.
    6. Create app class to run the application by passing uri - (protected router obj, run func)
    7. Create controller parent class to inherit all other controllers (protected data, model, params - non static) set data, params in constructor.
    8. Create controller and extend with above parent class and add default method.
    9. Call the controller class and method in run function. method has to be with prefix.
    10. Call the method if exisist

    Views

    1. Create a parent view class to generate views. (data, path) with default path, set controller, , render funcs to return the full tempalte path (non static)
    2. Create render function with ob_start(), ob_get_clean to return and send the content to browser.
    3. Change app class to parse the data to view class. if path is returned, pass to view class too.
    4. Layouts..layout is depend on router. re parse the layout html to view and render
    0 讨论(0)
  • 2020-12-22 16:57
    <?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 讨论(0)
  • 2020-12-22 17:01

    Request example

    Put something like this in your 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();
    

    Really basic, but you get the idea... (I also didn't take care of loading the controller class, but I guess that can be done either via autoloading or you know how to do it.)

    Simple controller example (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');
            }
        }
    }
    

    As you see, the controller takes care of the "flow" of the application - the so-called application logic. It does not take care about data storage and presentation. It rather gathers all the necessary data (depending on the current request) and assigns it to the view...

    Note that this would not work with any framework I know, but I'm sure you know what the functions are supposed to do.

    0 讨论(0)
  • 2020-12-22 17: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 讨论(0)
提交回复
热议问题