ali1 / cakephp-param-converter
CakePHP 路由参数转换器
1.0.2
2020-11-23 11:33 UTC
Requires
- php: >=7.2
- cakephp/cakephp: ^4.0
Requires (Dev)
- cakephp/cakephp-codesniffer: ^3.0
- phpstan/phpstan: ^0.11
- phpstan/phpstan-webmozart-assert: ^0.11
- phpunit/phpunit: ^8.5
- thecodingmachine/phpstan-strict-rules: ^0.11.0
- timeweb/phpstan-enum: ^2.0
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)。请参阅 许可证文件 了解更多信息。