Skip to content

Fluent

Fluent 是 Laravel 提供的一个实用工具类,可以让我们流畅地创建和操作数组/对象。

开箱即用,它可以转换为数组或 JSON,它可以充当数组,并且可以序列化为 JSON。

它还以流畅的方式动态获取和设置属性,最新的 Laravel 框架已经支持 fluent() 函数。

php
$data = [
    'user' => [
        'name' => 'curder',
        'age' => 32,
    ],
];

fluent($data)->get('user.name'); // curder

基本使用

在数组中的使用

php
use Illuminate\Support\Fluent;

$data = [
   'name' => 'curder',
];

# key 不存在时抛出错误
$data['email']; // Undefined array key "email"

$fluent = new Fluent($data);

# key 不存在时返回 null
$fluent['email']; // null

# 通过类属性形式获取值
$fluent->name; // curder

# 设置键值
$fluent['age'] = 32;
$fluent->email = 'curder@gmail.com';
/*
[ 
  "name" => "curder"
  "age" => 32
  "email" => "curder@gmail.com"
]
*/

在对象中的使用

php
use Illuminate\Support\Fluent;

$data = (object) [
  'name' => 'curder',
];

# 获取对象不存在的属性
$data['email']; // Error: Cannot use object of type stdClass as array

$fluent = new Fluent($data);

# 通过键获取对象的值
$fluent['name']; // curder

# 设置对象的值
$fluent->age = 32;
$fluent->toArray(); // ["name" => "curder", "age" => 32]

# 根据键删除对象属性
unset($fluent['age']);
$fluent->toArray(); // ["name" => "curder"]

一些方法

get()

通过调用 get() 方法获取对象的属性值。

php
use Illuminate\Support\Fluent;

$data = [
  'user' => [
    'name' => 'curder',
    'email' => 'curder@gmail.com',
  ],
  'posts' => [
    ['title' => 'post title 1'],
    ['title' => 'post title 2']
  ],
];

$fluent = new Fluent($data);

// 获取属性
$fluent->get('user'); // ["name" => "curder", "email" => "curder@gmail.com"]
$fluent->user; // ["name" => "curder", "email" => "curder@gmail.com"]

// 使用点语法获取属性
$fluent->get('user.name'); // curder
$fluent->get('posts.*.title'); // ["post title 1","post title 2"]

# 默认值
$fluent->get('user.age', 32); // 32

scope()

get() 方法的返回值不同的是,使用 scope() 方法返回对应的 Fluent 实例。

php
use Illuminate\Support\Fluent;

$data = [
  'user' => [
    'name' => 'curder',
    'age' => 32,
  ],
  'posts' => [
    ['title' => 'post title 1'],
    ['title' => 'post title 2'],
  ],
];

$fluent = new Fluent($data);

$fluent->scope('user')->toJson(); // {"name":"curder","age":32}

$fluent->scope('posts.*.title')->toJson(); // ["post title 1","post title 2"]

getAttributes()

使用 getAttributes() 方法以数组的形式返回当前 Fluent 实例的所有属性。

php
use Illuminate\Support\Fluent;

$data = [
  'name' => 'curder',
];

$fluent = new Fluent($data);

$fluent->getAttributes(); // ["name" => "curder"]

toArray()toJson()

使用 toArray() 方法将 Fluent 实例转换为数组。

使用 toJson() 方法将 Fluent 实例转换为 JSON 字符串。

php
use Illuminate\Support\Fluent;

$data = [
  'name' => 'curder',
];

$fluent = new Fluent($data);

$fluent->toArray(); // ["name" => "curder"]
$fluent->toJson(); // {"name":"curder"}

动态方法

Fluent 实例支持动态方法,可以动态的设置属性。

php
use Illuminate\Support\Fluent;

$fluent = new Fluent;

$fluent->name('curder')->age(32)->isAdmin(true);

// ["name" => "curder", "age" => 32, "isAdmin" => true]