jimmy4fingers / simple-data-mapper
此包的最新版本(0.0.3)没有提供许可证信息。
数据映射类
0.0.3
2018-07-25 10:51 UTC
Requires
- php: >=7
Requires (Dev)
- phpspec/phpspec: ^4.3
README
对象集合,旨在减少在需要将数据数组与另一个源(数据库字段等)重新映射时的代码重复。
例如
<?php // form data $postData = [ 'my-form-field-name' => 'jim', 'my-form-field-email' => 'jim@email.com', 'my-form-field-age' => 36 ]; // data to insert $entityData = [ 'name' => $postData['my-form-field-name'], 'email_address' => $postData['my-form-field-email'], 'users_age' => $postData['my-form-field-age'] ];
如果您还想添加验证或附加逻辑,那么您可能会再次引用键值对,依此类推...
或者,我们可以添加一个映射对象。
例如
<?php use DataMapper\Map; use DataMapper\MapCollection; use DataMapper\Mapper; $map = new Map(); $collection = new MapCollection(); $mapper = new Mapper(); // post data example $data = [ 'my-form-field-name' => 'jim' ]; // create a collection of mappings $collection->add( // [application reference], [lookup key] $map->set('my-form-field-name', 'name') ); // pass data into the mapper along with the collection $mapper->set($collection, $data); $name = $mapper->get('my-form-field-name')->getData(); // $name = 'jim';
虽然上面的内容看起来很 trivial,但让我们尝试反转这个过程。我们希望加载数据并将其分配给我们的应用程序键('my-form-field-name')。
<?php use DataMapper\Map; use DataMapper\MapCollection; use DataMapper\Mapper; $map = new Map(); $collection = new MapCollection(); $mapper = new Mapper(); // loaded data example $data = ['name' => 'jimmy']; // create a collection of mappings $collection->add($map->set('my-form-field-name', 'name')); // the last parameter tells the mapper to map data using the lookup key $mapper->set($collection, $data, true); $name = $mapper->get('my-form-field-name')->getData(); // $name = 'jimmy';
附加功能
您可以将匿名函数传递给通过 Mapper::set 加载数据时触发的函数。匿名函数必须接受数据参数并返回它。
- setOnMap() - 当通过键映射数据时触发
- setOnMapByLookup() - 当通过查找键设置数据时触发
例如
<?php use DataMapper\Map; use DataMapper\MapCollection; use DataMapper\Mapper; $map = new Map(); $collection = new MapCollection(); $mapper = new Mapper(); $ucwordsCallback = function ($data) { return ucwords($data); }; $maps = [ $map->set('first-name','first_names')->setOnMap($ucwordsCallback), $map->set('last-name','last_name')->setOnMap($ucwordsCallback), $map->set('email','email_address'), $map->set('address_line1','line_1'), $map->set('address_line1','line_2'), $map->set('address_line1','line_3') ]; foreach($maps as $map) { $collection->add($map); } // posted data example $postData = [ 'first-name' => 'jimmy jams', 'last-name' => 'higgins', ]; $mapper->set($collection, $postData); $myData = $mapper->getArray(); // $myData = ['first-name' => 'Jimmy Jams' etc...];
- setDataFrom()
如果您正在映射的数据数组包含您想要在 Map 上设置但未通过映射键或查找键引用的数据,您可以使用 Map::setDataFrom($key)。
例如
<?php // data your mapping $post = [ 'jsonData' => ['city1', 'city2', 'city3'] ]; $map = new Map(); $collection = new MapCollection(); $mapper = new Mapper(); $cb1 = function ($data) { $data = json_decode($data,true); if (is_array($data) && array_key_exists(0,$data)) $data = $data[0]; return $data; }; $cb2 = function ($data) { $data = json_decode($data,true); if (is_array($data) && array_key_exists(1,$data)) $data = $data[1]; return $data; }; $maps = [ $map->set('city1','city_1')->setDataFrom('jsonData')->setOnMap($cb1), $map->set('city2','city_2')->setDataFrom('jsonData')->setOnMap($cb2) ]; foreach($maps as $map) { $collection->add($map); } $mapper->set($collection, $post); $myData = $mapper->getArray(); // $myData = ['city1' => 'city1', 'city2' => 'city2']
扩展
Map 对象可以设置一些额外的值,您可以使用这些值来扩展 Mapper::class 的功能。
- setValidation()
- setFormObject()
例如
<?php use DataMapper\Map; use DataMapper\MapCollection; use DataMapper\Mapper; $map = new Map(); $collection = new MapCollection(); $mapper = new Mapper(); $maps = [ $map->set('first-name','first_names')->setValidation('required'), $map->set('last-name','last_name')->setValidation('required'), $map->set('email','email_address')->setValidation('required|email'), ]; foreach($maps as $map) { $collection->add($map); } $mapper->set($collection, ['first-name'=>'bob', 'last-name'=>'']); $validation = new ValidationObject(); $validation->validateMapped($mapper->get()); // Mapper::get returns MapInterface[] if ($validation->isValid()) { //... }