juliogomes26297 / julius
Julius 是一个用于创建具有 MVC 架构的 Web 应用的简单框架
Requires
- twig/twig: ^3.8
This package is auto-updated.
Last update: 2024-09-05 18:28:36 UTC
README
基本
第一步
在开始使用路由系统之前,必须调用 boot() 方法
use Julius\Framework\Http\Request; use Julius\Framework\Routing\Router; Router::boot(new Request); // Rotas ...
提示
你的路由应该放在 index.php 中
最简单的路由
这里有一个最简单的路由示例,没有复杂性
// Router::boot(...) Router::get('/bem-vindo', function(Request $request) { echo 'Olá mundo!'; });
重要
所有路由都必须以 /
开头
方法
Router
类提供了一些控制路由的方法
Router::get(); Router::post(); Router::put(); Router::patch(); Router::delete(); Router::options();
你也可以使用 add()
方法,它的第一个参数将是方法类型
Router::add('GET', ...); Router::add('POST', ...); // Outros ....
参数
我们喜欢在 uri
中传递参数,比如用户名或帖子 ID,为了做到这一点,非常简单
Router::get('/utilizador/:name', function(Request $request, string $name) { echo "Olá {$name}"; });
警告
注意!第一个参数始终是 Julius\Framework\Http\Request
类型,然后是自定义参数。
我们可以定义我们想要参数接受的类型,在上面的例子中,它默认接受任何类型的单词或数字,但现在我将创建一个只接受数字的参数
Router::get('/postagem/:id', function(Request $request, string $postagem_id) { echo "Esta postagem tem o ID: {$postagem_id}"; }, ['id' => ([0-9]+));
多参数
我们可以使用所需的任何数量的参数
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]+));
分组
为了代码更简洁、更易于阅读,最好将路由分组,不是吗?那么我们就这样做
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"; }); });
这里在 painel
组内有 3 个路由,要访问它们,只需访问 /painel
、/painel/functionarios
或 /painel/configuracoes
注意
如果在组内没有 landing page,它会变成找不到路由,在上面的例子中,有一个 uri 是 /
的路由,所以访问 /painel
时会调用这个路由。
提示
在 group()
函数的 uri
中,不需要在开始处使用 /
,就像路由一样必须使用 /
开头
带参数的分组
组也可以接收参数,让我们看看一个例子
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}"; }); });
只有当我进入 utilizador/id-do-utilizador
时才能访问上面的组,之后我可以访问 /utilizador/123
、/utilizador/456/postagens
或 /utilizador/780/fotos
提示
group()
方法无法控制 :id
参数的内容,只能在可以控制的路上控制 查看参数
控制上面例子中 :id
的示例
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); });
注意
这里通过 $regex
变量进行控制,它只接受数字
找不到路由
如果你的定义的路由找不到或用户输入了错误的 url
?那么就进入了 fallback()
方法,fallback
是一个只有在找不到任何路由时才会调用的方法。
// Router::boot() .... // Rotas ... Router::fallback(function(Request $request){ echo "Nenhuma das rotas foram encontras!"; });
警告
注意!这个函数必须在所有路由的最后。
高级
你是否注意到我们总是在添加路由时使用 callable
?想象一下,每个路由都有一个很大的脚本,代码看起来很难读,对吧?
Router::get('/postagens', function(Request $request) { // código ... });
那么,我们就不使用 callable
,而是使用一个 控制器。
MasterController
Julius Framework已经有一个可用的控制器,但不能直接在Router中使用,我们需要创建自己的控制器,并抽象出MasterController
,在其构造函数__construct
中已经包含了Request
参数。
警告
MasterController
的__construct()
方法不会接收uri
参数,它只接收Request
,接收参数的是在Router
中调用的控制器函数。
创建控制器
为了使代码更清晰易读,我们将创建一个名为Controllers
的文件夹,然后创建两个控制器,一个名为LandingController.php
,另一个名为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"; } }
现在我们来在Router
中进行调用。
// Router::boot(...) Router::get('/bem-vindo', [\MyApp\Controllers\LandingController::class, 'index']); // Outras rotas .... Router::fallback([\MyApp\Controllers\NotFoundController::class, 'index']);
重要
Router
可以接收一个包含类名(LandingController
或NotFoundController
)和方法名(index
)的array
,或者是一个我们一开始使用的callable
。
控制器中的参数
那么如何使用控制器来传递参数呢?
// 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']);
我创建的名为getUser
的方法将接收一个参数:id
。
重要
关于这个框架的文档将很快有更多更新;)