Powerful data objects for Laravel

Overview

Powerful data objects for Laravel

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

This package enables the creation of rich data objects which can be used in various ways. Using this package you only need to describe your data once:

  • instead of a form request, you can use a data object
  • instead of an API transformer, you can use a data object
  • instead of manually writing a typescript definition, you can use... 🥁 a data object

A laravel-data specific object is just a regular PHP object that extends from Data:

use Spatie\LaravelData\Data;

class SongData extends Data
{
    public function __construct(
        public string $title,
        public string $artist,
    ) {
    }
}

By extending from Data you enable a lot of new functionality like:

  • Automatically transforming data objects into resources (like the Laravel API resources)
  • Transform only the requested parts of data objects with lazy properties
  • Automatically creating data objects from request data and validating them
  • Automatically resolve validation rules for properties within a data object
  • Make it possible to construct a data object from any type you want
  • Add support for automatically validating data objects when creating them
  • Generate TypeScript definitions from your data objects you can use on the frontend
  • Save data objects as properties of an Eloquent model
  • And a lot more ...

Why would you be using this package?

  • You can be sure that data is typed when it leaves your app and comes back again from the frontend which makes a lot less errors
  • You don't have to write the same properties three times (in a resource, in a data transfer object and in request validation)
  • You need to write a lot less of validation rules because they are obvious through PHP's type system
  • You get TypeScript versions of the data objects for free

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Documentation

You will find full documentation on the dedicated documentation site.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

Comments
  • feat: support optional properties

    feat: support optional properties

    Original PR: https://github.com/spatie/laravel-data/pull/127 (was closed due to the deletion of the v2 branch)


    This PR is a second take at https://github.com/spatie/laravel-data/pull/119, that does not replace the default behavior but supports the newly configurable one.

    It depends on https://github.com/spatie/typescript-transformer/pull/30 and https://github.com/spatie/laravel-typescript-transformer/pull/15. Both of these should be merged before this PR (tests will not pass anyway).

    What's important:

    • The #[Optional] attribute from typescript-transformer is taken into account
    • The new transform_null_to_optional option from laravel-typescript-transformer is taken into account
    • The current behavior does not change unless one of the above is true

    Example:

    use Spatie\TypeScriptTransformer\Attributes\Optional;
    
    class UserData
    {
        public function __construct(
            #[Optional]
            public int $id,
            public string $first_name,
        ) {
        }
    }
    
    interface UserData {
      id?: number
      first_name: string
    }
    

    The Optional attribute above would not be necessary if config/typescript-transformer.php's transform_null_to_optional is set to true (which is false by default to preserve current behavior).

    opened by innocenzi 17
  • Pass in payload relative to the data object when generating rules

    Pass in payload relative to the data object when generating rules

    This PR attempts to solve the problem identified by @medvinator in #256 which is something our team has also run into. If you want to dynamically build validation rules depending on the payload it's very difficult at the moment as the data object receives the full payload and doesn't know the path to its data.

    E.g. a data object inside a collection won't know that the path to its data is collection.2.example and this makes rule generation very difficult to work with at the moment.

    This PR approaches this problem by building the validation rules for each set of data. There's some pros and cons to this approach. The pros are that you can now build validation rules using the data relative to the object. However, collections with many many objects inside them will generate rules like:

    collection.0.example, collection.1.example, collection.2.example etc.

    In addition, if there's no data inside the collection no rule will be generated for the child field. E.g. no collection.*.example

    I'm not sure of the best way to approach that problem and for our team the overheard in rule generation wouldn't be an issue and is worth the dynamic validation functionality.

    This PR probably requires more tests and some code improvements, but I thought I'd create it to see what your thoughts are and start the discussion 😄

    Thanks for creating an amazing package!

    opened by bentleyo 15
  • feat: support optional properties

    feat: support optional properties

    This PR is a second take at https://github.com/spatie/laravel-data/pull/119, that does not replace the default behavior but supports the newly configurable one.

    It depends on https://github.com/spatie/typescript-transformer/pull/30 and https://github.com/spatie/laravel-typescript-transformer/pull/15. Both of these should be merged before this PR (tests will not pass anyway).

    What's important:

    • The #[Optional] attribute from typescript-transformer is taken into account
    • The new transform_null_to_optional option from laravel-typescript-transformer is taken into account
    • The current behavior does not change unless one of the above is true

    Example:

    use Spatie\TypeScriptTransformer\Attributes\Optional;
    
    class UserData
    {
        public function __construct(
            #[Optional]
            public int $id,
            public string $first_name,
        ) {
        }
    }
    
    interface UserData {
      id?: number
      first_name: string
    }
    

    The Optional attribute above would not be necessary if config/typescript-transformer.php's transform_null_to_optional is set to true (which is false by default to preserve current behavior).

    cc @rubenvanassche

    opened by innocenzi 8
  • Case mappers don't work as (presumably) intended.

    Case mappers don't work as (presumably) intended.

    Using Win 11 / WSL 2 (Ubuntu) / PHP 8.1.12.

    Test usage:

    $tmp = json_decode($employeesJson, true)[0];
    $data = Employee::from($tmp);
    rd($tmp, $data);
    

    👍 works

    use Spatie\LaravelData\Attributes\MapInputName;
    use Spatie\LaravelData\Data;
    
    class EmployeeData extends Data
    {
        public function __construct(
            #[MapInputName('Id')]                   public ?int $id = null,
            #[MapInputName('ReferenceId')]          public ?string $referenceId = null,
            #[MapInputName('OrganizationalUnitId')] public ?int $organizationalUnitId = null,
            #[MapInputName('Active')]               public ?bool $active = null,
        ) { }
    }
    /* Ray output
    array:32 [▼
      "Id" => 69
      "ReferenceId" => "552"
      "OrganizationalUnitId" => 123011821
      "Active" => true
    ]
    App\Data\EmployeeData {#3342 ▼
      +id: 69
      +referenceId: "552"
      +organizationalUnitId: 123011821
      +active: true
    }
    */
    

    👎doesn't

    use Spatie\LaravelData\Attributes\MapInputName;
    use Spatie\LaravelData\Data;
    use Spatie\LaravelData\Mappers\CamelCaseMapper;
    
    #[MapInputName(CamelCaseMapper::class)]
    class EmployeeData extends Data
    {
        public function __construct(
            public ?int $id = null,
            public ?string $referenceId = null,
            public ?int $organizationUnitId = null,
            public ?bool $active = null,
        ) { }
    }
    /* Ray output
    array:32 [▼
      "Id" => 69
      "ReferenceId" => "552"
      "OrganizationalUnitId" => 123011821
      "Active" => true
    ]
    App\Data\EmployeeData {#3342 ▼
      +id: null
      +referenceId: null
      +organizationalUnitId: null
      +active: null
    }
    */
    

    Perhaps I just misunderstood the intended usage or something...

    opened by mathmul 7
  • feat: allow direct pipeline call

    feat: allow direct pipeline call

    This PR adds a way to transform something into a DTO without using the custom transform methods.

    I often need to transform models but modify some of their properties during the process. For instance, a model using HashIDs should not have its id used in the DTO, but its HashID.

    Currently, I use a custom from method, and I call toArray() on the model:

    public static function fromDummyModel(DummyModel $model): static
    {
        return static::from([
            ...$model->toArray(),
            'id' => $model->getRouteKey()
        ]);
    }
    

    The issue is that this will not take nested DTOs into account. If my model has a relation, and that relation is setup as a DTO, the custom creation methods for these nested DTOs are never called, because the relations are serialized in the first toArray call.

    To fix that, this PR adds a throughPipeline method that will pass the given value through the transform pipeline while ignoring custom transform methods. This method can be called inside a custom transform method, fixing the issues above.

    public static function fromDummyModel(DummyModel $model)
    {
        return static::from([
            ...self::throughPipeline($model)->toArray(),
            'id' => $model->getRouteKey(),
        ]);
    }
    

    If you have a better name than throughPipeline, feel free to change it. I couldn't come up with a better idea. 😅

    opened by innocenzi 7
  • PHPUnit to Pest Converter

    PHPUnit to Pest Converter

    This pull request contains changes for migrating your test suite from PHPUnit to Pest automated by the Pest Converter.

    Before merging, you need to:

    • Checkout the shift-64030 branch
    • Review all of the comments below for additional changes
    • Run composer update to install Pest with your dependencies
    • Run vendor/bin/pest to verify the conversion
    opened by freekmurze 7
  • Could not create Data: the constructor requires 6 parameters, 5 given when boolean not passed

    Could not create Data: the constructor requires 6 parameters, 5 given when boolean not passed

    Hi there,

    First, love Laravel Data. Thanks 🙏

    I've ran into an issue while testing. Here's my DTO with 6 required attributes:

    class UserRegisterData extends Data
    {
    public function __construct(
            #[Max(50),
            Min(3),
            ]
            public string $firstname,
            public string $lastname,
            #[Unique('accounts'),
            Email('strict')]
            public string $email,
            #[Password(12, true, true, true, true)]
            public string $password,
            #[Size(2)]
            public string $country,
            public bool $optin_news,
        ) {
        }
    }
    

    Then I create my DTO doing

            $data = UserRegisterData::validateAndCreate($input);
    

    If I pass only 5 attributes, like

     [
      "email" => "[email protected]"
      "firstname" => "John"
      "lastname" => "Doe"
      "password" => "&(§jjd==51254AAa"
      "optin_news" => false
    ]
    

    It fails with a 422 error, which is expected behavior.

    But If I don't pass optin_news:

    [
      "firstname" => "John"
      "lastname" => "Doe"
      "email" => "[email protected]"
      "password" => "&(§jjd==51254AAa"
      "country" => "fr"
    ]
    

    I got a 500:

    Could not create `Domain\Shared\DataTransferObjects\UserRegisterData`: the constructor requires 6 parameters, 5 given.Parameters given: firstname, lastname, email, password, country.
    

    I don't get why and how I should do to get a normal validation error when this arg is missing?

    Thanks :)

    opened by HugoHeneault 6
  • prepareForPipeline static method must be implemented in class extending data

    prepareForPipeline static method must be implemented in class extending data

    Hey!

    After the latest update to the laravel-data version 2.0.16, for some reason I need to declare an extra prepareForPiplenie static method.

    Is this a bug or an undocumented breaking change?

    Thanks

    Screenshot 2022-11-27 at 13 59 15

    opened by truesteps 5
  • feat: support multiple date formats

    feat: support multiple date formats

    This PR is the same as https://github.com/spatie/laravel-data/pull/120, except it targets the v2 branch and makes a breaking change by updating the configuration format.

    I realized that when serializing a date, having multiple formats didn't make sense. So I updated the configuration to have a from and to option, where from is an array of supported input date formats, and to the format to which a date will be serialized into.


    Initial PR text:

    This PR adds support for multiple date formats, instead of just one. When working with multiple applications (web front-end, APIs, etc), it's easier to accept multiple instead of requiring a specific one.

    This change is fully backwards-compatible, but allows the date_format configuration option to be an array.

    The DateTimeInterfaceCast will now loop through the configured formats and use the first one that doesn't fail. If all of them fail, it will throw as usual.

    Additionnally, I added the most-commonly used formats as the defaults: ATOM, ISO8601, and Y-m-d H:i:s (the same but without the period).

    Partially related: https://github.com/php/php-src/pull/8322

    opened by innocenzi 5
  • feat: `except` and `excludeWhen`

    feat: `except` and `excludeWhen`

    This PR adds support for conditionally omitting properties from a DTO. Please refer to https://github.com/spatie/laravel-data/discussions/111 for the context. It also partially addresses https://github.com/spatie/laravel-data/discussions/5, and https://github.com/spatie/laravel-data/discussions/84 (v2) since it's on the "consider" list.

    An excludeWhen and an except method have been added through a trait, which makes it possible to either define how to exclude properties conditionnally, or to exclude them at runtime.

    The documentation has been updated too.

    Examples

    Omitting properties conditionally:

    class UserData extends Data
    {
        public function __construct(
            public int $id,
            public string $name,
        ) {
        }
        
        public function excludeWhen(): array
        {
            return [
              'id' => !auth()->user()?->is_admin
            ];
        }
    }
    

    Omitting properties at runtime:

    UserData::from($user)->exclude('id', 'password');
    
    opened by innocenzi 5
  • Allow custom transformers to target Data & DataCollections

    Allow custom transformers to target Data & DataCollections

    I have a use case that I want to use a custom transformer targeting a data class- can we re-order this logic to run the auto data/data collection after looking for custom transformers?

    opened by LukeAbell 5
  • Making methods available in extending class

    Making methods available in extending class

    While I wanted to extend the class and implement the fix for #311 in my own implementation of the class (and DI'ing it), overriding the method, I noticed these functions were defined private, so I was unable access them in my class.

    opened by denjaland 0
  • Handle custom regex validation rule

    Handle custom regex validation rule

    When using custom validation rules with regex and "|" character, we end up with this error message : preg_match(): No ending delimiter '/' found

    in this example, each rule will fail :

    use App\Support\DataTransfertObjects\Data;
    
    class TestData extends Data
    {
        public function __constructor(
            public readonly string $name
            public readonly string $other
        ) {}
    
        public static function rules()
        {
            return [
                'name' => 'required|regex:/test|ok/',
                'other' => ['required', 'regex:/test|ok/']
            ];
        }
    }
    

    This PR add support for regex rule with "|" character. But there is a constraint : users must provide custom rules as array. This is ok :

    [
         'name' => ['required', 'regex:/test|ok/']
    ]
    

    but not this :

    [
         'name' => 'required|regex:/test|ok/'
    ]
    

    That's why i added a note in the documentation.

    opened by VGirol 0
  • Fix https://github.com/spatie/laravel-data/issues/309

    Fix https://github.com/spatie/laravel-data/issues/309

    An attempt to fix the issue described in https://github.com/spatie/laravel-data/issues/309 I'm not really confident that I put the fix in the right place though; maybe it belongs inside the DataClassValidationRulesResolver instead.

    opened by denjaland 0
  • Validation of optional nested Data attribute is impossible

    Validation of optional nested Data attribute is impossible

    Consider a CreateAddressData object defined as follows:

    class CreateAddressData extends Data {
      public function __construct(
        public readonly string $street,
        public readonly string $nbr,
        public readonly string $postal_code,
        public readonly string $city,
        public readonly string $cc
      ) {
      }
    
      public static function rules() {
        return [
          'street' => 'required|min:1|max:80',
          'nbr' => 'required|max:20',  
          'postal_code' => 'required|min:4|max:20',
          'city' => 'required|min:1|max:50',
          'cc' => 'required|size:2',
        ];
      }
    }
    

    And we have a CreatePersonData with the following definition:

    class CreatePersonData extends Data {
      public function __construct(
        public readonly string $first_name,
        public readonly string $last_name,
        public readonly string $email,
        public readonly ?CreateAddressData $address // Please note the address is OPTIONAL
      ) {
      }
    
      public static function rules() {
        return [
          'first_name' => 'required|min:1|max:50',
          'last_name' => 'required|min:1|max:50',
          'email' => 'required|email:rfc',
          'address' => '', // No validation rules for the address, as it's considered optional!
        ];
      }
    

    The idea being that a person can optionally have an address, but when an address is given, the properties are correctly being validated...

    The following code however throws a validation exception saying The address.street field is required. (and 4 more errors):

      CreatePersonData::validate(
        [
          'first_name' => $value,
          'last_name' => fake()->lastName(),
          'email' => fake()->email(),
        ]
      );
    

    Shouldn't the nested data object only be validated when it is required in the containing data object or when it's optional and provided as part of the containing object?

    I haven't checked the code yet (will do asap though), but Im only guessing you are merging the validation rules from the nested objects into the rules array for the containing one, but we should probably loop-validate instead, no?

    opened by denjaland 3
  • Make eloquent collection cast respect collection

    Make eloquent collection cast respect collection

    Having a SlotLoadItem beeing a Data and a SlotLoadCollection beeing a DataCollection, I would expect that defining

    protected $casts = [
            'slots' => SlotLoadCollection::class . ':' . SlotLoadItem::class,
    ];
    

    gives me a SlotLoadCollection when fetching $model->slots. Currently, it gives me a DataCollection.

    This PR fixes it.

    I'm not sure if changing DataCollectionEloquentCast constructor signature is considered as a breaking change but IMHO it should not cause too much trouble.

    opened by bastien-phi 0
Releases(2.2.1)
  • 2.2.1(Dec 21, 2022)

  • 2.2.0(Dec 21, 2022)

    • 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)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Dec 7, 2022)

  • 2.0.16(Nov 18, 2022)

  • 2.0.15(Nov 17, 2022)

  • 2.0.14(Nov 10, 2022)

    • 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)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.13(Oct 14, 2022)

    • 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)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.12(Sep 29, 2022)

  • 2.0.11(Sep 28, 2022)

    • 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)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.10(Sep 7, 2022)

    • Add support for a JsonSerializer
    • Fix generic iterator definition for data collections
    • Fix validation of DataCollection objects not working as expected
    Source code(tar.gz)
    Source code(zip)
  • 2.0.9(Aug 23, 2022)

  • 2.0.8(Aug 18, 2022)

  • 2.0.7(Aug 18, 2022)

  • 2.0.6(Aug 12, 2022)

  • 2.0.5(Aug 10, 2022)

  • 2.0.4(Aug 1, 2022)

  • 2.0.3(Jul 29, 2022)

  • 2.0.2(Jul 29, 2022)

  • 2.0.1(Jul 13, 2022)

    • 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)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Jul 8, 2022)

    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 and except methods on Data and DataCollections
    • Multiple parameter magic methods
    • Optional properties
    • Split DataCollections
    • Better support for TypeScript Transformer
    • And a lot more ...
    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(Jul 8, 2022)

  • 1.5.0(May 25, 2022)

    What's Changed

    • add values() on DataCollection by @Nielsvanpach in https://github.com/spatie/laravel-data/pull/135

    New Contributors

    • @Nielsvanpach made their first contribution in https://github.com/spatie/laravel-data/pull/135

    Full Changelog: https://github.com/spatie/laravel-data/compare/1.4.7...1.5.0

    Source code(tar.gz)
    Source code(zip)
  • 1.4.7(May 16, 2022)

  • 1.4.6(Apr 6, 2022)

  • 1.4.5(Mar 18, 2022)

  • 1.4.4(Mar 18, 2022)

  • 1.4.3(Feb 16, 2022)

    • 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 is null
    Source code(tar.gz)
    Source code(zip)
  • 1.4.2(Jan 26, 2022)

    • 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
    Source code(tar.gz)
    Source code(zip)
  • 1.4.1(Jan 21, 2022)

  • 1.4.0(Jan 20, 2022)

Owner
Spatie
We create open source, digital products and courses for the developer community
Spatie
18Laravel ReactJS Package to simplify sending data from Laravel back-end to front-end built to Facebook ReactJS.

Laravel ReactJS This is a package that we wrote to use on our Laravel applications that use React from Facebook. Our goal is deal with the SEO problem

Cohros 28 Feb 10, 2022
A package for building Admin-Interfaces that help maintaining the data of your applications

A package for building Admin-Interfaces that help maintaining the data of your applications. It provides an intuitive interface and the tools needed to manage your project's Users, Models and free Forms for Pages, Settings etc.

null 808 Dec 31, 2022
Drupal's Typed Data API by example

Drupal's Typed Data API by example This repository aims to help show use cases and various exercises with using Drupal's Typed Data API. The Typed Dat

Matt Glaman 34 Nov 9, 2022
PHP template engine that uses data-attributes and keeps HTML templates valid and clean

Dataplater PHP template engine that uses data-attributes and keeps HTML templates valid and clean. Scroll down to see a usage example. Install compose

Leon 7 Oct 23, 2022
Data providers encapsulate logic for Inertia views, keep your controllers clean and simple.

Laravel Data Providers for Inertia.js Data providers encapsulate logic for Inertia views, keep your controllers clean and simple. Installation We assu

Webfox Developments Ltd 18 Sep 12, 2022
A Laravel Starter Kit for Laravel. Built with Laravel 8.

Laravel Get Started Project Laravel Get Started Project is a basic crud app built with laravel 8. In this app a basic product crud created. Features i

Nazmul Hasan Robin 8 Nov 24, 2022
The Laravel Boilerplate Project - https://laravel-boilerplate.com

Laravel Boilerplate (Current: Laravel 8.*) (Demo) Demo Credentials Admin: [email protected] Password: secret User: [email protected] Password: secret Offici

Anthony Rappa 5.4k Jan 4, 2023
A Laravel 5 package that switchs default Laravel scaffolding/boilerplate to AdminLTE template and Pratt Landing Page with Bootstrap 3.0

AdminLTE template Laravel package A Laravel package that switch default Laravel scaffolding / boilerplate to AdminLTE template with Bootstrap 3.0 and

Sergi Tur Badenas 1.8k Jan 3, 2023
A Laravel Admin Panel (Laravel Version : 6.0)

Laravel Admin Panel (Current: Laravel 7.*) Introduction Laravel Admin Panel provides you with a massive head start on any size web application. It com

ftxinfotech 903 Dec 31, 2022
Laravel Vue SPA, Bulma themed. For demo login use `[email protected]` & `password` -

Laravel Enso Hit the ground running when building your new Laravel SPA project with boilerplate and extra functionality out of the box! click on the p

Laravel Enso 1k Jan 3, 2023
High scalable boilerplate for Laravel - Vue using laravel-mix.

Why use this ? This boilerplate make developer easier to make monolith Laravel project which integrated with Vue.js and vue-router as default front-en

Carvel Saputra Martaloho 5 Sep 21, 2022
Gestor de Contraseñas basado en Laravel 8 + PHP 8 + MySQL 8. Self-hosted Password Manager based on Laravel 8 + PHP 8 + MySQL 8.

English Gestor de Contraseñas Esta aplicación permite una gestión completa de contraseñas para múltiples tipos de servicios (web, ssh, teléfonos, wifi

Lito 134 Jan 2, 2023
Laravel Vue SPA, Bulma themed. For demo login use `[email protected]` & `password` -

Laravel Enso Hit the ground running when building your new Laravel SPA project with boilerplate and extra functionality out of the box! click on the p

Laravel Enso 1k Jan 3, 2023
laravel/ui with auth scaffolding for Laravel 8

Legacy UI Presets with Auth scaffolding for Laravel 8 Introduction This project brings old Auth scaffolding to Laravel 8 for projects that cannot migr

Roger Vilà 56 Jul 17, 2022
Laravel Starter With Laravel, Vite, Vue 2, Inertia.js, Ziggy

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Oskars Germovs 1 Oct 29, 2021
Laravel Starter With Laravel, Vite, Vue 2, Inertia.js, Ziggy, Typescript

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Oskars Germovs 1 Oct 29, 2021
Base Laravel project with React and Laravel Sanctum authentication

About this project This is a base Laravel project with ReactJS frontend and Laravel Sanctum API authentication. You could read more about here. Instal

David Toth 8 Oct 25, 2022
Laravel and AngularJS Starter Application Boilerplate featuring Laravel 5.3 and AngularJS 1.5.8

?? Zemke/starter-laravel-angular has been upgraded to AngularJS 1.5.8. ?? Zemke/starter-laravel-angular has been upgraded to Laravel 5.3. You can pull

Florian Zemke 372 Nov 21, 2022