passchn / cakephp-assets
CakePHP 的资产管理插件
Requires
- php: >=8.1
- ext-fileinfo: *
- cakephp/cakephp: ^5.0.0
- intervention/image: ^2.7.2
- josegonzalez/cakephp-upload: ^8.0
- league/csv: ^9.8
- nette/utils: ^3.2 || ^4.0.0
Requires (Dev)
- cakedc/cakephp-phpstan: ^3.0
- cakephp/cakephp-codesniffer: ^5.1
- phpunit/phpunit: ^10.1
This package is auto-updated.
Last update: 2024-09-16 15:18:16 UTC
README
插件的功能
此插件帮助您管理后端资产,这些资产可以是任何文件类型。资产保存在非公开文件夹中,并由 AssetsTable 处理。
您可以使用具有有用方法的 AssetEntities
通用方法
- 检查上传的文件是否仍然存在:
$asset->exists() // true 或 false $asset->getFileSizeInfo()打印一个可读的文件大小。- 获取 AssetsController::download() 的链接(带有 Admin 前缀):
$asset->getDownloadLink()
图像渲染
- 调用
echo $asset->getImage()->scaleWidth(350)->toWebP()->addCSS('my-class')以将 WebP 缩略图作为 HTML 渲染。 - 渲染的图像将保存在
webroot/img/modified中,具体取决于修改和传递的选项。 - 通过
ImageAsset::applyFilter()传递您的自定义 InterventionImage 过滤器 - 您可以通过
ImageAsset::modify()调用任何 InterventionImage API 方法
CSV 预览
- 您可以使用
TextAssetPreviewHelper来渲染 CSV 文件的表格。 - 遍历 csv-Asset 中的行:
foreach ($asset->getReader()->getRecords() as $row) ...
任何模型的旁证属性
$asset可以是$user->image,$company->logo或您最新的 CSV 导入。只需在您的模型上配置一个belongsTo关系并设置 ClassName 即可。
安装
您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。
安装 composer 包的推荐方法是
composer require passchn/cakephp-assets
加载插件
bin/cake plugin load Assets
运行迁移以创建插件表
bin/cake migrations migrate -p Assets
现在您应该在数据库中有一个 assets_assets 和一个 assets_phinxlog 表。
CakePHP 版本映射
此插件还没有版本 1。要在项目中使用它,请检查版本映射
上传文件
AssetsController
您可以直接使用 AssetsController 上传文件。默认情况下,您可以通过 Admin 前缀访问索引、查看和编辑方法: your-app.test/admin/assets/assets
使用旁证名称
您可以使用 Assets 表从任何模型上传文件,例如,您有一个 users 表并需要一个用户图像
- 在
users表中创建一个userimage_id字段,作为可空的char(36)(UUID)。 - 运行迁移:
bin/cake bake users - 现在您需要告诉 CakePHP,您的
Userimage不是一个真正的实体,而是来自Assets.AssetsTable表
in \App\Model\Table\Users:
$this->belongsTo('Userimages')
->setForeignKey('userimage_id')
->setClassName('Assets.Assets');
这不再有效。从版本
2.8开始的cakephp-bake插件似乎检测到您实际上没有userimages表,并且不会假设一个belongsTo关系。您必须自己编写代码或降级到版本2.7。
现在您可以在 templates/Users/edit.php 中放置一个用于 Userimage 的上传字段
<?= $this->Form->create($user, ['type' => 'file']) ?>
...
...
<?= $this->Form->control('userimage.filename', [
'type' => 'file',
'label' => 'Upload a profile photo',
]) ?>
...
<?= $this->Form->end() ?>
为了使此操作正常工作,关系应该设置正确,例如通过 bin/cake bake users,这样 CakePHP 就知道您的 $user->userimage 是一个 Asset 实体。请注意,您必须在控制器或表的查找方法中包含 Userimages
$users = $this->Users->find()->contain([
'Userimages',
'Addresses,
'...
]);
$image = $users->first()->userimage?->getImage();
AssetsTable不知道上传的文件属于哪个模型。您可以使用title、description或category字段来跟踪。
为此,您可以将自定义行为注入到AssetsTable中,以挂钩事件处理器(例如,在beforeSave()上设置title),或者创建自定义查找方法,例如通过您定义的分类。
在您的配置文件app.php、app_local.php或app_assets.php中,您可以覆盖默认设置并添加自定义行为。
文件操作
图片
如果资产是图片(MIME类型以image/*开头),您可以调用
$asset->getImage();
这返回一个Assets\Utilities\ImageAsset类的实例,它提供了对ImagineImage的包装API。
例如,您可以调用
echo $asset->getImage()->scaleWidth(350)->toWebP()->getPath()
这将生成原始文件的缩放版本,转换为WebP,并返回文件相对于/webroot的路径。
您可能希望直接输出HTML
<?= $asset->getImage()->scaleWidth(520)->toJpg()->setCSS('my-class') ?>
这将调用ImageAsset::__toString()方法,并将返回包含您设置的class、具有资产标题的alt参数以及正确的width和height参数的HTML。
图像操作通过Intervention使用GD作为默认,但您可以通过app.php配置启用imagick。
<picture>元素的渲染
在AppView.php中加载PictureHelper
$this->loadHelper('Assets.Picture');
在模板中,将ImageAsset以及包含宽度和参数的数组传递给Helper
<?= $this->Picture->webp(
$user->photo->modify('resize', 350, 600),
[150, 350],
[
'class' => 'user-img',
'width' => 350,
'height' => 600,
'sizes' => "(min-width: 230px) 100vw, (min-width: 640px) 50vw"
]
) ?>
反馈、错误报告和功能请求
从一开始,这个插件就不是插件,我们现在正在努力使它在不同的CakePHP安装中可用。
由于这个包作为插件处于早期开发阶段,我们目前不期望它适用于许多用例。
如果您对该插件有任何疑问或问题,请在GitHub上创建一个Issue。
您也可以通过以下电子邮件联系我:post@pascalschneider.eu
此插件使用的包
除了CakePHP之外,该插件还依赖于以下包
"josegonzalez/cakephp-upload": "^6.0",
"league/csv": "^9.8",
"nette/utils": "^3.2 || ^4.0",
"intervention/image": "^2.7"