juliogomes26297/julius

Julius 是一个用于创建具有 MVC 架构的 Web 应用的简单框架

1.0 2024-02-05 17:09 UTC

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可以接收一个包含类名LandingControllerNotFoundController)和方法名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

重要

关于这个框架的文档将很快有更多更新;)