ali1/cakephp-param-converter

CakePHP 路由参数转换器

安装: 18

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 1

类型:cakephp-plugin

1.0.2 2020-11-23 11:33 UTC

This package is auto-updated.

Last update: 2024-09-10 19:54:59 UTC


README

CakePHP v4.x 插件,用于将请求参数转换为对象。这些对象在派发控制器动作之前替换了原始参数,因此它们可以作为控制器方法参数注入。

深受 Symfony ParamConverter 启发。

由于使用中间件重写代码,测试目前需要更新。

安装

使用 Composer

composer require ali1/cakephp-param-converter

然后需要加载插件。您可以使用以下 shell 命令

bin/cake plugin load ParamConverter

用法

要使用,请在控制器方法中开始使用类型化参数。

实体和 FrozenDatetime 示例

<?php
// src/Controller/AppointmentsController.php

class AppointmentsController extends AppController {
    public function view(Appointment $appointment): void
        {
            // users will still navigate to yoursite.com/appointments/view/65
            // but the param converter removes the need for this line: $appointment = $this->Appointment->get($id);
            // use the ConfigurableEntityConverter (see below) to use a customised getter instead of Table->get
            $this->set('appointment', $appointment);
        }
    public function onDate(FrozenDate $date): void
    {
        // navigate to yoursite.com/appointments/onDate/2023-02-22
        // $date will be the FrozenDate object
        $appointments = $this->Appointments->find('all')
            ->where([
                'Appointments.start >=' => $date->toDateString(),
                'Appointments.start <' => $date->addDay(), 'cancelled IS NULL',
            ]);
        $this->set('appointments', $appointments);
    }
}

配置

默认情况下,插件提供并注册了可以用于将请求参数转换为实体和 DateTime 实例以及各种标量类型的转换器。可以通过调整以下配置来添加或删除转换器,配置在一个新的 config/param_converters.php 文件中

<?php
// config/param_converter.php
return [
    'ParamConverter' => [
        'converters' => [
            \ParamConverter\Converter\EntityConverter::class,
            \ParamConverter\Converter\FrozenDateTimeConverter::class,
            \ParamConverter\Converter\BooleanConverter::class,
            \ParamConverter\Converter\IntegerConverter::class,
            \ParamConverter\Converter\FloatConverter::class,
        ]
    ]
];

创建转换器

所有转换器都必须实现 ParamConverterInterface

以下是一个自定义转换器的示例。这个示例扩展了 EntityConverter,使其更加强大。

不仅使用 $Table->get($id) 方法从数据库获取实体,还允许使用表定义的 $paramConverterGetMethod 中的自定义方法。

<?php // src/ParamConverter/ConfigurableEntityConverter

namespace App\ParamConverter;

use Cake\Core\App;
use Cake\ORM\TableRegistry;
use Cake\Utility\Inflector;
use ParamConverter\Converter\EntityConverter;

/**
 * Class ConfigurableEntityParamConverter
 *
 * Alternative Param Converter for Entity classes that allows custom get methods
 */
class ConfigurableEntityParamConverter extends EntityConverter
{
    /**
     * @inheritDoc
     */
    public function convertTo(string $value, string $class)
    {
        preg_match('/^(.*)\\\Model\\\Entity\\\(.*)$/', $class, $matches);

        $tableClass = $matches[1] . '\Model\Table\\' . Inflector::pluralize(App::shortName($class, 'Model/Entity')) . 'Table';

        $table = App::shortName($class, 'Model/Entity');

        TableRegistry::getTableLocator()->set(Inflector::tableize($table), new $tableClass());
        $table = TableRegistry::getTableLocator()->get(
            Inflector::tableize($table)
        );

        $tableGetMethod = empty($table->paramConverterGetMethod) ? 'get' : $table->paramConverterGetMethod;

        return $table->$tableGetMethod($value);
    }
}

然后在 config/ 中创建此文件

<?php // config/param_converter.php

return [
    'ParamConverter' => [
        'converters' => [
            \App\ParamConverter\ConfigurableEntityConverter::class,
            // \ParamConverter\Converter\EntityConverter::class,
            \ParamConverter\Converter\FrozenDateTimeConverter::class,
            \ParamConverter\Converter\BooleanConverter::class,
            \ParamConverter\Converter\IntegerConverter::class,
            \ParamConverter\Converter\FloatConverter::class,
        ],
    ],
];

现在,其中一个表可以利用更实用的 getter

<?php

class AppointmentsTable extends Table {
    /**
     * @var string will be checked by Param Converter Entity Converter to see which Table method to use
     * i.e. getComprehensive($id)
     */
    public string $paramConverterGetMethod = 'getComprehensive';

    public function getComprehensive($id) {
        return $this->get(
            $id,
            ['contain' => ['Payments' => ['Users']]]
        );
    }
}

限制

  • 可能会破坏 URL 辅助程序和分页辅助程序

致谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。