Skip to content

Commit

Permalink
Merge branch 'main' into auto-lazy
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/Support/Factories/DataPropertyFactory.php
#	tests/CreationTest.php
#	tests/Support/DataPropertyTest.php
  • Loading branch information
rubenvanassche committed Jan 24, 2025
2 parents 19131a3 + b6f63fa commit 66c59db
Show file tree
Hide file tree
Showing 155 changed files with 3,930 additions and 1,010 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ node_modules
.php-cs-fixer.cache
.phpbench
.DS_Store
/.phpunit.cache/
51 changes: 51 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,57 @@

All notable changes to `laravel-data` will be documented in this file.

## 4.11.1 - 2024-10-23

- Fix an issue where the cache structures command did not work if the directory did not exist (#892)

## 4.11.0 - 2024-10-22

### What's Changed

* feat: support "null to optional" by @innocenzi in https://github.com/spatie/laravel-data/pull/881
* Register optimize commands by @erikgaal in https://github.com/spatie/laravel-data/pull/880

**Full Changelog**: https://github.com/spatie/laravel-data/compare/4.10.1...4.11.0

## 4.10.1 - 2024-10-07

- Fix an issue where optional default values would disable validation

## 4.10.0 - 2024-10-04

It has been a fews weeks, a mostly bugfix release with one new feature, enjoy!

- Fix an issue where required rules could not be combined with optional (#844)
- Fix Livewire return type to make sure it can return everything in the data object (#836)
- Fix issue where validation messages where ignored by collections nested in collections (#867)
- Fix Resource to include Contextable data inteface (#868)
- Stop NormalizedModel from initializing itself and try to lazy load properties when required (#870)
- Passing an enum to caster handle without an error (#841)
- Passing date objects to caster handle without an error (#842)
- Allow setting a default mapping strategy (#846)

## 4.9.0 - 2024-09-10

- Move some interfaces around in order to avoid a circular chaos

## 4.8.2 - 2024-08-30

- Remove a circular dependency

## 4.81 - 2024-08-13

- Fix a missing dependency

## 4.8.0 - 2024-08-13

### What's Changed

* Detect data from collection by @clementbirkle in https://github.com/spatie/laravel-data/pull/812
* Fix an issue where dd or dump did not work

**Full Changelog**: https://github.com/spatie/laravel-data/compare/4.7.2...4.8.0

## 4.7.2 - 2024-07-25

- Fix issue where an exception was not always thrown while it should (#809)
Expand Down
6 changes: 3 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@
"require" : {
"php": "^8.1",
"illuminate/contracts": "^10.0|^11.0",
"phpdocumentor/type-resolver": "^1.5",
"phpdocumentor/reflection": "^6.0",
"spatie/laravel-package-tools": "^1.9.0",
"spatie/php-structure-discoverer": "^2.0"
},
"require-dev" : {
"fakerphp/faker": "^1.14",
"friendsofphp/php-cs-fixer": "^3.0",
"inertiajs/inertia-laravel": "^1.2",
"larastan/larastan": "^2.7",
"livewire/livewire": "^3.0",
"mockery/mockery": "^1.6",
"nesbot/carbon": "^2.63",
"nunomaduro/larastan": "^2.0",
"orchestra/testbench": "^8.0|^9.0",
"pestphp/pest": "^2.31",
"pestphp/pest-plugin-laravel": "^2.0",
Expand All @@ -38,7 +38,7 @@
"phpstan/extension-installer": "^1.1",
"phpunit/phpunit": "^10.0",
"spatie/invade": "^1.0",
"spatie/laravel-typescript-transformer": "^2.3",
"spatie/laravel-typescript-transformer": "^2.5",
"spatie/pest-plugin-snapshots": "^2.1",
"spatie/test-time": "^1.2"
},
Expand Down
60 changes: 35 additions & 25 deletions config/data.php
Original file line number Diff line number Diff line change
@@ -1,39 +1,37 @@
<?php

use Illuminate\Support\Enumerable;

return [
/**
/*
* The package will use this format when working with dates. If this option
* is an array, it will try to convert from the first format that works,
* and will serialize dates using the first format from the array.
*/
'date_format' => DATE_ATOM,

/**
/*
* When transforming or casting dates, the following timezone will be used to
* convert the date to the correct timezone. If set to null no timezone will
* be passed.
*/
'date_timezone' => null,

/**
/*
* It is possible to enable certain features of the package, these would otherwise
* be breaking changes, and thus they are disabled by default. In the next major
* version of the package, these features will be enabled by default.
*/
'features' => [
'cast_and_transform_iterables' => false,

/**
/*
* When trying to set a computed property value, the package will throw an exception.
* You can disable this behaviour by setting this option to true, which will then just
* ignore the value being passed into the computed property and recalculate it.
*/
'ignore_exception_when_trying_to_set_computed_property_value' => false,
],

/**
/*
* Global transformers will take complex types and transform them into simple
* types.
*/
Expand All @@ -43,7 +41,7 @@
BackedEnum::class => Spatie\LaravelData\Transformers\EnumTransformer::class,
],

/**
/*
* Global casts will cast values into complex types when creating a data
* object from simple types.
*/
Expand All @@ -53,7 +51,7 @@
// Enumerable::class => Spatie\LaravelData\Casts\EnumerableCast::class,
],

/**
/*
* Rule inferrers can be configured here. They will automatically add
* validation rules to properties of a data object based upon
* the type of the property.
Expand All @@ -66,7 +64,7 @@
Spatie\LaravelData\RuleInferrers\AttributesRuleInferrer::class,
],

/**
/*
* Normalizers return an array representation of the payload, or null if
* it cannot normalize the payload. The normalizers below are used for
* every data object, unless overridden in a specific data object class.
Expand All @@ -80,22 +78,22 @@
Spatie\LaravelData\Normalizers\JsonNormalizer::class,
],

/**
/*
* Data objects can be wrapped into a key like 'data' when used as a resource,
* this key can be set globally here for all data objects. You can pass in
* `null` if you want to disable wrapping.
*/
'wrap' => null,

/**
/*
* Adds a specific caster to the Symphony VarDumper component which hides
* some properties from data objects and collections when being dumped
* by `dump` or `dd`. Can be 'enabled', 'disabled' or 'development'
* which will only enable the caster locally.
*/
'var_dumper_caster_mode' => 'development',

/**
/*
* It is possible to skip the PHP reflection analysis of data objects
* when running in production. This will speed up the package. You
* can configure where data objects are stored and which cache
Expand All @@ -121,53 +119,65 @@
],
],

/**
/*
* A data object can be validated when created using a factory or when calling the from
* method. By default, only when a request is passed the data is being validated. This
* behaviour can be changed to always validate or to completely disable validation.
*/
'validation_strategy' => \Spatie\LaravelData\Support\Creation\ValidationStrategy::OnlyRequests->value,

/**
/*
* A data object can map the names of its properties when transforming (output) or when
* creating (input). By default, the package will not map any names. You can set a
* global strategy here, or override it on a specific data object.
*/
'name_mapping_strategy' => [
'input' => null,
'output' => null,
],

/*
* When using an invalid include, exclude, only or except partial, the package will
* throw an exception. You can disable this behaviour by setting this option to true.
*/
'ignore_invalid_partials' => false,

/**
/*
* When transforming a nested chain of data objects, the package can end up in an infinite
* loop when including a recursive relationship. The max transformation depth can be
* set as a safety measure to prevent this from happening. When set to null, the
* package will not enforce a maximum depth.
*/
'max_transformation_depth' => null,

/**
/*
* When the maximum transformation depth is reached, the package will throw an exception.
* You can disable this behaviour by setting this option to true which will return an
* empty array.
*/
'throw_when_max_transformation_depth_reached' => true,

/**
* When using the `make:data` command, the package will use these settings to generate
* the data classes. You can override these settings by passing options to the command.
*/
/*
* When using the `make:data` command, the package will use these settings to generate
* the data classes. You can override these settings by passing options to the command.
*/
'commands' => [
/**

/*
* Provides default configuration for the `make:data` command. These settings can be overridden with options
* passed directly to the `make:data` command for generating single Data classes, or if not set they will
* automatically fall back to these defaults. See `php artisan make:data --help` for more information
*/
'make' => [
/**

/*
* The default namespace for generated Data classes. This exists under the application's root namespace,
* so the default 'Data` will end up as '\App\Data', and generated Data classes will be placed in the
* app/Data/ folder. Data classes can live anywhere, but this is where `make:data` will put them.
*/
'namespace' => 'Data',

/**
/*
* This suffix will be appended to all data classes generated by make:data, so that they are less likely
* to conflict with other related classes, controllers or models with a similar name without resorting
* to adding an alias for the Data object. Set to a blank string (not null) to disable.
Expand All @@ -176,7 +186,7 @@
],
],

/**
/*
* When using Livewire, the package allows you to enable or disable the synths
* these synths will automatically handle the data objects and their
* properties when used in a Livewire component.
Expand Down
60 changes: 60 additions & 0 deletions docs/advanced-usage/available-property-mappers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
title: Available property mappers
weight: 19
---

In previous sections we've already seen how
to [create](/docs/laravel-data/v4/as-a-data-transfer-object/mapping-property-names) data objects where the keys of the
payload differ from the property names of the data object. It is also possible
to [transform](/docs/laravel-data/v4/as-a-resource/mapping-property-names) data objects to an
array/json/... where the keys of the payload differ from the property names of the data object.

These mappings can be set manually put the package also provide a set of mappers that can be used to automatically map
property names:

```php
class ContractData extends Data
{
public function __construct(
#[MapName(CamelCaseMapper::class)]
public string $name,
#[MapName(SnakeCaseMapper::class)]
public string $recordCompany,
#[MapName(new ProvidedNameMapper('country field'))]
public string $country,
#[MapName(StudlyCaseMapper::class)]
public string $cityName,
#[MapName(LowerCaseMapper::class)]
public string $addressLine1,
#[MapName(UpperCaseMapper::class)]
public string $addressLine2,
) {
}
}
```

Creating the data object can now be done as such:

```php
ContractData::from([
'name' => 'Rick Astley',
'record_company' => 'RCA Records',
'country field' => 'Belgium',
'CityName' => 'Antwerp',
'addressline1' => 'some address line 1',
'ADDRESSLINE2' => 'some address line 2',
]);
```

When transforming such a data object the payload will look like this:

```json
{
"name" : "Rick Astley",
"record_company" : "RCA Records",
"country field" : "Belgium",
"CityName" : "Antwerp",
"addressline1" : "some address line 1",
"ADDRESSLINE2" : "some address line 2"
}
```
Loading

0 comments on commit 66c59db

Please sign in to comment.