jildertmiedema / fill
填充对象/DTO等的辅助工具
v0.2.0
2016-10-26 20:27 UTC
Requires
- php: ^7.0.0
Requires (Dev)
- phpunit/php-code-coverage: ^4.0
- phpunit/phpunit: ^5.6
This package is auto-updated.
Last update: 2024-09-11 20:57:26 UTC
README
一个用于填充对象的简单工具。
用法
提供了一个辅助函数:mapTo()
将返回一个可调用的函数,可以在映射中使用。
$result = array_map(mapTo(Target::class), $data);
示例
use function JildertMiedema\Fill\mapTo; class Demo { private $name; public function __construct($name) { $this->name = $name; } public function name() { return $this->name; } } $data = [ ['name' => 'test name 1'], ['name' => 'test name 1'], ]; $result = array_map(mapTo(Demo::class), $data); var_dump($result);
输出
array(2) { [0] => class Demo#7 (1) { private $name => string(11) "test name 1" } [1] => class Demo#6 (1) { private $name => string(11) "test name 1" } }
自定义
您可以自定义行为。例如,在Laravel中,您可以使用CallbackNormalizer
将snake_cased_fields转换为camelCase。
本示例展示了如何实现自己的mapTo()
函数
use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; use JildertMiedema\Fill\Build\ReflectionBuilder; use JildertMiedema\Fill\Fill; use JildertMiedema\Fill\Normalizer\CallbackNormalizer; use JildertMiedema\Fill\Normalizer\SimpleNormalizer; function mapTo($targetClass): \Closure { $normalizer = new CallbackNormalizer(new SimpleNormalizer()); $normalizer->register(Model::class, function (Model $model) { $data = $model->toArray(); $keys = array_map(function ($key) { return Str::camel($key); }, array_keys($data)); $data = array_combine($keys, array_values($data)); return $data; }); $fill = new Fill(new ReflectionBuilder($targetClass), $normalizer); return $fill->map(); } class DemoModel extends Model { protected $guarded = []; } class Target { private $name; private $otherValue; public function __construct($name, $otherValue) { $this->name = $name; $this->otherValue = $otherValue; } public function name() { return $this->name; } } $data = [ new DemoModel(['name' => 'test', 'other_value' => 'value']), ]; $result = array_map(mapTo(Target::class), $data); var_dump($result);