Laravel 5.2 - 添加到现有会话数组会覆盖现有会话

时间:2016-02-15 23:00:08

标签: php arrays laravel session

我试图通过AJAX在Laravel 5的会话中存储篮子数据,但每次我尝试将一个项目推送到存储为数值的数组时,现有的'篮'数组被覆盖。

以下是我的控制器方法:

public function add(Request $request)
{
    $success = false;

    if ($request->ajax()) {
        $ticket = Ticket::find((int) $request->get('ticket_id'));

        if ($ticket) {
            if (!$request->session()->has('basket')) {
                $request->session()->put('basket', []);
            }   

            $item = [
                'attraction.name'   => $ticket->attraction->name,
                'ticket.quantity'   => $request->get('quantity'),
                'ticket.price'      => $ticket->price,
            ];

            $request->session()->push('basket', [$ticket->id => $item]);

            $success = true;
        }
    }

    return response()->json(['success' => $success]);
}

在第一个实例的篮子会话数组中设置了一个项目,但是当我将更多项目数据发布到此方法时,我希望它能够添加到此数组而不是覆盖。

我希望实现的最终结果是:

Array
(
    [basket] => Array
        (
            [123] => Array
                (
                    [attraction.name] => Attraction 1
                    [ticket.quantity] => 2
                    [ticket.price] => 14.5
                )

            [456] => Array
                (
                    [attraction.name] => Attraction 2
                    [ticket.quantity] => 3
                    [ticket.price] => 12
                )

        )

)

我尝试过使用Session facade等效方法,但无济于事:(

非常感谢任何帮助。谢谢:))

3 个答案:

答案 0 :(得分:0)

似乎每次使用push时,都会覆盖购物篮中的现有商品。在push之前,从会话变量获取已存在的所有内容,将其合并array_merge)与您要添加的内容然后存储在会话中。

这样你就不会失去已经在篮子里的东西。

答案 1 :(得分:0)

我曾尝试array_merge(),但我的会话再次被覆盖。所以,在再次调试我的调试帽后,我发现了它发生的原因。

每次请求后,会话数据都不会持久存在。由于我的会话没有被记住,!$request->session()->has('basket')总是在评估true因此我的篮子会话每次都被设置回一个空数组。

我需要使用以下行将我的请求作为JSON返回,以便我的会话数据保持不变。也许这是因为我在AJAX调用中将dataType: 'json'作为属性?

return response()->json($request);

我也接受了你的建议并抓住了篮子会话阵列,将新数据推送到它并重新进入会话。

排序!谢谢你的帮助:))

答案 2 :(得分:0)

我遇到了类似的问题,发现在为会话添加值后需要调用 session()->save();