juliogomes26297 / julius
Julius é um framework simples para criar aplicações Web com arquitetura MVC
Requires
- twig/twig: ^3.8
This package is auto-updated.
Last update: 2025-05-05 20:13:08 UTC
README
- Básico
- Avançado
Básico
Primeiro passos
Antes de começar usar o sistema de rotas deve iniciar a método boot()
use Julius\Framework\Http\Request; use Julius\Framework\Routing\Router; Router::boot(new Request); // Rotas ...
Tip
As tuas rotas deve estar no index.php
Rota mais simples
Aqui temos um exemplo de uma rota mais simples possível, sem complicações
// Router::boot(...) Router::get('/bem-vindo', function(Request $request) { echo 'Olá mundo!'; });
Important
Todas as rotas devem começar com /
Métodos
A class Router
disponibiliza alguns métodos para controle de rota:
Router::get(); Router::post(); Router::put(); Router::patch(); Router::delete(); Router::options();
Tambem pode usar o método add()
que o seu primeiro parâmetros será o tipo de método
Router::add('GET', ...); Router::add('POST', ...); // Outros ....
Parâmetros
Gostamos de passar parâmetros no uri
como o nome do utilizador ou id de uma postagem, para fazer-mos isso é bastante simples
Router::get('/utilizador/:name', function(Request $request, string $name) { echo "Olá {$name}"; });
Warning
Atenção! O primeiro parâmetro será sempre do tipo Julius\Framework\Http\Request
, em seguida é que vem os parâmetros customizados.
Podemos definir que tipos de dados queremos que o parâmetro aceite, no exemplo acima ele por defeito aceita qualquer tipo de palavra ou numeros, mas agora vou criar um parâmetro onde só quero que aceite numeros
Router::get('/postagem/:id', function(Request $request, string $postagem_id) { echo "Esta postagem tem o ID: {$postagem_id}"; }, ['id' => ([0-9]+));
Multi Parâmetros
Podemos usar numero de parâmetros que for necessario
Router::get('/utilizador/:name/postagem/:id', function(Request $request, string $name, string $id) { echo "O {$name} tem uma postagem com o ID: {$id}"; }, ['name' => '([a-zA-Z]+)', 'id' => ([0-9]+));
Grupos
Para um código mais limpo e facil de ler era bom agrupar as rotas, não é? Então vamos fazer isso
Router::group('/painel', function() { // Rota: /painel Router::get('/', function(Request $request) { echo "Aqui é o landing page ao acessar /painel"; }); // Rota: /painel/funcionarios Router::get('/funcionarios', function(Request $request) { echo "Estamos na página dos funcionarios"; }); // Rota: /painel/configuracoes Router::get('/configuracoes', function(Request $request) { echo "Estamos na página das configurações"; }); });
Aqui temos 3 rotas dentro do grupo painel
, para acessar basta aceder /painel
, /painel/functionarios
ou /painel/configuracoes
Note
Se dentro do grupo não tiver nenhuma landing page ele vai dar como rota não encontrada, no exemplo acima temos uma rota que uri é /
, portante ao aceder /painel
ele chama essa rota.
Tip
No uri
da função group()
não é obrigatorio usar o /
logo ao inicio, como nas rotas são obrigadas usar o /
logo de inicio
Grupos com Parâmetros
O grupo tambem pode receber parâmetros, vamos ver um exemplo
Router::group('utilizador/:id', function() { // Rota: /utilizador/123 <- qualquer coisa Router::get('/', function(Request $request, string $user_id) { echo "Aqui é o landing page do utilizador/{$user_id}"; }); // Rota: /utilizador/456/postagens Router::get('/postagens', function(Request $request, string $user_id) { echo "Estamos na página de postagens do utilizador {$user_id}"; }); // Rota: /utilizador/780/fotos Router::get('/fotos', function(Request $request, string $user_id) { echo "Estamos na página de fotos do utilizador {$user_id}"; }); });
Só consigo aceder ao grupo a cima se eu entrar em utilizador/id-do-utilizador
depois disso posso aceder /utilizador/123
, /utilizador/456/postagens
ou /utilizador/780/fotos
Tip
O método group()
não consegue controlar o que entra no parâmetro :id
, só nas rotas que podem controlar Ver Parâmetros
Exemplo controlar :id
do exemplo em cima
Router::group('utilizador/:id', function() { $regex = ['id' => '([0-9]+)']; // Rota: /utilizador/123 <- qualquer coisa Router::get('/', function(Request $request, string $user_id) { echo "Aqui é o landing page do utilizador/{$user_id}"; }, $regex); // Rota: /utilizador/456/postagens Router::get('/postagens', function(Request $request, string $user_id) { echo "Estamos na página de postagens do utilizador {$user_id}"; }, $regex); // Rota: /utilizador/780/fotos Router::get('/fotos', [\MyApp\Controllers\UserPhotosController::class, 'index'], $regex); });
Note
Aqui está a ser controlado pela variavel $regex
que neste caso só aceita numeros
Rota não encontrada
E se as tuas rotas que definiste não forem encontras ou o utilizador digitar mal a url
? Ai é que entra o método fallback()
, o fallback
é um método que só é chamado caso nenhuma rota for encontrada.
// Router::boot() .... // Rotas ... Router::fallback(function(Request $request){ echo "Nenhuma das rotas foram encontras!"; });
Warning
Atenção! Este função deve estar no fim de todas as rotas.
Avançado
Já reparaste que a gente usa sempre um callable
quando adicionamos uma rota? Imagina que cada rota tem um script muito grande, o código não ficava bom para ler, certo?
Router::get('/postagens', function(Request $request) { // código ... });
Então em vez de usar callable
, vamos usar o um Controlador.
MasterController
O Julius Framework
já tem um controlador para ser utlizado, mas ele não pode ser utlizado diretamente no Router, nós devemos criar os proprios controladores e fazer abstração do MasterController, no __construct
dele já contém o parâmetro Request
.
Warning
O __construct()
do MasterController
não vai receber os parâmetros da uri
, simplesmente recebe só Request
, quem vai receber os parâmetros, são as funções dos controlador que seram chamados no Router
Criar Controlador
Para termos um código mais limpo e legivel, vamos criar uma pasta chamada Controllers
, em seguida vamos criar 2 controlados um que se vai se chamar LandingController.php
e outro NotFoundController.php
.
// LandingController.php namespace MyApp\Controllers; use Julius\Framework\Controllers\MasterController; class LandingController extends MasterController { public function index() : void { // Podes usar o Request, basta aceder '$this->request' echo "Olá mundo!"; } }
// NotFoundController.php namespace MyApp\Controllers; use Julius\Framework\Controllers\MasterController; class NotFoundController extends MasterController { public function index() : void { echo "Página não encontrada"; } }
Agora vamos fazer a chamada no Router
.
// Router::boot(...) Router::get('/bem-vindo', [\MyApp\Controllers\LandingController::class, 'index']); // Outras rotas .... Router::fallback([\MyApp\Controllers\NotFoundController::class, 'index']);
Important
O Router
pode receber tanto um array
onde contém o nome da class (LandingController
ou NotFoundController
) e o nome do método (index
) ou um callable
como temos usado ao inicio.
Parâmetros no controlador
Agora como posso usar os parâmetros utilizando controladores?
// UserController.php namespace MyApp\Controllers; use Julius\Framework\Controllers\MasterController; class UserController extends MasterController { public function getUser(string $utilizador_id) : void { echo "Utilizador com ID: {$utilizador_id}"; } }
// index.php Router::get('/utilizador/:id', [\MyApp\Controller\UserController::class, 'getUser']);
No método que criei com o nome getUser
vai receber um parâmetro :id
Important
Brevemente vai haver mais atualizações na documentação sobre este framework ;)