Laravel 辅助方法 array_wrap () 的妙用
31

file

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

1240

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


Practice makes perfect.

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

译文地址:https://laravel-china.org/topics/20554

本帖已被设为精华帖!
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

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

2周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!