Criando sistema com MVC
Bom dia. Vejam se conseguem me ajudar.
Estou criando um sistema MVC utilizando o mesmo esquema do Weslley da Code Education.
Esquema das pastas
/App
=> Controllers
- Home.php
=> Models
- Não há necessidade por enquanto, porque ainda não consigo interagir com essa camada
=> Views
-> Index
- home.phtml
- layout.phtml
=> Init.php
/public
- index.php
- .htaccess
/vendor
=> composer
=> SON
-> Controller
- Action.php
-> DB
- Table.php
-> DI
- Container.php
-> Init
- Bootstrap.php
=> autoload.php
Os arquivos
App\Controllers\Home
namespace App\Controllers;
use SON\Controller\Action;
use \SON\DI\Container;
class Home extends Action
{
// homepage
public function home()
{
$this->render('home');
}
}
App\Views\layout.phtml
<html>
<head>
<meta charset="utf-8">
<title>MVC</title>
<link rel="stylesheet" media="screen" href="../App/Views/css/style.css">
</head>
<body>
<section class="content">
<?= $this->content(); ?>
</section>
</body>
</html>
App\Views\Index\home.phtml
<h1>Página inicial da nossa aplicação</h1>
App\init
namespace App;
use SON\Init\Bootstrap;
class Init extends Bootstrap
{
protected function initRoutes()
{
/** Define the panel route */
$ar['home'] = ['route' => '/', 'controller' => 'home', 'action' => 'home'];
$this->setRoutes($ar);
}
public static function getDb()
{
$db = new \PDO("mysql:host=localhost;dbname=dbtest","root","");
return $db;
}
}
public\index
require_once '../vendor/autoload.php';
$init = new \App\Init;
vendor\SON\Controller\Action
namespace SON\Controller;
class Action
{
protected $view;
protected $action;
public function __construct() {
$this->view = new \stdClass;
}
public function render($action, $layout = true) {
$this->action = $action;
if($layout == true && file_exists("../App/Views/layout.phtml")):
include_once '../App/Views/layout.phtml';
else:
$this->content();
endif;
}
public function content() {
$atual = get_class($this);
$singleClassName = strtolower(str_replace("App\\Controllers\\", "", $atual));
include_once '../App/Views/' . $singleClassName . '/' . $this->action . '.phtml';
}
}
vendor\SON\DB\Table - Não é importante agora porque, como disse lá em cima, não faço a interação com a Model ainda
vendor\SON\DI\Container
namespace SON\DI;
class Container
{
public static function getClass($name)
{
$str_class = "\\App\\Models\\" . ucfirst($name);
$class = new $str_class(\App\Init::getDb());
return $class;
}
}
vendor\SON\Init\Bootstrap
namespace SON\Init;
abstract class Bootstrap
{
private $routes;
public function __construct()
{
$this->initRoutes();
$this->run($this->getUrl());
}
abstract protected function initRoutes();
protected function run($url)
{
array_walk($this->routes, function($route) use($url){
if($url == $route['route']){
$class = "App\\Controllers\\" . ucfirst($route['controller']);
$controller = new $class;
$controller->$route['action']();
}
});
}
protected function setRoutes(array $routes)
{
$this->routes = $routes;
}
protected function getUrl()
{
return parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH);
}
}
O autoload das classes é feito pelo composer e parece estar tudo certo.
Estou começando agora a trabalhar com MVC e o pior erro é o que não mostra nenhum resultado, não sei por onde seguir ou buscar a solução. Fiz diversas revisões e isso me ajudou até entender melhor o conceito e a estrutura do projeto. Setei a rota, criei a classe no controller da APP que faz o render do html, porém nada é impresso na tela.
Agradeço a quem puder dedicar um tempinho pra me ajudar a solucionar esse problema.
Discussão (15)
Carregando comentários...