Laravel 辅助方法 array_wrap () 的妙用

file

Laravel 有一个 wrap 方法和 array_wrap() 辅助函数将值规范化为数组。在之前,Raul @rcubitto 在 Twitter 分享了这条不错的建议 —— 一个我不知道的方法 他的推特 :

Q0Gk57ihxo.png!large

我注意到一些人在回复 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 应用中找到。

原文地址:https://laravel-news.com/array_wrap

译文地址:https://learnku.com/laravel/t/20554

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

如果我们在项目中强制声明类型 那么我就可以知道变量到底是数组 字符串 还是对象 如果是对象直接toArray() 是字符串的话[$var] 数组则不变 我并不是在发布负能量 我是在劝大家要声明类型返回及其变量的类型

9个月前 评论
Saltwater

看了一遍,不太明白

9个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!