文档/控制器/控制器

控制器

控制器是MVC架构的一部分(用于网页的Action-Domain-Responder),负责进一步管理已经由路由器识别的请求的处理,但不应包含业务逻辑。

HLEB2框架中,控制器是通过controller()方法绑定到路由的普通处理类。
该方法指向控制器类及其可执行的方法。 在匹配时,框架会创建该类的实例并调用该方法。

控制器类必须继承自Hleb\Base\Controller

框架根据控制器的namespace/app/Controllers/文件夹中查找控制器。 以下是默认控制器的代码:

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;
use 
Hleb\Constructor\Data\View;

class 
DefaultController extends Controller
{
    public function 
index(): View
    
{
        return 
view("default");
    }
}

在示例中,控制器的'index'方法返回一个由view()函数生成的View对象,并指向/resources/views/文件夹中的模板。
将使用模板/resources/views/default.php
这是一个简单的示例,因为可以以类似的方式在路由中使用此函数。


#view()函数

函数的第一个参数指定模板,第二个参数是用于传递变量及其值到模板的命名数组,第三个参数可以指定响应状态码的数值。

view('/template/file', ['title' => 'Main template''description' => 'Template description'], 205);

如果在控制器中使用此示例,将调用模板/resources/views/template/file.php
在文件中,将可用到变量$title$description及其对应的值:

<?php
// File /resources/views/template/file.php

/**
 * @var string $title
 * @var string $description
 */
echo $title// Main template
echo $description// Template description

如果模板文件的扩展名不是.php,例如.twig模板,则需要在函数中重命名模板路径,指定扩展名。


#返回值

除了之前提到的 View 对象,控制器方法还可以返回其他类型的值:

string|int|float - 这些类型将被转换为字符串并以其原始形式输出为文本。

array - 返回的数组将被转换为 JSON 字符串。

bool - 如果返回 false,则会显示标准的404错误。

具有 Hleb\Reference\ResponseInterface 接口的对象(来自容器)将被转换为响应。

具有 Psr\Http\Message\ResponseInterface 接口的对象将被转换为响应。

При ответе массивом как JSON на запрос GET может возникнуть XSSI перехват JSON, поэтому лучше отправить именованный массив, который преобразуется в объект как JSON.


#插入动态变量

框架可能与动态路由一起定义与 URL 的命名部分相匹配的值。 例如,对于以下路由:

use App\Controllers\DefaultController;

Route::get('/resource/{version}/{page?}/')
    ->
where(['version' => '[0-9]+''page' => '[a-z]+'])
    ->
controller(DefaultController::class, 'resource');

变量 $version$page 可以插入到控制器方法 'resource' 中。

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;

class 
DefaultController extends Controller
{
    public function 
resource(int $version, ?string $page null): void
    
{
        
// ... //
    
}
}

#使用另一个控制器

一个控制器可以返回另一个的数据显示,但返回的数据类型必须匹配。

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;

class 
DefaultController extends Controller
{
    public function 
index(): mixed
    
{
        return (new 
OtherController($this->config))->index();
    }
}

没有为控制器分配的事件将应用于这个嵌套的控制器。


#创建控制器

除了复制和修改演示文件 DefaultController.php 之外,使用控制台命令创建控制器也是一个简单的方法。

$php console --add controller ExampleController

该命令将在 /app/Controllers/ExampleController.php 创建新的控制器模板。
可以使用类的其他合适名称。
框架还允许为此命令创建 自定义默认模板

路由 模块

页面翻译:chatgpt 4-o
返回顶部