vista mvc modelo ejemplos ejemplo descargar curso controlador php model-view-controller

php - modelo - mvc ejemplos



Un ejemplo de un controlador MVC (6)

He estado leyendo mucho sobre cómo y por qué usar un enfoque MVC en una aplicación. He visto y entiendo ejemplos de un Modelo, he visto y entiendo ejemplos de la Vista ... pero TODAVÍA soy confuso en el controlador. Realmente me encantaría ver un ejemplo lo suficientemente completo de un controlador (s). (en PHP si es posible, pero cualquier idioma ayudará)

Gracias.

PD: También sería genial si pudiera ver un ejemplo de una página index.php, que decide qué controlador usar y cómo.

EDITAR: Sé cuál es el trabajo del controlador, realmente no entiendo cómo lograr esto en OOP.


  1. Crear estructura de carpetas
  2. Configuración .htaccess y hosts virtuales
  3. Crear clase de configuración para construir matriz de configuración

Controlador

  1. Crear clase de enrutador con protección no estática, con getters
  2. Crear init.php con config include & autoload e incluir rutas (lib, controlelrs, modelos)
  3. Crear archivo de configuración con rutas, valores predeterminados (ruta, controladores, acción)
  4. Establecer valores en el enrutador - valores predeterminados
  5. Establezca las rutas uri, explote la uri y configure la ruta, el controlador, la acción, los params, los parámetros del proceso.
  6. Crear clase de aplicación para ejecutar la aplicación pasando uri - (obj de enrutador protegido, ejecutar func)
  7. Cree la clase padre del controlador para heredar todos los demás controladores (datos protegidos, modelo, params, no estáticos), establezca los datos, params en el constructor.
  8. Cree el controlador y extiéndalo con la clase principal anterior y agregue el método predeterminado.
  9. Llame a la clase y al método del controlador en la función de ejecución. método tiene que ser con prefijo.
  10. Llame al método si existe

Puntos de vista

  1. Cree una clase de vista principal para generar vistas. (datos, ruta) con la ruta predeterminada, establecer el controlador, renderizar los funcs para devolver la ruta completa de tempalte (no estática)
  2. Cree la función de renderizado con ob_start (), ob_get_clean para devolver y enviar el contenido al navegador.
  3. Cambiar la clase de la aplicación para analizar los datos para ver la clase. si se devuelve la ruta, pase a ver la clase también.
  4. Layouts..layout depende del enrutador. re parse el diseño html para ver y renderizar

Imagine que hay pantallas en una IU, una pantalla donde un usuario ingresa algunos criterios de búsqueda, una pantalla donde se muestra una lista de resúmenes de registros coincidentes y una pantalla donde, una vez que se selecciona un registro, se muestra para editar. Habrá alguna lógica relacionada con la búsqueda inicial en las líneas de

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

¿A dónde debería ir esa lógica? No en la vista o modelo seguramente? Por lo tanto, este es el trabajo del controlador. El controlador también sería responsable de tomar los criterios e invocar el método del Modelo para la búsqueda.


Por favor, chequee esto:

<?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); } ?>


Ejemplo de solicitud

Pon algo así en tu 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();

Realmente básico, pero entiendes la idea ... (Tampoco me encargué de cargar la clase de controlador, pero supongo que se puede hacer a través de la carga automática o sabes cómo hacerlo).

Ejemplo de controlador simple (controladores / 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''); } } }

Como puede ver, el controlador se ocupa del "flujo" de la aplicación, la llamada lógica de la aplicación. No se ocupa del almacenamiento y la presentación de datos. Más bien reúne todos los datos necesarios (según la solicitud actual) y los asigna a la vista ...

Tenga en cuenta que esto no funcionaría con ningún marco que conozca, pero estoy seguro de que sabe lo que se supone que deben hacer las funciones.


<?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(); } }


<?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; } } }