Laravel随笔 each和map的区别

两者都是对集合进行遍历处理

Map()

    /**
     * Run a map over each of the items.
     *
     * @param  callable  $callback
     * @return \Illuminate\Support\Collection|static
     */
    public function map(callable $callback)
    {
        $result = parent::map($callback);

        return $result->contains(function ($item) {
            return ! $item instanceof Model;
        }) ? $result->toBase() : $result;
    }

	// 其中 parent::map($callback);
    /**
     * Run a map over each of the items.
     *
     * @param  callable  $callback
     * @return static
     */
    public function map(callable $callback)
    {
        $keys = array_keys($this->items);

        $items = array_map($callback, $this->items, $keys);

        return new static(array_combine($keys, $items));
    }

	// Creates an array by using one array for keys and another for its values
	function array_combine(array $keys, array $values) { }

从中可以看出,map返回一个新的集合,其中的值为回调函数处理过后的数据

Each()

    /**
     * Execute a callback over each item.
     *
     * @param  callable  $callback
     * @return $this
     */
    public function each(callable $callback)
    {
        foreach ($this as $key => $item) {
            if ($callback($item, $key) === false) {
                break;
            }
        }

        return $this;
    }

而each返回的还是原集合,只是以遍历的形式对原集合进行回调函数中的处理,

由上可以看出,each()通常用在循环操作,map()用在集合数据格式转换

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Laravel的广播系统时,你可以通过私有频道来限制只有经过认证的用户才能订阅和接收广播事件。下面是私有频道认证的流程和详细机制: 1. 配置广播驱动:在Laravel的配置文件(`config/broadcasting.php`)中,设置你所选择的广播驱动,比如使用pusher、redis等。 2. 定义私有频道:在应用程序中,你需要定义私有频道。可以在`routes/channels.php`文件中使用`Broadcast::channel`方法来定义私有频道。例如: ```php Broadcast::channel('private-channel.{userId}', function ($user, $userId) { return $user->id === $userId; }); ``` 上述示例中,`private-channel.{userId}`是私有频道的名称,`{userId}`是一个变量,表示用户ID。在回调函数中,可以根据需要来定义用户对该频道的访问权限。 3. 认证私有频道:当客户端订阅私有频道时,需要进行频道的认证。认证过程通常通过Ajax请求来完成。 - 客户端订阅私有频道:客户端使用Laravel Echo库来订阅私有频道,例如: ```javascript Echo.private('private-channel.' + userId) .listen('PrivateEvent', (data) => { // 处理接收到的数据 }); ``` - 服务器端认证:客户端发送Ajax请求到服务器,请求进行私有频道的认证。请求中通常携带用户的认证信息,如token或cookie。 - 服务器端处理认证请求:在服务器端,你需要创建一个认证路由,处理私有频道的认证请求。可以使用Laravel提供的`Broadcast::auth`方法来定义认证路由。例如: ```php Broadcast::routes(['middleware' => ['auth:sanctum']]); ``` 上述示例中,使用了Laravel Sanctum中间件来进行身份验证。你也可以根据自己的需求选择其他适合的身份验证方式。 4. 认证逻辑:在认证路由处理方法中,你可以根据请求中携带的认证信息,对用户进行身份验证。验证成功后,返回一个认证通过的响应。例如: ```php Broadcast::channel('private-channel.{userId}', function ($user, $userId) { return $user->id === $userId; }); Broadcast::routes(['middleware' => ['auth:sanctum']]); Route::post('/broadcasting/auth', function (Illuminate\Http\Request $request) { $channelName = $request->input('channel_name'); $userId = $request->user()->id; if (! starts_with($channelName, 'private-channel.')) { return response()->json([], 403); } $channelNameSegments = explode('.', $channelName); $requestedUserId = end($channelNameSegments); if ($userId != $requestedUserId) { return response()->json([], 403); } $auth = $request->user()->createToken('Laravel Broadcasting')->plainTextToken; return response()->json(['auth' => $auth]); }); ``` 上述示例中,首先对请求的频道名称进行验证,确保只有私有频道才能进行认证。然后,根据频道名称中的用户ID和请求中的用户ID进行比较,以确保只有对应的用户才能认证通过。 认证通过后,可以生成一个用于广播系统认证的token,并返回给客户端。 5. 客户端认证:客户端接收到服务器返回的认证token后,使用Laravel Echo的`privateChannel`和`auth`方法进行频道认证。例如: ```javascript Echo.private('private-channel.' + userId) .auth(authToken) .listen('PrivateEvent', (data) => { // 处理接收到的数据 }); ``` 上述示例中,`authToken`是服务器返回的认证token。 通过以上流程和机制,私有频道的认证可以确保只有经过身份验证的用户才能订阅和接收广播事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值