agandra/amp

增强Laravel功能并创建跨项目可重用的基础代码

dev-master 2014-10-14 20:47 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:51:18 UTC


README

这是一个插件,帮助我组织项目并阻止我在每个项目中重新构建相同的核心元素。此项目的目的是扩展一些核心Laravel功能,并生成脚本来快速启动项目。

Composer安装

"require": {
    "agandra/amp": "dev-master"
}

导入配置设置并运行迁移

php artisan config:publish agandra/amp

包含服务提供者

\Agandra\Amp\Providers\AmpServiceProvider

AMP哲学

此包主要用于大型包,其中标准Laravel结构不足以提供组织。项目将分为3个主要组件:模型、服务和存储库。每个组件都服务于独特的目的。

模型

这些是继承自 \Eloquent 的标准模型文件。每个模型的实例代表表中的一行。我们不在控制器中用这些模型文件来构建查询以获取结果。我们不在控制器文件中创建模型的实例,我们只应在服务和存储库中操作这些模型文件。

存储库

存储库用于从数据源收集数据。存储库可以用于组合多个模型并获得相关数据集。调用存储库来收集数据而不是仅使用 Model::get() 的想法是能够在不改变代码中的所有调用的情况下过滤数据集。

通常您通过调用查询方法:Repo->query($params) 从存储库中收集数据。在 params 中,您传递一个数组,其中包含要返回的数据集的属性。查询方法将返回一个数据库构建器实例。

存储库还有其他辅助方法,如 find 和 findOrFail。

例如,假设您正在开发一个项目模型,用户可以购买项目。在代码中,您有多个调用 $item->get() 来返回相关项目。现在假设您向项目表添加一个属性 'purchasable'。如果此字段设置为 true,则只有相关行才会返回。您不必在代码的每个地方都添加 $item->where('purchasable','=',true)->get(),您可以在查询方法中添加一行来更改每个存储库调用返回的内容。

这是一个非常基础的例子,实际应用会复杂得多。但有一个方法来收集数据集是非常方便的。

服务

服务是重复执行的操作以操作数据。服务可以包括向用户发送电子邮件、创建模型、编辑模型或删除等操作。通常服务与操作或数据操作相关。

AMP验证器

AMP验证器通过在模型中设置规则和 customMessages 数组来工作。然后我们通过 amp 验证器实例传递类和输入。AMP验证器的优点是可以使用多个上下文。规则不再是单维数组,现在是多维的,允许在不同情况下允许不同的规则集。

示例规则属性

$rules = [
			'create'=>
				['name'=>'required'],
			'edit'=>
				['price'=>'required','value'=>'numeric'],
			'other_context'=>
				['name'=>'required']
		];

验证器将仅使用创建时指定的上下文。例如

$validator = \Amp::validator($input, new User);
$validator->addContext('create');
if($validator->fails())
	throw new Exception;

您也可以向一个验证器添加多个上下文,它将合并规则集并对所有它们进行验证。

AMP模型

AMP模型具有自动保存功能,可轻松保存用户输入。它将自动使用 AMP 验证器并传递正确的上下文。

if($user->autoSave()) {
	// Passes the save
} else {
	// Save has failed
	throw new Exception($user->messages()); 
}

如果自动保存失败,则会有验证错误,您可以通过调用模型的 messages 方法来获取这些错误。

AMP模型还提供了在保存前后以及验证时调用的钩子。您还可以在模型上设置autoHash属性,它在保存到数据库之前会对值进行哈希处理。保存操作也在数据库事务中完成,因此如果发生错误或者保存前后的钩子生成了错误,整个数据库将保持不变。

要使用AMP模型,请确保您的模型文件扩展自\Agandra\Amp\Base\AmpModel

AMP回复

API

AMP

主要的AMP类仅是一个辅助类,用于访问AMP项目提供的不同属性。例如,要访问一个仓库,只需调用

\Amp::repo('RepoName')->query();

要获取验证器的实例,只需调用

\Amp::validator($input, $class);

当然,这些元素在没有调用AMP的情况下也是可用的,但通过这个类使用起来更方便。