Laravel 辅助方法 array_wrap () 的妙用
Laravel 有一个 wrap 方法和 array_wrap() 辅助函数将值规范化为数组。在之前,Raul @rcubitto 在 Twitter 分享了这条不错的建议 —— 一个我不知道的方法 他的推特 :
我注意到一些人在回复 Raul 的推特时问,为什么需要这样做,而不是对数组进行强制转换:
$value = (array) $value;
类型转换适用于基本值,但“可迭代的值”会得到不同的处理。举例来说,假如你允许用户传递 Eloquent 模型或者模型数组. 下面是将单个模型通过 (array)
方法转换成数组:
>>> $u = \App\User::create([
'name' => 'Admin',
'email' => 'admin@example.com',
'password' => bcrypt('secret')
]);
>>> (array) $u
=> [
"\0*\0fillable" => [
"name",
"email",
"password",
],
"\0*\0hidden" => [
"password",
"remember_token",
],
"\0*\0connection" => "mysql",
"\0*\0table" => "users",
"\0*\0primaryKey" => "id",
"\0*\0keyType" => "int",
"incrementing" => true,
"\0*\0with" => [],
"\0*\0withCount" => [],
"\0*\0perPage" => 15,
"exists" => true,
"wasRecentlyCreated" => true,
"\0*\0attributes" => [
"name" => "Admin",
"email" => "admin@example.com",
"password" => "$2y$10$LtI7hHc.eZQi9BcU61Qp3eTXliFrBq03Lav1QpLlDFvBNbsPYklYS",
"updated_at" => "2018-11-28 23:14:40",
"created_at" => "2018-11-28 23:14:40",
"id" => 1,
],
....
]
来看看 array_wrap()
如何处理相同的值:
>>> array_wrap($u)
=> [
App\User {#2897
name: "Admin",
email: "admin@example.com",
updated_at: "2018-11-28 23:14:40",
created_at: "2018-11-28 23:14:40",
id: 1,
},
]
辅助方法的注释中写道:「如果传入的值不是数组或者 null ,则用数组把它包裹起来。」 该方法看起来像这样:
/**
* 如果传入的值不是数组或者 null , 则用数组把它包裹起来.
*
* @param mixed $value
* @return array
*/
public static function wrap($value)
{
if (is_null($value)) {
return [];
}
return is_array($value) ? $value : [$value];
}
这个辅助方法是不是很有用?
如声明描述的, 当传入的值为 null
时,该辅助方法会返回一个空数组。 Laravel 框架中有多个位置需要传递数组或者单个值的参数。像这样规范化参数可以写出一个好的 API,而 Laravel 负责帮助我们实现这样的规范。
下面是在 ModelNotFoundException
类中用 Arr::wrap
设置模型的例子:
/**
* 设置受影响的 Eloquent 模型和 ids 实例
*
* @param string $model
* @param int|array $ids
* @return $this
*/
public function setModel($model, $ids = [])
{
$this->model = $model;
$this->ids = Arr::wrap($ids);
$this->message = "No query results for model [{$model}]";
if (count($this->ids) > 0) {
$this->message .= ' '.implode(', ', $this->ids);
} else {
$this->message .= '.';
}
return $this;
}
可以在 Arr (Illuminate\Support\Arr
) 类中找到 wrap
方法, 它还有一个 array_wrap
辅助函数,你可以在 Laravel 应用中找到。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
如果我们在项目中强制声明类型 那么我就可以知道变量到底是数组 字符串 还是对象 如果是对象直接toArray() 是字符串的话[$var] 数组则不变 我并不是在发布负能量 我是在劝大家要声明类型返回及其变量的类型
看了一遍,不太明白