A convenient way to initialize your application

Overview

A convenient way to initialize your application.

Latest Stable Version Build Status Code Style Status Code Coverage Status Quality Score Quality Score Software License

Introduction

We all know, that every application should contain readme file and Installation section with list of actions that you should to do for preparing an application to work.

Typical instruction:

  • install dependencies
  • run migrations
  • publish assets
  • compiling app assets
  • make cron job for scheduler
  • etc.

Some of actions you should do on every application update (composer update, git pull...) or branch change (git checkout) for preparing an application to work.

Laravel Initializer gives you the ability to declare these processes and run it by simple app:install and app:update artisan commands, which run predefined actions chain depending on the current environment.

Also app:update command could simplify your deploy script in Forge, Envoy.blade.php, laravel-deployer, bash script etc.

With Laravel Initializer you keep both of these processes in the source control.

Put a knowledge of application initialization process into the right place

Installation

Via Composer

composer require mad-web/laravel-initializer

then publish initializer classes:

php artisan vendor:publish --tag=initializers

It will create Install and Update classes in app directory which contains local and production methods according to different environments. This methods should return runner chain with specific actions to install or update processes.

You can override config key which stores current environment value, publish config file and set env_config_key value.

php artisan vendor:publish --provider="MadWeb\Initializer\InitializerServiceProvider" --tag=config

by default value is set to app.env for laravel, in most cases you don't need to override this value.

Usage

Usage of app:install and app:update command are the same except that app:install uses Install class and app:update uses Update class.

Install class contents:

namespace App;

use MadWeb\Initializer\Contracts\Runner;

class Install
{
    public function production(Runner $run)
    {
        $run->external('composer', 'install', '--no-dev', '--prefer-dist', '--optimize-autoloader')
            ->artisan('key:generate')
            ->artisan('migrate', ['--force' => true])
            ->artisan('storage:link')
//            ->dispatch(new MakeCronTask)
            ->external('npm', 'install', '--production')
            ->external('npm', 'run', 'production')
            ->artisan('route:cache')
            ->artisan('config:cache')
            ->artisan('event:cache');
    }

    public function local(Runner $run)
    {
        $run->external('composer', 'install')
            ->artisan('key:generate')
            ->artisan('migrate')
            ->artisan('storage:link')
            ->external('npm', 'install')
            ->external('npm', 'run', 'development');
    }
}

Update class contents:

namespace App;

use MadWeb\Initializer\Contracts\Runner;

class Update
{
    public function production(Runner $run)
    {
        $run->external('composer', 'install', '--no-dev', '--prefer-dist', '--optimize-autoloader')
            ->external('npm', 'install', '--production')
            ->external('npm', 'run', 'production')
            ->artisan('route:cache')
            ->artisan('config:cache')
            ->artisan('event:cache')
            ->artisan('migrate', ['--force' => true])
            ->artisan('cache:clear')
            ->artisan('queue:restart'); // ->artisan('horizon:terminate');
    }

    public function local(Runner $run)
    {
        $run->external('composer', 'install')
            ->external('npm', 'install')
            ->external('npm', 'run', 'development')
            ->artisan('migrate')
            ->artisan('cache:clear');
    }
}

You can add any other method which should have the same name as your environment name, for example staging, and define different actions.

If you need to run actions with root privileges separately, you can define a method according to the following convention:

namespace App;

use MadWeb\Initializer\Contracts\Runner;
use MadWeb\Initializer\Jobs\Supervisor\MakeQueueSupervisorConfig;
use MadWeb\Initializer\Jobs\Supervisor\MakeSocketSupervisorConfig;

class Install
{
    public function production(Runner $run) { ... }

    public function productionRoot(Runner $run)
    {
        $run->dispatch(new MakeQueueSupervisorConfig)
            ->dispatch(new MakeSocketSupervisorConfig)
            ->external('supervisorctl', 'reread')
            ->external('supervisorctl', 'update');
    }
}

Run it by passing "root" option:

artisan app:install --root

To see details of running actions use verbosity mode:

php artisan app:update -v

You can inject any service from service container in constructor:

class Update
{
    public function __construct(Filesystem $storage)
    {
        $this->storage = $storage;
    }
    // ...
}

If you want to move config classes from the app directory to a different place, rebind app.installer and app.updater keys of service container in the AppServiceProvider.

$this->app->bind('app.installer', \AnotherNamespace\Install::class);
$this->app->bind('app.updater', \AnotherNamespace\Update::class);

Runner API (available actions to run)

$run
    ->artisan('command', ['argument' => 'argument_value', '-param' => 'param_value', '--option' => 'option_value', ...]) // Artisan command
    ->external('command', 'argument', '-param', 'param_value', '--option=option_value', ...) // Any external command by arguments
    ->external('command argument -param param_value --option=option_value') // Any external command by string
    ->callable(function ($arg) {}, $arg) // Callable function (like for call_user_func)
    ->dispatch(new JobClass) // Dispatch job task
    ->dispatchNow(new JobClass) // Dispatch job task without queue
    ->publish(ServiceProvider::class) // Publish single service provider assets
    ->publish([
        ServiceProvider::class,
        AnotherServiceProvider::class,
    ]) // Publish multiple packages assets
    ->publish([ServiceProvider::class => 'public']) // Publish package assets with tag
    ->publish([ServiceProvider::class => ['public', 'assets']]) // Publish package assets with multiple tags
    ->publishForce(ServiceProvider::class) // Force publish, works in any variations
    ->publishTag('public') // Publish specific tag
    ->publishTag(['public', 'assets']) // Publish multiple tags
    ->publishTagForce('public') // Force publish tags

Laravel Nova

If you use Laravel Nova, don't forget to publish Nova assets on each update:

// Update class
$run
    ...
    ->artisan('nova:publish')
    // or
    ->publishTag('nova-assets')

Useful jobs

Laravel initializer provides some useful jobs to make initializing of your application much easier.

Create cron task for scheduling tasks

To enable Laravel Scheduling add dispatch MakeCronTask job to runner chain to create cron task for your application.

$run
    ...
    ->dispatch(new \MadWeb\Initializer\Jobs\MakeCronTask)

This job will add

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

to crontab list.

Create laravel-echo-server.json config file

If you use Laravel Echo Server for broadcasting events in your application, add dispatch MakeEchoServerConfig job to runner chain to create configuration file.

$run
    ...
    ->dispatch(new \MadWeb\Initializer\Jobs\MakeEchoServerConfig);

It will create configuration file with default options of laravel-echo-server and prefilled values from your laravel application configuration.

You can override default value by passing array into the job constructor. It would be a good practice to create additional config value for laravel-echo-server in broadcasting.php config:

/*
|--------------------------------------------------------------------------
| Laravel Echo server configurations
|--------------------------------------------------------------------------
|
| Here you may define all of laravel echo server options
|
*/
'server' => [
    'authEndpoint' => '/broadcasting/auth',
    'port' => env('SOCKET_PORT', '6001'),
    'sslCertPath' => env('SSL_CERT', ''),
    'sslKeyPath' => env('SSL_PATH', '')
],

And pass these values to MakeEchoServerConfig job constructor.

$run
    ...
    ->dispatch(new \MadWeb\Initializer\Jobs\MakeEchoServerConfig(config('broadcasting.server')));

Create supervisor config file for queues

This job creates supervisor config file for queue workers. Add dispatch MakeQueueSupervisorConfig job to runner chain.

$run
    ...
    ->dispatch(new \MadWeb\Initializer\Jobs\Supervisor\MakeQueueSupervisorConfig);

This job creates configuration file with the command php artisan queue:work --sleep=3 --tries=3 in /etc/supervisor/conf.d/ folder by default, with a filename according to this convention your-application-name-queue.conf.

If you want to override default options, pass it into job constructor. For example if you want to use Laravel Horizon instead of default queue workers.

$run
    ...
    ->dispatch(new \MadWeb\Initializer\Jobs\Supervisor\MakeQueueSupervisorConfig([
        'command' => 'php artisan horizon',
    ]));

Create supervisor config file for laravel echo server

On the same way as MakeQueueSupervisorConfig job, you can use MakeSocketSupervisorConfig to create supervisor config file for launching laravel echo server. The difference from MakeQueueSupervisorConfig is the command node ./node_modules/.bin/laravel-echo-server start and the config filename is your-application-name-socket.conf.

Both config files save log files to your-app-path/storage/logs.

Installation by one command

For running php artisan app:install command, you should install composer dependencies at first. It would be nice to have the ability to install an application by one command. We provide nice hack to implement this behavior.

Add app-install script into scripts section in composer.json.

"scripts": {
    "app-install": [
        "@composer install",
        "@php artisan app:install"
    ],
}

Then you can run just

composer app-install

to initialize your application.

If your application has actions that require root privileges and you use Unix based system, add the following command into your runner chain:

public function production(Runner $run)
{
    $run->artisan(...)
        ...
        ->external('sudo', 'php', 'artisan', 'app:install', '--root');
}

public function productionRoot(Runner $run) { ... }

Safe Update

In cases when latest changes has been pulled from source control and some functionality of currently not installed package is used in one of a Service Provider you will get an error. To prevent this issue you should make composer install at first, to simplify this process you can define app-update script:

"scripts": {
    "app-update": [
        "@composer install",
        "@php artisan app:update"
    ],
},

Then you can run:

composer app-update

Upgrading

Please see UPGRADING for details.

Changelog

Please see CHANGELOG for more information what has changed recently.

Testing

composer test

Contributing

Please see CONTRIBUTING and CONDUCT for details.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Credits

Thanks Nuno Maduro for laravel-console-task package which gives pretty tasks outputs

License

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

Comments
  • Fixed errors message.

    Fixed errors message.

    Signed-off-by: Dmitry Mazurov [email protected]

    Description

    Fixed errors message.

    Motivation and context

    These changes fix the error if after installation they did not execute config: cache. It also corrects an error if getErrorOutput is empty, but there is an error.

    How has this been tested?

    Please describe in detail how you tested your changes.

    Include details of your testing environment, and the tests you ran to see how your change affects other areas of the code, etc.

    Screenshots (if appropriate)

    Снимок экрана 2020-01-20 в 14 49 55 Снимок экрана 2020-01-20 в 14 45 11

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [x] I have read the CONTRIBUTING document.
    • [x] My pull request addresses exactly one patch/feature.
    • [x] I have created a branch for this patch/feature.
    • [x] Each individual commit in the pull request is meaningful.
    • [x] I have added tests to cover my changes.
    • [x] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by dima-bzz 7
  • Fixing not being able to install on Laravel 7

    Fixing not being able to install on Laravel 7

    Description

    Updating the symfony process version and fixing any related breaking changes.

    Motivation and context

    Tried to install this on a Laravel 7 project and couldn't because the symfony process version was too low (4.* and Laravel 7 requires 5.*).

    How has this been tested?

    Used the phpunit tests you've already written to prove the upgrade was successful.

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [x] I have read the CONTRIBUTING document.
    • [x] My pull request addresses exactly one patch/feature.
    • [x] I have created a branch for this patch/feature.
    • [x] Each individual commit in the pull request is meaningful.
    • [x] I have added tests to cover my changes.
      • Didn't add any extra tests as the current suite was sufficient to prove everything was working as expected.
    • [x] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by CWDN 4
  • Laravel 9.x Compatibility

    Laravel 9.x Compatibility

    This is an automated pull request from Shift to update your package code and dependencies to be compatible with Laravel 9.x.

    Before merging, you need to:

    • Checkout the l9-compatibility branch
    • Review all comments for additional changes
    • Thoroughly test your package

    If you do find an issue, please report it by commenting on this PR to help improve future automation.

    opened by laravel-shift 3
  • Fixed bug if getErrorOutput () is empty, but $ exitCode> 0

    Fixed bug if getErrorOutput () is empty, but $ exitCode> 0

    Signed-off-by: Dmitry Mazurov [email protected]

    Description

    Fixed bug if getErrorOutput () is empty, but $ exitCode> 0

    Motivation and context

    If the command fails and the error code is greater than 0, and the result $ Process-> getErrorOutput () is empty, an error will appear. This is manifested if you run the program from outside the root.

    How has this been tested?

    Ubuntu 18.04 PHP 7.2.24 Laravel 6.11.0

    Screenshots (if appropriate)

    Снимок экрана 2020-01-20 в 14 49 55

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [x] I have read the CONTRIBUTING document.
    • [x] My pull request addresses exactly one patch/feature.
    • [x] I have created a branch for this patch/feature.
    • [x] Each individual commit in the pull request is meaningful.
    • [ ] I have added tests to cover my changes.
    • [x] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by dima-bzz 2
  • Added custom options.

    Added custom options.

    Signed-off-by: Dmitry Mazurov [email protected]

    Description

    Added custom options.

    Motivation and context

    This is a new feature that adds the ability to specify arbitrary options.

    How has this been tested?

    Ubuntu 18.04 Php 7.2.24 Laravel 6.11.0

    Screenshots (if appropriate)

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [ ] Bug fix (non-breaking change which fixes an issue)
    • [x] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [x] I have read the CONTRIBUTING document.
    • [x] My pull request addresses exactly one patch/feature.
    • [x] I have created a branch for this patch/feature.
    • [x] Each individual commit in the pull request is meaningful.
    • [ ] I have added tests to cover my changes.
    • [x] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by dima-bzz 2
  • Update README.md

    Update README.md

    Markdown and typo fix :)

    Description

    Describe your changes in detail.

    Motivation and context

    Why is this change required? What problem does it solve?

    If it fixes an open issue, please link to the issue here (if you write fixes #num or closes #num, the issue will be automatically closed when the pull is accepted.)

    How has this been tested?

    Please describe in detail how you tested your changes.

    Include details of your testing environment, and the tests you ran to see how your change affects other areas of the code, etc.

    Screenshots (if appropriate)

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [ ] I have read the CONTRIBUTING document.
    • [ ] My pull request addresses exactly one patch/feature.
    • [ ] I have created a branch for this patch/feature.
    • [ ] Each individual commit in the pull request is meaningful.
    • [ ] I have added tests to cover my changes.
    • [ ] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by LasseRafn 2
  • Add support for Laravel 8

    Add support for Laravel 8

    Description

    Fix #19 Upgrade composer constraints allowing Laravel 8 usage

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    • [ ] Bug fix

    • [x] New feature

    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    • [x] My pull request addresses exactly one patch/feature.

    • [ ] I have added tests to cover my changes.

    • [ ] If my change requires a change to the documentation, I have updated it accordingly.

    opened by klimov-paul 1
  • [HOTFIX] errorMessage can return NULL as well

    [HOTFIX] errorMessage can return NULL as well

    Description

    Fixes #17

    This is important if Update.php contains $run->artisan('down');: When app is already down $errorMessage remains NULL and app:update breaks with an exception.

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    • [x] Bug fix

    • [ ] New feature

    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    • [x] My pull request addresses exactly one patch/feature.

    • [ ] I have added tests to cover my changes.

    • [ ] If my change requires a change to the documentation, I have updated it accordingly.

    opened by kosmonowt 1
  • Return value of MadWeb\Initializer\Actions\Action::errorMessage() must be of the type string, null returned

    Return value of MadWeb\Initializer\Actions\Action::errorMessage() must be of the type string, null returned

    • Laravel Version: 7.6.1
    • Laravel Initializer Version: 3.1.0
    • PHP Version: 7.4.x

    Description:

    local.ERROR: Return value of MadWeb\Initializer\Actions\Action::errorMessage() must be of the type string, null returned {"exception":"[object] (TypeError(code: 0): Return value of MadWeb\\Initializer\\Actions\\Action::errorMessage() must be of the type string, null returned at /Library/WebServer/Documents/myproject/vendor/mad-web/laravel-initializer/src/Actions/Action.php:50)
    [stacktrace]
    #0 /Library/WebServer/Documents/myproject/vendor/mad-web/laravel-initializer/src/Run.php(36): MadWeb\\Initializer\\Actions\\Action->errorMessage()
    #1 /Library/WebServer/Documents/myproject/vendor/mad-web/laravel-initializer/src/Run.php(49): MadWeb\\Initializer\\Run->run(Object(MadWeb\\Initializer\\Actions\\Artisan))
    #2 /Library/WebServer/Documents/myproject/app/Update.php(31): MadWeb\\Initializer\\Run->artisan('down')
    

    Steps To Reproduce:

    1. Manually run php artisan down
    2. Create Update.php including $run->artisan("down");
    3. Run php artisan app:update
    4. ...
    5. 🎉 app:update process failing with error above.

    Suggestions:

    • I will give a hotfix attached to this issue.
    • Please accept my pull request with an updated Action.php that at least doesn't make some continuous deployments crash every now and then.
    • Later on, you may see if you can find another solution that handles those kinds of exception, maybe by handling down and up explicitly in your Artisan.php.
    opened by kosmonowt 1
  • Wrong Composer command

    Wrong Composer command

    Description

    The update script should run composer update instead of composer install.

    Motivation and context

    The install script already runs the composer install command.

    opened by Bux666 1
  • Set config for different Laravel Structure

    Set config for different Laravel Structure

    Description

    Provide an option to change default classes

    Motivation and context

    When the project structure is not default, Like https://github.com/Mahmoudz/Porto

    How has this been tested?

    Executing commands to install and update

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [ ] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [ ] I have read the CONTRIBUTING document.
    • [ ] My pull request addresses exactly one patch/feature.
    • [ ] I have created a branch for this patch/feature.
    • [ ] Each individual commit in the pull request is meaningful.
    • [ ] I have added tests to cover my changes.
    • [ ] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by rdehnhardt 0
  • Options new

    Options new

    Description

    Added custom options.

    Motivation and context

    This is a new feature that adds the ability to specify arbitrary options.

    How has this been tested?

    Please describe in detail how you tested your changes.

    Ubuntu 18.04 Php 7.2.24 Laravel 6.11.0

    Screenshots (if appropriate)

    Types of changes

    What types of changes does your code introduce? Put an x in all the boxes that apply:

    • [ ] Bug fix (non-breaking change which fixes an issue)
    • [x] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    Go over all the following points, and put an x in all the boxes that apply.

    Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our continuous integration server to make sure your tests and code style pass.

    • [x] I have read the CONTRIBUTING document.
    • [x] My pull request addresses exactly one patch/feature.
    • [x] I have created a branch for this patch/feature.
    • [x] Each individual commit in the pull request is meaningful.
    • [x] I have added tests to cover my changes.
    • [x] If my change requires a change to the documentation, I have updated it accordingly.

    If you're unsure about any of these, don't hesitate to ask. We're here to help!

    opened by dima-bzz 0
Releases(3.4.0)
Owner
Mad Web
Modern Web Development squad.
Mad Web
This package provides convenient methods for making token code, sending and verifying mobile phone verification requests.

Laravel Mobile Verification Introduction Many web applications require users to verify their mobile phone numbers before using the application. Rather

M.Fouladgar 347 Dec 25, 2022
Convenient tool for speeding up the intern/officer review process.

icpc-app-screen Convenient tool for speeding up the intern/officer applicant review process. Eliminates the pain from reading application responses of

null 1 Oct 30, 2021
A convenient helper for using the laravel-seo package with Filament Admin and Forms

Combine the power of Laravel SEO and Filament PHP. This package is a convenient helper for using the laravel-seo package with Filament Admin and Forms

Ralph J. Smit 39 Dec 21, 2022
Localization Helper - Package for convenient work with Laravel's localization features and fast language files generation

Localization Helper Package for convenient work with Laravel's localization features and fast language files generation. Installation Via Composer $ c

Galymzhan Begimov 0 Jul 13, 2019
Laravel-tagmanager - An easier way to add Google Tag Manager to your Laravel application.

Laravel TagManager An easier way to add Google Tag Manager to your Laravel application. Including recommended GTM events support. Requirements Laravel

Label84 16 Nov 23, 2022
Laravel Logable is a simple way to log http request in your Laravel application.

Laravel Logable is a simple way to log http request in your Laravel application. Requirements php >= 7.4 Laravel version >= 6.0 Installation composer

Sagar 6 Aug 25, 2022
Easy Way to integrate API in you laravel application.

Easy Api Easy Way to integrate API in you laravel application. Installation Guide Install Package using Composer. composer require flutterbuddy1/easy-

Mayank Diwakar 1 Oct 9, 2022
Laravel Breadcrumbs - An easy way to add breadcrumbs to your @Laravel app.

Introduction Breadcrumbs display a list of links indicating the position of the current page in the whole site hierarchy. For example, breadcrumbs lik

Alexandr Chernyaev 269 Dec 21, 2022
Laravel Boilerplate provides a very flexible and extensible way of building your custom Laravel applications.

Laravel Boilerplate Project Laravel Boilerplate provides a very flexible and extensible way of building your custom Laravel applications. Table of Con

Labs64 848 Dec 28, 2022
An easy way to add colors in your CLI scripts.

COLORS Here is a preview of what you can achieve with the library: Installation Installation via composer is highly recommended. { "require": {

Kevin Le Brun 335 Dec 4, 2022
Kalibrant - a package that provides a simple way to manage your models settings

Introduction For your laravel 9.x applications, Kalibrant is a package that provides a simple way to manage your models settings. It is a simple way t

Starfolk 3 Jun 18, 2022
Modularize your laravel app in a package way.

Laravel Modular Pustaka laravel untuk modularisasi kode secara rapi dan mudah di maintain. Instalasi $ composer require kodepandai/laravel-modular Set

Kode Pandai 3 Jun 19, 2022
This package aims to help you standardize all your API responses in a simple and structured way.

Laravel API Response This package aims to help you standardize all your API responses in a simple and structured way. By default, the stucture of the

Kode Pandai 6 Dec 6, 2022
Automatically load your helpers in your laravel application.

Laravel AutoHelpers Automatically load your helpers in your laravel application. Installation You can install the package via composer: composer requi

Florian Wartner 6 Jul 26, 2021
An Eloquent Way To Filter Laravel Models And Their Relationships

Eloquent Filter An Eloquent way to filter Eloquent Models and their relationships Introduction Lets say we want to return a list of users filtered by

Eric Tucker 1.5k Jan 7, 2023
Handle all the hard stuff related to EU MOSS tax/vat regulations, the way it should be.

VatCalculator Handle all the hard stuff related to EU MOSS tax/vat regulations, the way it should be. Integrates with Laravel and Cashier — or in a st

Dries Vints 1.1k Jan 5, 2023
Save Model is a Laravel package that allows you to save data in the database in a new way.

Save Model is a Laravel package that allows you to save data in the database in a new way. No need to worry about $guarded and $fillable properties in the model anymore. Just relax an use Save Model package.

Laratips 27 Mar 2, 2022
A Laravel package to manage versions of endpoints in an elegant way

API version control A Laravel package to manage versions of endpoints in an elegant way Two ways to manage the versions of your endpoints Option 1: Ve

Reindert 156 Dec 9, 2022
Laravel Serializable Closure provides an easy way to serialize closures in PHP.

Serializable Closure Introduction This package is a work in progress Laravel Serializable Closure provides an easy way to serialize closures in PHP. I

The Laravel Framework 316 Jan 1, 2023