Wrapping Outputs
Bag supports wrapping both Bag values and Collections when transforming to an array or JSON.
Wrapping Bags
To wrap a Bag, add the Bag\Attributes\Wrap
or Bag\Attributes\WrapJson
attribute to the class:
use Bag\Attributes\Wrap;
use Bag\Bag;
#[Wrap('data')]
class MyValue extends Bag {
public function __construct(
public string $name,
public int $age,
) {}
}
Now whenever you call ->toArray()
or serialize to JSON, the output will be wrapped in a key of data
:
$myValue = MyValue::from(['name' => 'Davey Shafik', 'age' => 40]);
$myValue->toArray(); // ['data' => ['name' => 'Davey Shafik', 'age' => 40]]
$myValue->toJson(); // {"data":{"name":"Davey Shafik","age":40}}
If you only want to wrap when serializing to JSON, you can use the WrapJson
attribute instead:
use Bag\Attributes\WrapJson;
use Bag\Bag;
#[WrapJson('data')]
class MyValue extends Bag {
public function __construct(
public string $name,
public int $age,
) {}
}
Now when you serialize to JSON, the values will be wrapped, but when calling ->toArray()
the output will not be wrapped
$myValue = MyValue::from(['name' => 'Davey Shafik', 'age' => 40]);
$myValue->toArray(); // ['name' => 'Davey Shafik', 'age' => 40]
$myValue->toJson(); // {"data":{"name":"Davey Shafik","age":40}}
TIP
You can add both Wrap
and WrapJson
attributes to the same class to apply different wrapping to ->toArray()
and JSON serialization respectively.
Wrapping Collections
Wrapping Collections works exactly the same way as with Bags: add the Bag\Attributes\Wrap
or Bag\Attributes\WrapJson
attribute to the Collection class:
use Bag\Attributes\Wrap;
use Bag\Collection;
#[Wrap('data')]
class MyCollection extends Collection {
}
Now when you call ->toArray()
or serialize to JSON, the output will be wrapped in a key of data
:
$collection = MyValue::factory()->count(2)->make();
$collection->toArray(); // ['data' => [["name" => "Davey Shafik", "age" => 40], ...]]
$collection->toJson(); // {"data":[{"name":"Davey Shafik","age":40}, ...]}