All notable changes to laravel-data
will be documented in this file.
- Auto lazy by @rubenvanassche in #831
Full Changelog: https://github.com/spatie/laravel-data/compare/4.12.0...4.13.0
What a release! Probably to biggest minor release we've ever done!
Some cool highlights:
Optional values are great, but sometimes a null
value is desirable from now on you can do the following:
class SongData extends Data {
public function __construct(
public string $title,
public string $artist,
public Optional|null|string $album,
) {
}
}
SongData::factory()
->withoutOptionalValues()
->from(['title' => 'Never gonna give you up', 'artist' => 'Rick Astley']); // album will `null` instead of `Optional`
It was already possible to inject a Laravel route parameter when creating a data object, we've now extended this functionality quite a bit and also allow injecting dependencies from the container and the authenticated user.
class SongData extends Data {
#[FromAuthenticatedUser]
public UserData $user;
}
In the past when the validation rules of a property were manually defined, the automatic validation rules for that property were omitted. From now on, you can define manual validation rules and merge them with the automatically generated validation rules:
```php
#[MergeValidationRules]
class SongData extends Data
{
public function __construct(
public string $title,
public string $artist,
) {
}
public static function rules(): array
{
return [
'title' => ['max:20'],
'artist' => ['max:20'],
];
}
}
We now ship by default a Uppercase
and Lowercase
mapper for mapping property names.
- Fix GitHub action fail by @rust17 in #918
- Point to the right problem on ArgumentCountError exception by @nsvetozarevic in #884
- Fix an issue where anonymous classes in castables were serialized (#903) by @rubenvanassche in #923
- Add the ability to optionally merge automatically inferred rules with manual rules by @CWAscend in #848
- Implement enum json serialization by @dont-know-php in #896
- Use comments instead of docblocks in configuration file. by @edwinvdpol in #904
- Casting DateTimeInterface: Truncate nanoseconds to microseconds (first 6 digits) / with Tests by @yob-yob in #908
- Use container to call
Data::authorize()
to allow for dependencies by @cosmastech in #910 - Improve type for CreationContextFactory::alwaysValidate by @sanfair in #925
- Removed comma character from Data Rule stub by @andrey-helldar in #926
- Use BaseData contract i/o Data concrete in CollectionAnnotation by @riesjart in #928
- New mappers added:
LowerCaseMapper
andUpperCaseMapper
by @andrey-helldar in #927 - Allow disabling default Optional values in CreationContext by @ragulka in #931
- Fix introduction.md by @pikant in #937
- General code health improvements by @xHeaven in #920
- Filling properties from current user by @c-v-c-v in #879
Full Changelog: https://github.com/spatie/laravel-data/compare/4.11.1...4.12.0
- Fix an issue where the cache structures command did not work if the directory did not exist (#892)
- feat: support "null to optional" by @innocenzi in #881
- Register optimize commands by @erikgaal in #880
Full Changelog: https://github.com/spatie/laravel-data/compare/4.10.1...4.11.0
- Fix an issue where optional default values would disable validation
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)
- Move some interfaces around in order to avoid a circular chaos
- Remove a circular dependency
- Fix a missing dependency
- Detect data from collection by @clementbirkle in #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
- Fix issue where an exception was not always thrown while it should (#809)
- Solve an issue where an empty container with an iterable cast won't be cast (#810)
- Fix Parsing of Optional Types Annotations in DataIterableAnnotation (#808)
- Support TypeScript Hidden Properties (#820)
- Fix issue where abstract eloquent casts were not encrypted(#828)
- Fix some typos in docs by @Klaas058 in #794
- Provide a default timezone for casting date by @PhilippeThouvenot in #799
- Remove object rule caching
- Fix an issue where a normalized model attribute fetching a relation would not use the loaded relation
- @PhilippeThouvenot made their first contribution in #799
Full Changelog: https://github.com/spatie/laravel-data/compare/4.7.0...4.7.1
- Fix typo in docs by @DvDty in #769
- Update wrapping.md by @kimulisiraj in #770
- Fix typos on "Use with Livewire" page by @vkarchevskyi in #777
- Fix dataCastUsing method signature by @shankhadevpadam in #781
- Avoid loading already loaded relations and allow loading non studly relation names by @Tofandel in #773
- Fix routing parameters filled in incorrectly using mapping property names by @guiqibusixin in #775
- Feature: add ability to store eloquent casts as an encrypted string by @eugen-stranz in #723
- @DvDty made their first contribution in #769
- @vkarchevskyi made their first contribution in #777
- @shankhadevpadam made their first contribution in #781
- @guiqibusixin made their first contribution in #775
- @eugen-stranz made their first contribution in #723
- @yob-yob made their first contribution in #776
Full Changelog: https://github.com/spatie/laravel-data/compare/4.6.0...4.7.0
- Add initial support for casting union types
- Fix an issue with paginator includes not working
- Fix consistency of After, AfterOrEqual, Before, BeforeOrEquals rules
- Fix creation context issue (#749)
- Fix an performance issue where when creating a data object from models, the attributes were always called
- Add a #[LoadRelation] attribute which allows loading model relations when creating data objects on the fly
Full Changelog: https://github.com/spatie/laravel-data/compare/4.5.1...4.6.0
- Backport cache fix to v3 by @jameshulse in #671
- fix: adds environment variable to disable structure caching by @jaydublu2002 in #645
- v3 support for Laravel 11 by @jameshulse in #739
Full Changelog: https://github.com/spatie/laravel-data/compare/4.5.1...3.12.0
- Abstract data object as collection by @onursimsek in #741
Full Changelog: https://github.com/spatie/laravel-data/compare/4.5.0...4.5.1
- Cast value to string for createFromFormat by @kylekatarnls in #707
- fix: avoid mutation during
DataCollectable
transformation by @innocenzi in #696 - Add new section to the docs for package testing by @adam-code-labx in #711
- Change default cache variable by @Elnadrion in #717
- Improve performance of CastPropertiesDataPipe by using hash lookups instead of ->first by @LauJosefsen in #721
- Change method of creating object without magic methods by @daveroverts in #725
- Upgrade to inertia 1.0 by @kimulisiraj in #726
- Allow to pass multiple formats to Laravel's
date_format
rule by @riesjart in #727 - Add attribute for Laravel's
list
validation rule by @riesjart in #728 - chore(deps): bump dependabot/fetch-metadata from 1.6.0 to 2.0.0 by @dependabot in #718
- Update creating-a-cast.md by @AlexRegenbogen in #724
- Fix wrong link to using attributes page by @BernhardK91 in #733
- Add better support for serializing data by @rubenvanassche in #735
- Fix for the use of built-in class names in Collection annotations by @27pchrisl in #736
- Adds a config option to silently ignore when a Computed Property is being set by @erikaraujo in #714
Full Changelog: https://github.com/spatie/laravel-data/compare/4.4.1...4.5.0
- fix issue where DataCollection keys were missing in TypeScript by @rubenvanassche
Full Changelog: https://github.com/spatie/laravel-data/compare/4.4.0...4.4.1
- Add support for transformation max depths by @rubenvanassche in #699
Full Changelog: https://github.com/spatie/laravel-data/compare/4.3.2...4.4.0
- Provide fallbacks for config values by @sebastiandedeyne in #695
Full Changelog: https://github.com/spatie/laravel-data/compare/4.3.1...4.3.2
- Support duration in cache configuration by @sebastiandedeyne in #694
- Handle
null
forfieldContext
withinresolvePotentialPartialArray
by @faustbrian in #693
Full Changelog: https://github.com/spatie/laravel-data/compare/4.3.0...4.3.1
- Update wrapping.md to clarify collections and paginated collections case by @santigarcor in #675
- Feature/cast and transformer iterables by @rubenvanassche in #686
- Add support for passing on partials when not transforming values by @rubenvanassche in #688
- chore(deps): bump ramsey/composer-install from 2 to 3 by @dependabot in #678
- Allow data context to be set to null by @sebastiandedeyne in #691
- Fix iterable casts when there's a global and local cast specified by @sebastiandedeyne in #690
- Fix iterable values with union types by @sebastiandedeyne in #692
Full Changelog: https://github.com/spatie/laravel-data/compare/4.2.0...4.3.0
- Add experimental support for Livewire synths @rubenvanassche in #669
- Add DataCollectionSynth by @edalzell in #591
Full Changelog: https://github.com/spatie/laravel-data/compare/4.1.0...4.2.0
- fix: adds environment variable to disable structure caching (#645)
- Backport cache fix to v3 by @jameshulse in #671
Full Changelog: https://github.com/spatie/laravel-data/compare/3.11.0...3.11.1
- Fix an issue where the cache was queried too much
- Move the creation process of object rules from constructor to
getRule
to fix issues with caching and typescript transformer - Laravel 11 support
- Fixes issue where casts could not return
null
or an empty array - Prevent out of memory with multiple requests in a test (#665)
- Allow passing
null
tocollect
and return an empty version of the defined output type - Fix templates for Laravel Idea plugin support (#666)
- Fix an issue where the cache could not be disabled
Laravel-data 4.0.0 was released 5 hours ago, time for an update!
- Add support for a collection cast
- Make sure we check wether a value is Uncastable
- Fix issue where creating a data object from multiple payloads wasn't always consistent
- Allow disabling cache
- Refactor
PropertyRules
- Fix issue where install on windows was impossible
- Fix types for map and through (#640)
- Allow arrays, Collections, Paginators, ... to be used as DataCollections
- Add support for magically creating data collections
- Rewritten transformation system with respect to includeable properties
- Addition of collect method
- Removal of collection method
- Add support for using Laravel Model attributes as data properties
- Allow creating data objects using
from
without parameters - Add support for a Dto and Resource object
- It is now a lot easier to validate all the payloads added to laravel-data
- Added contexts to the creation and transformation process
- Allow creating a data object or collection using a factory
- Speed up the process of creating and transforming data objects
- Add support for BNF syntax
- Laravel 10 requirement
- Rewritten docs
Some more "internal" changes
- Restructured tests for the future we have ahead
- The Type system was completely rewritten, allowing for a better performance and more flexibility in the future
- Benchmarks added to make data even faster
- Add support for data structure caching #622
- Make ValidationPath Stringable
- Fix PHPStan
- Improve performance when optional property exists (#612)
A fresh release after a month of vacation, enjoy!
- Add ExcludeWith validation rule (#584)
- Add DoesntEndWith and DoesntStartWith validation rules (#585)
- Add MinDigits and MaxDigits validation rules (#586)
- Add DataCollection reject() method (#593)
- Add generic type for WithData trait (#597)
- Fix issue where non set optional values were transformed (#602)
- Fix issue where parameters passed to Laravel Collection methods would sometimes provide alternative results (issue: #607)
- MimeTypes validation fix on v1 (#596)
- Fix breaking compatibility #590
- Add Declined and DeclinedIf validation attributes (#572)
- Add MacAddress validation attribute (#573)
- Add RequiredArrayKeys validation attribute (#574)
- Support Arrayable when casting to DataCollection (#577)
- Fetch attributes from parent classes to allow reusability (#581)
- Fix issue where non-set optional values would be transformed
- Fix an issue where computed values could not be set as null
- Fix for no rules created on optional|nullable Data object and Collection (#532)
- Add
CustomValidationAttribute
's - Copy partial trees when using array access on a collection
- fix abstract json cast format
- Add Hidden Attribute (#505)
- Add Null value support for RequiredUnless Validation (#525)
- Add abstract eloquent casts (#526)
- fix target namespace when creating files with Laravel Idea (#497)
- allow collection to be created passing null (#507)
- add Ulid validation rule (#510) -add TARGET_PARAMETER to Attribute for improved Validation (#523)
- Add support for better exception messages when parameters are missing
- Fix default properties generating validation rules when not provided
- Add last() method on DataCollection (#486)
- Add new manual written present attribute rule always overwrites a generated required rule
- Added the ability to create data files, casts, transformers and rules using Laravel Idea plugin #485
- Add some config options to the
make:data
command (#449, #335)
- Add laravel v10 support
- Add ability to instantiate an eloquent cast when null value using null database values (#425)
- Revert only use validated data (#438) -> see #432
- Add support for computed values
- Add merge method to Data Collections (#419)
- Allow field references in same validation attribute
- Generic return type of toResponse function (#437)
- Only use validated data (#438)
- Add missing constructor parameters to error message (#433)
- Make Lazy Macroable
- Update TypeScript Transformer with new closure lazy type
- Add support for Lazy Closures which can be used with inertia
- reverted the reverted #393 branch
- Allow to fetch Lazy data properties in unified way (#403)
- revert: Fix usage of properties' mapped output names in 'only', 'except', 'includes', and 'excludes' operations (#393)
- Fix issue when validating and creating a data object was impossible to use magic creation methods
- Fix usage of properties' mapped output names in 'only', 'except', 'includes', and 'excludes' operations (#393)
- Add some extra documentation
- Introduce FormRequestNormalizer (#380)
- Add support for models without all columns (#385)
- Add benchmarks for testing data performance
- Add some performance improvements for data creation and transformation
- Performance improvements
- Fix issue where promoted protected constructor parameters were seen as possible property canidates
- Allow using closures within the with method (#372)
- Add support for Validation Rule Contract in Rule rule (#362)
- Allow laravel-data validation rules to be used in Laravel validator (#375)
- Add WithCastable attribute (#349)
- Quote non-standard object keys when transforming to Typescript (#367)
- Allow filling props from route parameters (#341)
- Better handing of custom regex validation rules(#342)
- Fix types (#348)
- Improve validation when strings are passed for nested data objects
- Add FieldReference to Before and After Validation attribute (#345)
- The validation logic is completely rewritten
- Add support for nested nullable and optional data objects
- Allow referencing other fields in validation attributes when the data is nested
- Allow referencing url parameters (and even model properties) in validation attributes
- Allow circular dependencies when validating data
- Add support for nested validation messages and attributes
- Package specific properties are renamed to avoid conflicts
- Serialization logic updated to only serialize your properties
- Prevent fatal error when passing a string containing only an integer to JSON Normalizer (#322)
- Ignore leading ! in DateTimeInterfaceTransformer (#325)
- Extend the make:data command to be more flexible (#335)
- Add Laravel 10.x support (#331)
- Add a way to prepend DataPipes to the pipeline (#305)
- Better IDE completion (#307)
- Make eloquent collection cast respect collection (#308)
- fix support to return 201 status code in Json Responses (#291)
- Add generic return type for DataCollection::toCollection (#290)
- Improve ide.json completion (#294)
- Pass in payload relative to the data object when generating rules (#264)
- ignore phpstorm attributes when instantiating and add readonly property (#281)
- Stop using custom pipeline when creating data magically from requests
- set timezones in datetime casts (#287 )
- add support for optional properties in TypeScript transformer (#153)
- refactor test suite to Pest (#239)
- update the docs
- add a
StudlyMapper
- add better support for Livewire
- accept 'float' as data type (#237)
- fix typo in mime type validation rule(#243)
- add support for enums in validation attributes
- add support for withoutTrashed to exists validation attribute (#248)
- add PHP 8.2 testing in GH actions
- add ability to modify properties before the data pipeline (#247)
- fix first and last page url are never null (#215)
- add ability to statically retrieve a data models rules (#221)
- improved pattern matching in DataCollectionAnnotationReader (#225)
- add ExcludeWithout attribute rule (#230)
- improve getValidationRules to also retrieve wildcard rules (#231)
- return property with or without mapping the name (#199)
- Improve pattern matching in DataCollectionAnnotationReader (#214)
- Add ability to retrieve rules for a data object (#221)
- Use generics with Data::collection (#213)
- Improve pattern matching in DataCollectionAnnotationReader (#214)
- Fix TypeScript Transformer paginated collections, first and last page url are never null (#215)
- Add support for a JsonSerializer
- Fix generic iterator definition for data collections
- Fix validation of DataCollection objects not working as expected
- Add support for timezone manipulation in casts and transformers (#200)
- use AbstractCloner instead of reflection (#196)
- Add var dumper caster (#195)
- Allow direct pipeline call (#193)
- Rename ArrayableNormalizer (#191)
- Make normalizers configurable (#190)
- Add cast lazy condition result to bool (#186)
- Add conditional return types for collections (#184)
- Fix windows tests
- Fix validation rules not being used for data collections and objects
- Add IDE completion support (#182)
- Add support for invokable rules (#179)
- more consistent use of transform through codebase for transforming collections and data
- Add class defined partials (#164)
- Use mapped property names in TypeScript (#154)
- Add make:data command (#157)
- Better support for overwritten rules
- Add support for Lazy inertia props (#163)
- Add support for array query parameters as partials (#162)
Version 2 of laravel-data is a complete overhaul, we've almost completely rewritten the package.
This is a (non-complete) list of the new features:
- A DataPipeline
- Data normalizers
- Mappable property names
- Wrapping of data in responses
only
andexcept
methods on Data and DataCollections- Multiple parameter magic methods
- Optional properties
- Split DataCollections
- Better support for TypeScript Transformer
- And a lot more ...
- Fix optional parameters (#152)
- Use protected properties and methods (#147 )
- add values() on DataCollection by @Nielsvanpach in #135
- @Nielsvanpach made their first contribution in #135
Full Changelog: https://github.com/spatie/laravel-data/compare/1.4.7...1.5.0
- support $payload as a dependency in rules (#123)
- Add Dependency Injection for rules, messages, and attributes methods (#114)
- Add support for stdClass payload casting (#106)
- use present validation rule instead of required for data collections
- allow using default password config in password validation attribute (#94)
- solve binding issues on Laravel Octane (#101)
- fixes a bug where models nested by relation could not be created due to date casts
- add a
links
array to the paginated response - stop execution of
lazy::whenLoaded
closure when the relation isnull
- fix for aborting value assignment after a false boolean (#80)
- add a
WithoutValidation
attribute - allow transformers to target native types, data collections and data objects
- Allow transformers to target Data and DataCollections
- removes checks for built in types and
isBuiltIn
fromDataProperty
- add better support for defaults
- Laravel 9.x by @aidan-casey in #77
- Removes Spatie's Laravel Enums from dev requirements by @aidan-casey in #76
- @aidan-casey made their first contribution in #77
Full Changelog: https://github.com/spatie/laravel-data/compare/1.3.2...1.3.3
- add support for json_encode to Data objects
- add support for json_encode to DataCollection objects
- add basic support for intersection types
- allow casting of built in PHP types
- add support for inferring enum rules
- fix an issue where an Enum validation attribute would not work
- fixes the RequiredRuleResolver to support custom rules like
Enum
- add an Enum validation rule attribute
- rename the
authorized
method toauthorize
- disable the behavior were excluded conditional properties still could be included
- fix return type notice message
- fixes an issue where data object could not be created when it had lazy nested data object
- fixes windows test suite
- when creating data objects, we now will always run validation when a
Request
object is given not only when a data object is injected - removal of
DataFromRequestResolver
- added
DataValidatorResolver
- change data property types collection checking procedure
- move
spatie/test-time
dependency to require-dev - expand support for nested data object creation (#19)
- expand support for annotating data collections
- revert allow ignoring with a closure within a unique rule
- allow ignoring with a closure within a unique rule
- add a
WithData
trait for quicker getting data from objects
- fix required rules being added when not allowed
- initial release