El patrón MVC en PHP

El MVC es un patrón de diseño de programación. Sus siglas sinifican:

  • ‘Modelo’. Las clases que forman la base de datos, es donde se ponen las entidades.
namespace CoreModule\Model;
class Entry
{
/**
* @var string
*/
private $name;
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
}
  • ‘Vista’. Lo que ve el usuario final, es el frontend de la aplicación.
<html>
<head></head>
<body>
Blabla: {{ test }}
</body>
</html>
  • ‘Controlador’. Es el encargado de combinar el modelo y la vista y transerir datos entre servicios del sistema. Por ejemplo si hay que enviar un correo será el encargado de recopilar la información necesaria, preparar el servicio de envío y el que va a llamar a la función de envío.

El patrón MVC debe tener un sistema que se llama enrutación. El mismo es el que se encarga de definir las rutas y llamar al controlador correcto.

use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$routes = new RouteCollection();
$route = new Route('/foo', array('controller' => 'CoreModule\Controller\DefaultController::foo'));
$routes->add('route_name', $route);
$route = new Route('/', array('controller' => 'CoreModule\Controller\DefaultController::test'));
$routes->add('route_name2', $route);

$context = new RequestContext($_SERVER['REQUEST_URI']);
$matcher = new UrlMatcher($routes, $context);
$context = $matcher->getContext();
$parameters = $matcher->match($context->getBaseUrl());
...
call_user_func_array(explode('::', $parameters['controller']), array($twig));

También debe tener un bootstrap donde se carga todo lo neecesario, como el sistema de vista y el sistema de persistencia a la base de datos. En nuestro caso el bootstrap está con el enrutador y solo carga el sistema de vistas.

$twig = new Twig_Environment($loader, array(
//'debug' => true,
//'cache' => './cache',
));
$escaper = new Twig_Extension_Escaper('html');
$twig->addExtension($escaper);
$twig->clearCacheFiles();
$twig->clearTemplateCache();

Por último algo que no es obligatorio pero que va muy bien es tener un autoloader. Esto lo que hace es cargar las clases automáticamente sin tener que hacer un ‘include’ o un ‘require’.

function __autoload($className)
{
if (is_file($file = 'vendor/symfony/routing/'.str_replace('\\', '/', $className).'.php'))
{
require $file;
}elseif (is_file($file = 'vendor/twig/twig/lib/'.str_replace(array('_', "\0"), array('/', ''), $className).'.php'))
{
require $file;
}else{
$path = 'src/' . str_replace('\\', '/', $className) . '.php';
if(is_file($path))
{
require_once $path;
}else{
throw new Exception('Clase no encontrada');
}
}
}