3

when I am trying to create a new order this errors appears:

"error": "array_merge(): Expected parameter 1 to be an array, null given"

and here the whole function that I am trying to create a new order with it, I tried it like for 20 times and it worked fine, but after a time it stopped working with the above error

public function placeOrder()
    {
        $user_id = auth()->id();

        try {
            $cart = Cart::where('client_id', '=', $user_id)->first();

            $cartDetails = CartDetail::where('cart_id', '=', $cart->id)->get();
        }catch (Exception $e){
            return response()->json(["error" =>$e->getMessage()]);
        }

        try {
            foreach ($cartDetails as $cartDetail){
                $item = StoreItem::where('item_id', '=', $cartDetail->item_id)->first();
                $this->items_total += $cartDetail->quantity;
                $discountedPrice =  ($item->unit_price * $item->discount) / 100;
                $this->total_amount += $cartDetail->quantity * $discountedPrice;
            }
        }catch (Exception $e){
            return response()->json(["error" =>$e->getMessage()]);
        }

        if(count($cartDetails->toArray()) == 0){
            return response()->json(["warning" => "Please Add Cart Items"]);
        }

        $storeId = $cartDetails[0]->store_id;
        try {
            $store = Store::findOrFail($storeId);

            $address = Address::where('user_id', '=', $user_id)->where('is_default', '=', true)->first();
        }catch (Exception $e){
            return response()->json(["error" => $e->getMessage()]);
        }

        $delivery_charge = 2;

        $final_total = $this->total_amount + $delivery_charge;

        $address_id = $address->id;

        try {

            $data = [
                'items_total' => $this->items_total,
                'total_amount' => $this->total_amount,
                'is_paid' => false,
                'delivery_charge' => $delivery_charge,
                'shopper_earning' => $delivery_charge / 1.5,
                'final_total' => $final_total,
                'client_id' => $user_id,
                'store_id' => $store->id,
                'address_id' => $address_id,
                'currency_id' => $store->currency_id
            ];

            $createdOrder = Order::create($data);


            if ($createdOrder){
                foreach ($cartDetails as $cartDetail){
                    $cartDetail->delete();
                }
                event(new CartUpdated($cart->id, $user_id));
            }

            return response()->json(['success' => $createdOrder]);
        }catch (Exception $e){
            return response()->json(["error" =>$e->getMessage()]);
        }
    }

when I tried to debug it, the error is within the Order::create($data);

why this error appears?

EDIT:

Debug Console:

{
    "message": "array_merge(): Expected parameter 1 to be an array, null given",
    "exception": "ErrorException",
    "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php",
    "line": 78,
    "trace": [
        {
            "function": "handleError",
            "class": "Illuminate\\Foundation\\Bootstrap\\HandleExceptions",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php",
            "line": 78,
            "function": "array_merge"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastEvent.php",
            "line": 64,
            "function": "getPayloadFromEvent",
            "class": "Illuminate\\Broadcasting\\BroadcastEvent",
            "type": "->"
        },
        {
            "function": "handle",
            "class": "Illuminate\\Broadcasting\\BroadcastEvent",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 33,
            "function": "call_user_func_array"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Container/Util.php",
            "line": 36,
            "function": "Illuminate\\Container\\{closure}",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 91,
            "function": "unwrapIfClosure",
            "class": "Illuminate\\Container\\Util",
            "type": "::"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php",
            "line": 35,
            "function": "callBoundMethod",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 592,
            "function": "call",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php",
            "line": 94,
            "function": "call",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 128,
            "function": "Illuminate\\Bus\\{closure}",
            "class": "Illuminate\\Bus\\Dispatcher",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
            "line": 103,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php",
            "line": 98,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php",
            "line": 114,
            "function": "dispatchNow",
            "class": "Illuminate\\Bus\\Dispatcher",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php",
            "line": 289,
            "function": "queue",
            "class": "Illuminate\\Broadcasting\\BroadcastManager",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php",
            "line": 212,
            "function": "broadcastEvent",
            "class": "Illuminate\\Events\\Dispatcher",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Broadcasting/PendingBroadcast.php",
            "line": 57,
            "function": "dispatch",
            "class": "Illuminate\\Events\\Dispatcher",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php",
            "line": 218,
            "function": "__destruct",
            "class": "Illuminate\\Broadcasting\\PendingBroadcast",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/app/Observers/OrderStatusObserver.php",
            "line": 15,
            "function": "broadcast"
        },
        {
            "function": "created",
            "class": "App\\Observers\\OrderStatusObserver",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php",
            "line": 388,
            "function": "call_user_func_array"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php",
            "line": 218,
            "function": "Illuminate\\Events\\{closure}",
            "class": "Illuminate\\Events\\Dispatcher",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php",
            "line": 188,
            "function": "dispatch",
            "class": "Illuminate\\Events\\Dispatcher",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php",
            "line": 886,
            "function": "fireModelEvent",
            "class": "Illuminate\\Database\\Eloquent\\Model",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php",
            "line": 728,
            "function": "performInsert",
            "class": "Illuminate\\Database\\Eloquent\\Model",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php",
            "line": 767,
            "function": "save",
            "class": "Illuminate\\Database\\Eloquent\\Model",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Support/helpers.php",
            "line": 433,
            "function": "Illuminate\\Database\\Eloquent\\{closure}",
            "class": "Illuminate\\Database\\Eloquent\\Builder",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php",
            "line": 768,
            "function": "tap"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php",
            "line": 23,
            "function": "create",
            "class": "Illuminate\\Database\\Eloquent\\Builder",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php",
            "line": 1728,
            "function": "forwardCallTo",
            "class": "Illuminate\\Database\\Eloquent\\Model",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php",
            "line": 1740,
            "function": "__call",
            "class": "Illuminate\\Database\\Eloquent\\Model",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/app/Http/Controllers/Api/OrderController.php",
            "line": 108,
            "function": "__callStatic",
            "class": "Illuminate\\Database\\Eloquent\\Model",
            "type": "::"
        },
        {
            "function": "placeOrder",
            "class": "App\\Http\\Controllers\\Api\\OrderController",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Routing/Controller.php",
            "line": 54,
            "function": "call_user_func_array"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php",
            "line": 45,
            "function": "callAction",
            "class": "Illuminate\\Routing\\Controller",
            "type": "->"
        },
        {
            "file": "/home/sohaib/Desktop/Final-Project/Discounts/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
            "line": 239,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\ControllerDispatcher",
            "type": "->"
        },

this is about the half but I think its enough, so I created before a class called OrderStatusObserver, Honestly, I didn't know how this works, but this class contains this code:

<?php

namespace App\Observers;

use App\Events\OrderStatus;
use App\Order;

class OrderStatusObserver
{
    public function created(Order $order)
    {
       broadcast(new OrderStatus($order));
    }
}

this is my broadcastWith function in OrderStatus Event:

public function broadcastWith()
    {
        if($this->order->status == 'accepted'){
            return ['current_position' => 2, 'id' => $this->order->id];
        }elseif ($this->order->status == 'inprogress'){
            return ['current_position' => 3];
        }elseif ($this->order->status == 'onway'){
            return ['current_position' => 4];
        }elseif ($this->order->status == 'delivered'){
            return ['current_position' => 5];
        }
    }

and when I commented broadcast(new OrderStatus($order)); this line it works fine, so anyone knows what is the problem with this, hope anyone can help and sorry for my english

10
  • Please provide a full stack log of error Commented Jun 6, 2020 at 0:50
  • @AliAkbarAzizi Nothing more array_merge(): Expected parameter 1 to be an array, null given, I am trying to debug it, but only this line appears. Commented Jun 6, 2020 at 0:53
  • are you using ajax? Commented Jun 6, 2020 at 0:57
  • @AliAkbarAzizi no, I edited it, hope now is more helpful Commented Jun 6, 2020 at 0:59
  • 1
    Can you provilde OrderStatus class content? there is a problem with boardcastWith Commented Jun 6, 2020 at 17:16

3 Answers 3

3

The problem is because of broadCastWith So you should Return an array in this method. You have two problem.

1-in boradCastWith you only check the value of status, and there is no fallback code. so in this situation if your status not one of delivered,onway,inprogress,accepted you got a problem

public function broadcastWith()
{
    if($this->order->status == 'accepted'){
        return ['current_position' => 2, 'id' => $this->order->id];
    }elseif ($this->order->status == 'inprogress'){
        return ['current_position' => 3];
    }elseif ($this->order->status == 'onway'){
        return ['current_position' => 4];
    }elseif ($this->order->status == 'delivered'){
        return ['current_position' => 5];
    }

    return []; // this is a important line
}

Also note you may use switch case instead of elseif

2-You handle these 4 status probably because other type of status is not valid. So you should add validation. Also in your code you don't have any value for status, so you should add a default value for it. look at https://stackoverflow.com/a/39912500/1827594

Sign up to request clarification or add additional context in comments.

Comments

2

I think you use array _merge() in your create method. Can you show us this one? Also you can check if $data is not null before send it to your method.

just to explain why I am asking you to share your OrderStatus class: according to your error trace, the problem come from the function getPayloadFromEvent in BroadcastEvent.php :

protected function getPayloadFromEvent($event)
{
    if (method_exists($event, 'broadcastWith')) {
        return array_merge(
            $event->broadcastWith(), ['socket' => data_get($event, 'socket')]
        );
    }

    $payload = [];

    foreach ((new ReflectionClass($event))->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
        $payload[$property->getName()] = $this->formatProperty($property->getValue($event));
    }

    unset($payload['broadcastQueue']);

    return $payload;
}

exactly in the array_merge call:

return array_merge($event->broadcastWith(), ['socket' => data_get($event, 'socket')]);

so as your error message says "array_merge(): Expected parameter 1 to be an array, null given", the broadcastWith in your case is returning null instead of an array.

15 Comments

I checked $data, it is not null, how do you know that I am using array_merge()??? I didn't see it before
It's in the error message so it's somewhere. Can you past the code of create?
its a built-in function in Laravel
Are you sure? Which version?
glad to hear that you solved your problem. just a note, I think it's better to use a case statement instead of ifs in your function with the default condition.
|
0

In my case,I have a broadcastWith method in my event. Inside this I have a value for broadcast like this:

return 'say hello to world!';

because of this message, Laravel returns an error for array_marge.

when I change it to this :

return ['say hello to world!'];

It works but I get my message in array format.

I changed it to this:

return ['message' => 'say hello to world'];

now I get the message like this in json format:

{message:say hello to world} 

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.