为您的 Eloquent 模型提供图像附件和管理!

2.0.12 2014-08-22 09:45 UTC

This package is not auto-updated.

Last update: 2024-09-28 14:49:40 UTC


README

您是否曾经希望简化在 Laravel 4 项目中管理上传图像的麻烦?您是否想要简化修改和缓存原始上传图像的过程?无需再寻找!Imager 是一个旨在简化图像存储、排序和处理的包。

快速查看功能 这里

  • 通过接口和可选特性将图像附加到任何 Eloquent 模型
  • 可配置和可定制的存储驱动程序
  • 根据使用的存储驱动程序生成图像的 URI
  • 图像处理链和缓存,在检索时完成,而不是在存储时完成
  • 一个强大且通用的画廊批量处理器

设置

要将 Imager 准备好用于您的项目,请按照设置 Laravel 4 包的常规步骤操作。

  • tippingcanoe/imager 添加到您的 composer.json 文件中。
  • 在项目根目录中运行 composer update
  • 编辑您的 app/config/app.php 文件并添加以下内容:
    • 'TippingCanoe\Imager\ServiceProvider',providers 数组中
    • 'Imager' => 'TippingCanoe\Imager\Facade',aliases 数组中
  • 运行迁移 ./artisan migrate --package="tippingcanoe/imager"
  • 创建项目级别的配置副本 ./artisan config:publish tippingcanoe/imager
Note: If you are using type-hinted dependency injection in your project, as a convenience Imager also binds the type `TippingCanoe\Imager\Service` in the container.

配置

存储

如果您打开在设置过程中创建的 config.php 文件的副本,您将看到它已经填充了针对最典型设置的配置选项。 TippingCanoe\Imager\Storage\Filesystem 驱动程序是最基本的,它只是将图像文件存储在您网站的公共目录中。

Amazon S3 驱动程序

将 'config.php' 文件中的文件系统驱动程序配置替换为以下 Amazon AWS 配置。

[
	'storage' =>
	[
		'TippingCanoe\Imager\Storage\S3' =>
		[
			'aws_key' => 'YOUR_KEY_HERE',
			'aws_secret' => 'YOUR_SECRET_HERE',
            'aws_bucket' => 'imager-bucket'
		]
	]
]

过滤器

Imager 的过滤链是一个强大的功能,允许您在检索图像时编排任意组合的修改。在处理链时,Imager 对链中的每个过滤器执行以下操作

  • 尝试实例化指示的类,该类必须实现 TippingCanoe\Imager\Processing\Filter
  • 如果过滤器的配置是一个数组,则第二个索引中的每个键都将作为子类的setter方法调用
  • 在子类上调用 process 方法,传入原始图像和图像的数据库条目

您可能希望为项目预先配置过滤链,这样在检索不同版本时就不必重复它们。Imager 使用简单的数组模式来定义过滤链。这里是一个示例

[

	'TippingCanoe\Imager\Processing\FixRotation',
	
	[
		'TippingCanoe\Imager\Processing\Resize',
		[
			'width' => 300,
			'height' => 300,
			'preserve_ratio' => true
		]
	],
	
	[
		'TippingCanoe\Imager\Processing\Watermark',
		[
			'source_path' => sprintf('%s/logo.png', __DIR__),
			'anchor' => 'bottom-right'
		]
	]

]
  • 数组不得使用键。
  • 一个字符串条目将被实例化并运行,不带参数。
  • 一个子数组条目将使用数组的第一个索引 [0] 实例化,第二个索引 [1] 转换为实例的setter
    • setWidth(300)
    • setHeight(300)
    • setPreserveRatio(true)
    • 等等...

如果您不确定应该在哪里存储过滤器配置文件,建议您将它们放在之前在发布Imager配置时为您创建的filters.php文件中。这将允许您根据环境更改过滤器配置,并使检索变得像Config::get('imager::filters.filter_name')一样简单。

使用方法

根据您的实现方式,您接收图像文件的方式可能会有所不同。Imager不对您的请求生命周期(或是否存在请求)做任何假设,它只关心接收Symfony\Component\HttpFoundation\File\File的实例。

Imager使用的两个可选的次要信息是Imageable,用于在检索时限定到特定的模型和过滤器链。

特质

如果您计划将图像附加到模型(用户、项目、画廊),则该模型必须实现接口TippingCanoe\Imager\Model\Imageable。这将强制您实现一个方法,您可以自己实现或通过使用特质TippingCanoe\Imager\Model\ImageableImpl来方便地与Imager保持同步。

保存

通过Imager服务保存图像,该服务可以通过外观或通过依赖注入访问。

	/** @var \Symfony\Component\HttpFoundation\File\File $file */
	/** @var \TippingCanoe\Imager\Model\Imageable $imageable */

	$attributes = [
		'slot' => 1
	];

	/** @var \TippingCanoe\Imager\Model\Image $image */
	$image = Imager::saveFromFile($file, $imageable, $attributes);

在成功保存后,Imager将返回一个TippingCanoe\Imager\Model\Image实例。如果您提供了,图像记录将与一个可识别的图像相关联。任何额外的属性也将通过保存传递。

检索

在检索单个图像时,您需要一种方式来识别它

  • 图像的id
  • 图像的可识别性和一个槽
  • 可识别的images()关系

通常您至少会有这三条信息之一,这将允许您获得图像物理文件的URI。

	Imager::getPublicUri($image, $filters);
	Imager::getPublicUriBySlot($slot, $imageable, $filters);
	Imager::getPublicUriById($id, $filters);

在从Imager检索图像时,记住“可识别”是可选的,省略它或提供null意味着“全局”。同样,“过滤器”也是可选的,省略此值、提供null或空数组意味着“原始图像”

Imager有一个称为槽的概念,其核心只是一个字符串值。槽用于根据可识别对图像进行排序和/或键控。在TippingCanoe\Imager\Model\Image类上有辅助作用域,以帮助根据槽值检索图像。

Note: When storing images without an imageable (globally), keep in mind that they are all sharing the same slot scope and cannot have duplicates.

槽的示例用例是“Item”类,它既可以有一个图像库,也可以有一个“主要”图像。属于库的图像将具有数值槽,以便它们可以保持特定的顺序,而主要图像在一个命名的槽中,可以直接查询。

批量操作

实现通常需要一种方法,可以在单次传递中对可识别图像进行多个更改。这些更改有时可能存在冲突并难以解决。

作为一个便利的工具,Imager在服务上提供批量方法,允许执行这些批量操作。操作根据可识别进行范围限定,并按安全顺序逐槽执行。

模式的结构对调用者透明,在不可避免的冲突情况下,将清除被替换的任何图像的槽。

以下是执行批量操作时使用的模式示例

	$operations = [
		1 => 2,
		3 => 'thumbnail',
		4 => null,
		5 => 'http://placehold.it/200x200&text=Imager'
	];

	/** @var \Symfony\Component\HttpFoundation\File\File[] $newFiles */
	/** @var \TippingCanoe\Imager\Model\Imageable $imageable */

	Imager::batch($operations, $newFiles, $imageable);

在这个例子中,以下操作将按顺序执行

  • 槽1和2中的图像交换
  • 槽3中的图像移动到'thumbnail'槽
  • 槽4中的图像将被删除
  • 将下载并插入到槽5的图像的URI

文件数组 $newFiles 将通过槽位进行索引,理论上可以包含槽位 4 的新图片。

当告知图片移动到新的槽位时,如果目标槽位已有图片,它们将被交换。如果上传的图片尝试进入一个已占用的槽位,槽位中的现有图片的槽位将被置空。

需要注意的是,在此架构中槽位键不能重复,因此您最好提交尽可能简单的批次列表。

驱动程序

随着时间的推移,将添加更多驱动程序,我们始终欢迎收到对新驱动程序的提议或包含您自己想法的 pull request。创建驱动程序就像实现 TippingCanoe\Imager\Storage\Driver 接口一样简单,该接口有完整的文档。您还可以使用 TippingCanoe\Imager\Storage\Filesystem 作为参考。

过滤器

在您自己的项目或包中创建自己的过滤器非常容易。您也可以使用您想要的任何图像处理库和/或算法。

唯一的规则是,过滤器子类必须在不移动、重命名或删除文件的情况下对其提供的文件进行操作 - 覆盖是可以的。《process》方法不期望返回值。

元数据

如果您遇到任何问题、找到错误或有任何疑问,请随时在问题跟踪器中提交工单。

鸣谢

Imager 由 Alexander TrauzziTipping Canoe 创建和维护。