Vamos transformar a interface em um projeto PHP organizado: entrada única em public/index.php, controllers, models, views e rotas básicas.
/games/create
GameController::create()
views/games/create.php
O usuário acessa /games ou /login.
public/index.php interpreta a rota.
Escolhe o Model e a View que devem participar.
Por enquanto retorna dados simulados.
Recebe variáveis e monta HTML.
O navegador recebe a página final.
| URL | Controller | Método |
|---|---|---|
| / | GameController | index() |
| /games | GameController | index() |
| /games/create | GameController | create() |
| /login | AuthController | login() |
| /users | UserController | index() |
<?php
// Caminhos principais do projeto
define('ROOT_PATH', dirname(__DIR__, 2));
define('APP_PATH', ROOT_PATH . '/app');
define('VIEW_PATH', APP_PATH . '/views');
// Ajuste conforme sua pasta no htdocs
define('BASE_URL', '/GameStock2026V2/public');
// Helper simples para carregar uma view
function view($path, $data = [])
{
extract($data);
$file = VIEW_PATH . '/' . $path . '.php';
if (!file_exists($file)) {
http_response_code(500);
echo 'View nao encontrada: ' . $path;
exit;
}
require $file;
}
Evitam repetir caminhos longos em vários arquivos.
Ajuda links e assets funcionarem no XAMPP.
Carrega uma tela e envia dados para ela.
<?php
require_once __DIR__ . '/../app/config/config.php';
require_once APP_PATH . '/models/BaseModel.php';
require_once APP_PATH . '/models/Game.php';
require_once APP_PATH . '/models/User.php';
require_once APP_PATH . '/controllers/GameController.php';
require_once APP_PATH . '/controllers/AuthController.php';
require_once APP_PATH . '/controllers/UserController.php';
$route = trim($_GET['url'] ?? '', '/');
switch ($route) {
case '':
case 'games':
(new GameController())->index();
break;
case 'games/create':
(new GameController())->create();
break;
case 'login':
(new AuthController())->login();
break;
case 'users':
(new UserController())->index();
break;
default:
http_response_code(404);
echo 'Pagina nao encontrada.';
}
<?php
class GameController
{
public function index()
{
$games = Game::all();
view('games/index', [
'titulo' => 'Loja de Games',
'games' => $games
]);
}
public function create()
{
view('games/create', [
'titulo' => 'Cadastrar Game'
]);
}
}
Lista games e manda os dados para a view.
Mostra o formulário de cadastro.
Controller organiza o fluxo. Dados ficam no Model.
<?php
class BaseModel
{
// Na Aula 4 esta classe recebera a conexao PDO.
protected static function fakeId()
{
return random_int(1, 999);
}
}
<?php
class Game extends BaseModel
{
public static function all()
{
return [
[
'titulo' => 'Pixel Quest',
'categoria' => 'Aventura',
'preco' => '59.90',
'estoque' => 12
],
[
'titulo' => 'Cyber Kart',
'categoria' => 'Corrida',
'preco' => '89.90',
'estoque' => 8
]
];
}
}
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title><?= htmlspecialchars($titulo) ?></title>
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/style.css">
</head>
<body>
<main class="container">
<h1><?= htmlspecialchars($titulo) ?></h1>
<section class="games-grid">
<?php foreach ($games as $game): ?>
<article class="game-card">
<h2><?= htmlspecialchars($game['titulo']) ?></h2>
<p><?= htmlspecialchars($game['categoria']) ?></p>
<strong>R$ <?= number_format($game['preco'], 2, ',', '.') ?></strong>
</article>
<?php endforeach; ?>
</section>
</main>
</body>
</html>
<?php
class AuthController
{
public function login()
{
view('auth/login', [
'titulo' => 'Entrar no painel'
]);
}
}
<?php
class UserController
{
public function index()
{
$users = User::all();
view('users/index', [
'titulo' => 'Usuarios',
'users' => $users
]);
}
}
default:
http_response_code(404);
view('errors/404', [
'titulo' => 'Pagina nao encontrada',
'route' => $route
]);
break;
| Teste no navegador | Esperado |
|---|---|
| ?url=games | Lista mockada |
| ?url=games/create | Formulário |
| ?url=login | Tela de login |
| ?url=users | Usuários mockados |
| ?url=abc | Erro 404 |