summerstreet / woodling
为您的模型提供便捷的固定装置
Requires
- php: >=5.3.0
Requires (Dev)
- apigen/apigen: 2.8.*
- mikey179/vfsstream: v1.1.0
- phpunit/phpunit: 3.7.*
README
为您的模型提供易于使用的固定装置。无需您进行任何配置,利用 您的代码 完成所有工作。
安装和初始化
您可以通过 Composer 安装 Woodling。将以下内容放入您的 composer.json
文件中,并运行 $ composer update --dev
"require-dev": { "summerstreet/woodling": "0.1.*" }
您无需做任何事情。当您首次使用 Woodling 时,它会自动为您加载。
定义蓝图
蓝图用于构建您指定的模型的实例。Woodling 会根据您为蓝图提供的名称猜测您想使用的模型类。
以下代码将返回一个 User 类的实例,其中 name
属性设置为 "John Doe",hobbies
属性设置为 "单元测试"。
Woodling::seed('User', function($blueprint) { $blueprint->name = 'John Doe'; $blueprint->hobbies = 'Unit Testing'; });
您也可以通过传递一个参数数组来指定不同的类名。这将创建一个名为 "Admin" 的蓝图,并在创建对象时使用 "User" 类。
Woodling::seed('Admin', array('class' => 'User', 'do' => function($blueprint) { $blueprint->name = 'John Doe'; $blueprint->admin = 1; }));
顺便说一下,由于 Woodling 利用 您的 代码,您可以充分利用您所有类在底层所做的一切。例如,如果您使用 Laravel 的 Eloquent,并且您的模型定义了 setPassword()
变换器,则在设置密码时将调用此方法。
自动加载蓝图
Woodling 将自动加载以下位置定义的蓝图
- application/tests/blueprints/*.php
- application/tests/blueprints.php
- app/tests/blueprints/*.php
- app/tests/blueprints.php
- tests/blueprints/*.php
- tests/blueprints.php
您还可以添加额外的搜索路径。在您的引导文件中添加以下行
use Woodling/Woodling; // Single path Woodling::core()->finder->addPaths('src/Acme/DemoBundle/Tests/blueprints'); // Several paths Woodling::core()->finder->addPaths(array( '/absolute/path/to/blueprints', 'relative/path/to/blueprints' )); // Search in new paths Woodling::core()->finder->findBlueprints();
当添加路径时,请注意,路径的最后一部分将同时用作文件名和目录名
// Looks in these destinations: // - tests/blueprints/*.php // - tests/blueprints.php Woodling::core()->finder->addPaths('tests/blueprints');
检索蓝图
要检索您模型的实例,您可以使用以下方法
$user = Woodling::retrieve('User'); $user = Woodling::saved('User');
retrieve()
方法将返回您的类的实例。saved()
方法将在返回之前创建您的类的实例并调用其 save()
方法。
如果您的类使用不同的持久化方法名称,您可以更改如下
Woodling::core()->persistMethod = 'mySaveMethod';
这将调用 mySaveMethod()
,当您检索您类的已保存实例时。
使用属性覆盖检索蓝图
有时您需要检索具有与您在蓝图中所指定略微不同的属性值的模型。您可以通过传递一个包含 key => value
对的数组来实现,其中 key
是您想要覆盖的属性的名称。
$user = Woodling::retrieve('User', array( 'hobbies' => 'Skateboarding, cooking', 'occupation' => 'Developer' ));
检索列表
您也可以检索多个实例的数组,而不是单个结果。Woodling 为您提供了两种构建策略:retrieveList()
和 savedList()
。以下是它们的使用方法(属性覆盖是可选的)
$usersArray = Woodling::retrieveList('User', 50); $savedUsers = Woodling::savedList('User', 50, array('name' => 'Test User'));
延迟属性
如果您想在实例化时计算属性值,可以使用 延迟属性。只需将闭包分配给您的属性。闭包返回的值将用于在您的模型上设置此属性。
Woodling::seed('User', function($blueprint) { $blueprint->created = function() { return time(); }; });
序列
在您的模型或数据库中,通常会有一些需要使用唯一值的验证规则。如果遇到这种情况,您可以使用序列。序列接收一个闭包,该闭包会接收到一个计数器值。然后您可以使用这个计数器为您的模型构建一个唯一值。
每次您检索一个对象时,它的计数器都会增加。以下代码将为您的模型设置一个email
属性。第一次检索此对象时,它会接收到计数器值1
,第二次检索时计数器将是2
,依此类推。
Woodling::seed('User', function($blueprint) { $blueprint->sequence('email', function($i) { return "user{$i}@hostname.com"; }); });
虚假关联
您可以通过从延迟属性中返回模型关联来创建模型关联。以下是您从Woodling检索一对一关系的实例的方式。
Woodling::seed('Weakness', function($weakness) { $weakness->type = 'Fruit'; $weakness->name = 'Apple'; }); Woodling::seed('Person', function($person) { $person->name = 'Eve'; $person->weakness = function() { return Woodling::retrieve('Weakness'); }; }); $eve = Woodling::retrieve('Person');
以下是您如何进行一对一关联。
Woodling::seed('Atom', function($atom) { $atom->element = 'H'; }); Woodling::seed('Molecule', function($molecule) { $molecule->name = 'Water'; $molecule->atoms = function() { $h2 = Woodling::retrieve('Atom', array('element' => 'H2')); $o = Woodling::retrieve('Atom', array('element' => 'O')); return array($h2, $o); }; }); $H2O = Woodling::retrieve('Molecule');
使用高级覆盖获取蓝图
您可以通过传递它们作为返回某种内容的常规回调函数来覆盖延迟属性。要覆盖序列,您可以将它们放在:sequences
数组中。
$user = Woodling::retrieve('User', array( 'occupation' => 'Developer', 'created' => function() { return time(); }, ':sequences' => array( 'email' => function($i) { return "name{$i}@hostname.com"; } ) ));
更多精彩用法
以下是一个示例,展示了如何使用序列和延迟属性来创建更真实的模型实例。
Woodling::seed('User', function($blueprint) { $blueprint->name = 'John'; $blueprint->surname = 'Doe'; $blueprint->birthday = '1969.07.13'; $blueprint->sequence('email', function($i) use($blueprint) { $email = "{$blueprint->name}{$i}@hostname.com"; return strtolower($email); }); $blueprint->created = function() use($blueprint) { $date = date('Y.m.d', strtotime("{$blueprint->birthday} + 20 years")); return $date; }; });
免费小贴士
别忘了在文件顶部放置use Woodling\Woodling;
。这将让您可以使用简短的类语法,而不是需要在前面添加命名空间。
许可协议
有关许可信息,请查看LICENSE文件。