The Lucid Architecture for Scalable Laravel Applications.

Overview

Documentation Slack Chat Build Status Latest Stable Version License


Table of Contents

About Lucid

Lucid is a software architecture to build scalable Laravel projects. It incorporates Command Bus and Domain Driven Design at the core, upon which it builds a stack of directories and classes to organize business logic. It also derives from SOA (Service Oriented Architecture) the notion of encapsulating functionality within a service and enriches the concept with more than the service being a class.

Use Lucid to:

  • Write clean code effortlessly
  • Protect your code from deterioriting over time
  • Review code in fractions of the time typically required
  • Incorporate proven practices and patterns in your applications
  • Navigate code and move between codebases without feeling astranged

Concept

This architecture is in an amalgamation of best practices, design patterns and proven methods.

  • Command Bus: to dispatch units of work. In Lucid terminology these units will be a Feature, Job or Operation.
  • Domain Driven Design: to organize the units of work by categorizing them according to the topic they belong to.
  • Service Oriented Architecture: to encapsulate and manage functionalities of the same purpose with their required resources (routes, controllers, views, datatbase migrations etc.)

If you prefer a video, watch the announcement at Laracon EU 2016:


Table of Contents

Position

In a typical MVC application, Lucid will be the bond between the application's entrypoints and the units that do the work, securing code form meandring in drastic directions:

Lucid MVC Position

The Stack

At a glance...

Lucid Stack

Framework

Provides the "kernel" to do the heavy lifting of the tedious stuff such as request/response lifecycle, dependency injection, and other core functionalities.

Foundation

Extends the framework to provide higher level abstractions that are custom to the application and can be shared across the entire stack rather than being case-specific.

Examples of what could go into foundation are:

  • DateTime a support class for common date and time functions
  • JsonSerializableInterface that is used to identify an object to be serializable from and to JSON format

Domains

Provide separation to categorize jobs and corresponding classes that belong to the same topic. A domain operates in isolation from other domains and exposes its functionalities to features and operations through Lucid jobs only.

Consider the structure below for an example on what a domain may look like:

app/Domains/GitHub
├── GitHubClient
├── Jobs
│   ├── FetchGitHubRepoInfoJob
│   └── LoginWithGitHubJob
├── Exceptions
│   ├── InvalidTokenException
│   └── RepositoryNotFoundException
└── Tests
    └── GitHubClientTest
    └── Jobs
        ├── FetchGitHubReposJobTest
        └── LoginWithGitHubJobTest

documentation contains more details on working with domains.

Services

Are directories rich in functionality, used to separate a [Monolith]({{<ref "/micro-vs-monolith/#monolith">}}) into areas of focus in a multi-purpose application.

Consider the example of an application where we enter food recipes and would want our members to have discussions in a forum, we would have two services: 1) Kitchen, 2) Forum where the kitchen would manage all that's related to recipes, and forum is obvious:

app/Services
├── Forum
└── Kitchen

and following is a single service's structure, highlighted are the Lucid specific directories:

app/Services/Forum
├── Console
│   └── Commands
├── Features
├── Operations
├── Http
│   ├── Controllers
│   └── Middleware
├── Providers
│   ├── KitchenServiceProvider
│   ├── BroadcastServiceProvider
│   └── RouteServiceProvider
├── Tests
│   └── Features
│   └── Operations
├── database
│   ├── factories
│   ├── migrations
│   └── seeds
├── resources
│   ├── lang
│   └── views
└── routes
    ├── api
    ├── channels
    ├── console
    └── web

documentation has more examples of services and their contents.

Features

Represent a human-readable application feature in a class. It contains the logic that implements the feature but with the least amount of detail, by running jobs from domains and operations at the application or service level.

Serving the Feature class will be the only line in a controller's method (in MVC), consequently achieving the thinnest form of controllers.

class AddRecipeFeature extends Feature
{
    public function handle(AddRecipe $request)
    {
        $price = $this->run(CalculateRecipePriceOperation::class, [
            'ingredients' => $request->input('ingredients'),
        ]);

        $this->run(SaveRecipeJob::class, [
            'price' => $price,
            'user' => Auth::user(),
            'title' => $request->input('title'),
            'ingredients' => $request->input('ingredients'),
            'instructions' => $request->input('instructions'),
        ]);

        return $this->run(RedirectBackJob::class);
    }
}

documentation about features expands on how to serve them as classes from anywhere.

Operations

Their purpose is to increase the degree of code reusability by piecing jobs together to provide composite functionalities from across domains.

class NotifySubscribersOperation extends Operation
{
    private int $authorId;

    public function __construct(int $authorId)
    {
        $this->authorId = $authorId;
    }

    /**
     * Sends notifications to subscribers.
     *
     * @return int Number of notification jobs enqueued.
     */
    public function handle(): int
    {
        $author = $this->run(GetAuthorByIDJob::class, [
            'id' => $this->authorId,
        ]);

        do {

            $result = $this->run(PaginateSubscribersJob::class, [
                'authorId' => $this->authorId,
            ]);

            if ($result->subscribers->isNotEmpty()) {
                // it's a queueable job so it will be enqueued, no waiting time
                $this->run(SendNotificationJob::class, [
                    'from' => $author,
                    'to' => $result->subscribers,
                    'notification' => 'article.published',
                ]);
            }

        } while ($result->hasMorePages());

        return $result->total;
    }
}

documentation goes over this simple yet powerful concept.

Data

For a scalable set of interconnected data elements, we've created a place for them in app/Data, because most likely over time writing the application there could develop a need for more than Models in data, such as Repositories, Value Objects, Collections and more.

app/Data
├── Models
├── Values
├── Collections
└── Repositories

Benefits

There are valuable advantages to what may seem as overengineering.

Organization

  • Predictable impact of changes on the system when reviewing code
  • Reduced debugging time since we’re dividing our application into isolated areas of focus (divide and conquer)
  • With Monolith, each of our services can have their own versioning system (e.g. Api service is at v1 while Chat is at v2.3 yet reside) yet reside in the same codebase

Reuse & Replace

By dissecting our application into small building blocks of code - a.k.a units - we've instantly opened the door for a high degree of code sharing across the application with Data and Domains, as well as replaceability with the least amount of friction and technical debt.

Boundaries

By setting boundaries you would've taken a step towards proetcting application code from growing unbearably large and made it easier for new devs to onboard. Most importantly, that you've reduced technical debt to the minimum so that you don't have to pay with bugs and sleepless nights; code doesn't run on good intentions nor wishes.

Multitenancy

When our application scales we'd typically have a bunch of instances of it running in different locations, at some point we would want to activate certain parts of our codebase in some areas and shut off others.

Here’s a humble example of running Api, Back Office and Web App instances of the same application, which in Lucid terminology are services that share functionality through data and domains:

Lucid multitenancy

Contribute

Bug & Issue Reports

To encourage active collaboration, Lucid strongly encourages contribution through pull requests. "Bug reports" may be searched or created in issues or sent in the form of a pull request containing a failing test or steps to reproduce the bug.

If you file a bug report, your issue should contain a title and a clear description of the issue. You should also include as much relevant information as possible and a code sample that demonstrates the issue. The goal of a bug report is to make it easy for yourself - and others - to replicate the bug and develop a fix.

PRs and issues are usually checked about three times a week so there is a high chance yours will be picked up soon.

The Lucid Architecture source code is on GitHub as lucidarch/lucid.

Support Questions

Lucid Architecture's GitHub issue trackers are not intended to provide help or support. Instead, use one of the following channels:

  • Discussions is where most conversations takes place
  • For a chat hit us on our official Slack workspace in the #support channel
  • If you prefer StackOverflow to post your questions you may use #lucidarch to tag them

Core Development Discussion

You may propose new features or improvements of existing Lucid Architecture behaviour in the Lucid Discussins. If you propose a new feature, please be willing to implement at least some of the code that would be needed to complete the feature, or collaborate on active ideation in the meantime.

Informal discussion regarding bugs, new features, and implementation of existing features takes place in the #internals channel of the Lucid Slack workspace. Abed Halawi, the maintainer of Lucid, is typically present in the channel on weekdays from 8am-5pm EEST (Eastern European Summer Time), and sporadically present in the channel at other times.

Which Branch? And How To Contribute

The main branch is what contains the latest live version and is the one that gets released.

  • Fork this repository
  • Clone the forked repository to where you'll edit your code
  • Create a branch for your edits (e.g. feature/queueable-units, fix/issue-31)
  • Commit your changes and their tests (if applicable) with meaningful short messages
  • Push your branch git push origin feature/queueable-units
  • Open a PR to the main branch, which will run tests for your edits

PRs and issues are usually checked about three times a week.

Setup for Development

Following are the steps to setup for development on Lucid:

Assuming we're in ~/dev directory...

  • Clone the forked repository [your username]/lucid which will create a lucid folder at ~/dev/lucid
  • Create a Laravel project to test your implementation in it composer create-project laravel/laravel myproject
  • Connect the created Laravel project to the local Lucid installation; in the Laravel project's composer.json
    "require": {
        "...": "",
        "lucidarch/lucid": "@dev"
    },
    "repositories": [
        {
            "type": "path",
            "url": "~/dev/lucid",
            "options": {
                "symlink": true
            }
        }
    ],
    "minimum-stability": "dev",

Make sure you change the url to the absolute path of your directory

  • Run composer update to create the symlink

Now all your changes in the lucid directory will take effect automatically in the project.

Security Vulnerabilities

If you discover a security vulnerability within Lucid, please send an email to Abed Halawi at [email protected]. All security vulnerabilities will be promptly addressed.

Coding Style

Lucid Architecture follows the PSR-2 coding standard and the PSR-4 autoloading standard.

PHPDoc

Below is an example of a valid Lucid Architecture documentation block. Note that the @param attribute is followed by two spaces, the argument type, two more spaces, and finally the variable name:

/**
 * Register a binding with the container.
 *
 * @param  string|array  $abstract
 * @param  \Closure|string|null  $concrete
 * @param  bool  $shared
 * @return void
 *
 * @throws \Exception
 */
public function bind($abstract, $concrete = null, $shared = false)
{
    //
}

Code of Conduct

The Lucid Architecture code of conduct is derived from the Laravel code of conduct. Any violations of the code of conduct may be reported to Abed Halawi ([email protected]):

  • Participants will be tolerant of opposing views.
  • Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.
  • When interpreting the words and actions of others, participants should always assume good intentions.
  • Behavior that can be reasonably considered harassment will not be tolerated.
Comments
  • Issue creating a service on Monolith

    Issue creating a service on Monolith

    After installing composer require lucidarch/lucid and initializing lucid init:monolith, creating a service lucid make:service Web display an error.

    App namespace not set in composer.json ....\vendor\lucidarch\lucid\src\Finder.php at 143

    But seems like the service is generated though.

    image

    bug 
    opened by undjike 8
  • Updated test matrix to current versions

    Updated test matrix to current versions

    Test matrix uses a couple of very old version. I left Laravel 6.x und 7x in it, altough they are out of support.

    But you should consider dropping support for PHP < 8.0 and <Laravel 8

    opened by kohlerdominik 3
  • Factories / Seeders in Service deprecated?

    Factories / Seeders in Service deprecated?

    Is it deprecated to make factories and seeders in services? There's no command for making them for a service and since factories and seeders have namespaces now, it would require registering them in the service's provider which is ALSO not being done.

    I feel like it should be properly decided and updated whether services should have separate database folders or share the laravel project's and maybe just have folders there.

    opened by ghost 1
  • How to handle a feature that has related jobs

    How to handle a feature that has related jobs

    The architecture seems incredible to me. I'm going to start using it. Thanks for the input. After reading the documentation I have doubts in relation to the characteristics. I am on the example of creating an article. I want to divide the process of creating an article into 4 jobs:

    1. Validate data
    2. Upload image to an amazon bucket
    3. Save the post
    4. Return the answer

    Suppose that step 1 and 2 are executed worse when reaching three an error occurs, you would have to make a rollback of step 2 and delete the uploaded file.

    Question 1: Would I have to make a job run if one of these steps cannot be created, something like DeleteImageJob? Question 2: How would you execute an Eloquent transaction in this process?

    Again, congratulations on the job. Greetings

    opened by yanielbf 1
  • Wrong service provider mentioned in the documentation

    Wrong service provider mentioned in the documentation

    In the service structure example under the "Concept -> Services" you defined the wrong service provider. Instead of KitchenServiceProvider, you should define ForumServiceProvider.

     app/Services/Forum
    ├── Console
    │   └── Commands
    ├── Features
    ├── Operations
    ├── Http
    │   ├── Controllers
    │   └── Middleware
    ├── Providers
    │   ├── KitchenServiceProvider <- should be ForumServiceProvider
    ...
    

    Under the "Concept -> Organization -> Last point" there is a duplicated phrase "yet reside".


    There is a typo under the "Concept -> Boundaries". Word "proetcting" should become "protecting".

    opened by apps-in-progress 1
  • Calling a job from another service

    Calling a job from another service

    I am trying to write an application with micro service using lucid. However I have quite a problem getting which code I need to put in the job from a Service that call a job from another service.

    Do I need to repeat the same code or is there something to writte inside it that send it directly to the queue?

    Sorry by advance if the question seems stupid but I didn't found my answer by reading the documentation.

    opened by CrochetFeve0251 0
  • Handling exception

    Handling exception

    Hello, what do you recommend for handling exceptions in function or operation? I think I should launch it at Job and capture in the Features, Operation Or Controller, but I don't know if it is recommended. Can you give me a suggestion?

    opened by cgsauy 0
  • How to use Livewire with Lucid

    How to use Livewire with Lucid

    Hello,

    I want use Livewire with Lucid. But I don't know implement it. Can you suggest me with any guide for it.

    Thank you so much

    I see it in https://github.com/lucidarch/lucid/discussions

    opened by tuannda 0
  • Resolve units using Service Container

    Resolve units using Service Container

    By leveraging Laravel Service Container, we should be able to:

    • type-hint dependencies like Request in a constructor and have them injected automatically
    • swap a unit instance with a mock for more flexible testing

    The solution is backward-compatible.

    Notes: currently, a generic exception Unable to map {parameter} to {command} is thrown when incorrect arguments to a unit constructor are provided. This PR removes that exception in favor of Laravel BindingResolutionException

    enhancement 
    opened by IlliaBalia 0
  • (Custom) stubs

    (Custom) stubs

    I am making stubs as I want to include a copyright tag in each file and because I am migrating from PHPunit to PEST and want to change the test stubs to use PEST. I have made stubs in the stubs directory and Artisan recognises them but Lucid doesn't (E.G model.stub). I have looked into the source code and see that Lucid only reads its own stubs, could it be changed so that it also reads from the stubs folder?

    opened by TeaDrinkingProgrammer 2
  • Features not working with Laravel 9

    Features not working with Laravel 9

    Hi, when calling $this->serve(new AbcFeature()); this error occurs:

    Illegal offset type in isset or empty
    

    In file vendor / laravel / framework / src / Illuminate / Container / Container.php : 1285

    error

    I tried with trait Lucid\Bus\ServesFeatures and with controller Lucid\Units\Controller, both ways produce the error.

    Feature alone works:

    new AbcFeature(); // ok
    (new AbcFeature())->handle(); // ok
    

    PHP 8.1.3 Laravel 9.16.0

    opened by misog 1
  • Deprecated code on `lucid init:micro`

    Deprecated code on `lucid init:micro`

    PHP 8.1, Laravel 9

    I just added Lucid to my project and ran lucid init:micro and got this:

    Initializing Lucid Micro for Laravel 9.0.0
    
    Created directories:
    /app/Data
    /app/Domains
    /app/Features
    /app/Operations
    /app/Data/Models
    /tests/Domains
    /tests/Operations
    PHP Deprecated:  str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /var/www/html/vendor/laravel/
    framework/src/Illuminate/Support/Str.php on line 637
    
    Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /var/www/html/vendor/laravel/frame
    work/src/Illuminate/Support/Str.php on line 637
    
    You're all set to build something awesome that scales!
    
    Here are some examples to get you started:
    
    You may wish to start with a feature
    lucid make:feature LoginUser
    will generate app/Features/LoginUserFeature.php
    
    Or a job to do a single thing
    lucid make:job GetUserByEmail User
    will generate app/Domains/User/Jobs/GetUserByEmailJob.php
    
    For more Job examples check out Lucid's built-in jobs:
    - Lucid\Domains\Http\Jobs\RespondWithJsonJob
    for consistent JSON structure responses.
    
    - Lucid\Domains\Http\Jobs\RespondWithJsonErrorJob
    for consistent JSON error responses.
    
    - Lucid\Domains\Http\Jobs\RespondWithViewJob
    basic view and data response functionality.
    
    Finally you can group multiple jobs in an operation
    lucid make:operation ProcessUserLogin
    will generate app/Operations/ProcessUserLoginOperation.php
    
    For more details, help yourself with the docs at https://docs.lucidarch.dev
    
    Remember to enjoy the journey.
    Cheers!
    
    opened by cweagans 4
Releases(v1.0.11)
  • v1.0.11(Apr 13, 2022)

    Added

    • Support unit instances with mocks

    We can now mock unit instances that are written with the new PHP syntax the same as we did with the previous class string syntax:

    $repo = $this->run(new GetGitHubRepoJob(id: $repoId, withReleases: false));
    
    GetGitHubRepoJob::mock([
      'id' => 'some-id-here',
      'withReleases' => false,
    ])->shouldReturn($sampleRepo);
    
    Source code(tar.gz)
    Source code(zip)
  • v1.0.10(Dec 17, 2021)

  • v1.0.9(Dec 16, 2021)

    Changed

    • UnitDispatcher::run's signature changed to use mixed for $unit to help IDEs tolerate passing instances instead of strings only; best used for named parameters in PHP 8
    • use full Lang & View facades namespaces in service providers for Laravel 8
    Source code(tar.gz)
    Source code(zip)
  • v1.0.8(Oct 24, 2021)

  • v1.0.7(Oct 24, 2021)

  • v1.0.6(Sep 21, 2021)

    Fixed

    • Service database seeders directory name: was seeds now it's seeders similar to Laravel's. e.g. app/Services/Chat/database/seeders

    Added

    • Readme: ToC & contribution guide
    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(Sep 20, 2021)

    Fixed

    • Generating Feature tests in their correct location tests/Feature/Services/{service}/*FeatureTest.php & tests/Feature/*FeatureTest.php
    Source code(tar.gz)
    Source code(zip)
  • v1.0.4(May 10, 2021)

    Changed

    • Services in migrations are now optional. It is possible to call lucid migrate with no arguments which acts the same as Laravel's. Thanks to #22 @Batisska
    • Resolve units using the app container within the dispatcher (features, jobs, operations). Thanks to #17 @IlliaBalia

    Fixed

    • CI test paths
    Source code(tar.gz)
    Source code(zip)
  • v1.0.3(Jan 1, 2021)

    Changed

    1. Tests will no longer be located away from the root tests directory, and will be distributed to tests/Feature and tests/Unit

    | Unit | From | To | |-----------|-----------------------------------------------------|------------------------------------------------------| | Feature | tests/Features/*Test.php | tests/Feature/*Test.php | | | app/Services/<service>/Tests/*Test.php | tests/Feature/Services/<service>/*Test.php | | Operation | tests/Operations/*Test.php | tests/Unit/Operations/*Test.php | | | app/Services/<service>/Tests/Operations/*Test.php | tests/Unit/Services/<service>/Operations/*Test.php | | Job | app/Domains/<domain>/Tests/Jobs/*Test.php | tests/Unit/Domains/<domain>/Jobs/*Test.php |

    1. Use proper namespaces for test files starting with Tests\... instead of App\..\Tests\...

    Fixed

    • Default test method names are generated using Str::snake instead of mb_strtolower (test_someawesomefeature -> test_some_awesome_feature for a feature called SomeAwesomeFeature)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Dec 10, 2020)

  • v1.0.1(Dec 8, 2020)

  • v1.0.0(Dec 3, 2020)

    The good news is that it isn't anything at the core, the concept is exactly the same, in fact none of Lucid's principles has changed ever since; this release is about aesthetics, documentation, online presence, contribution and community.

    Here are the highlights at a glance:

    Changed

    • GitHub's organization name from lucid-architecture to lucidarch, redirects will happen for a while though
    • Following the new alias lucidarch, the Composer package in vendor will follow suite to become lucidarch instead of lucid-arch previously
    • Job tests that are automatically generated when calling lucid make:job will be placed in app/Domains/{domain}/Tests/Jobs/ in both variants for consistency (previously only in Monolith)
    • FormRequest classes are generated in domains when calling lucid make:request, which required a change in signature and now requires specifying the domain name lucid make:request <request> <domain>
    • JobDispatcherTrait removed in favour of UnitDispatcher trait which will be the only trait required, in contrast with a couple other traits previously required to turn a class into a unit dispatcher
    • The dashboard is temporarily deprecated and will undergo a rewrite using modern technologies. Will also be separated into its own package to allow requiring on demand and in dev dependencies if needed. Also, its features will be rethought for a richer set for more added value
    • Boilerplates will be deprecated (laravel and laravel-microservice) in favour of lucidarch/lucid package.
    • Console and Foundation repositories are also deprecated and have been merged and restructured into the package.
    • Contributors' contributions. Sorry about that everyone! Sadly there is no way to move contributor's attribution to the new repo.
    • The concept is now described much better on the website https://lucidarch.dev/concept than previously described in the original post on Medium. Which also has been dropped as the source for Lucid knowledge base in favour of dev.to/lucidarch.

    Added

    • UnitDispatcher trait that allows any class to become a unit dispatcher to run jobs and operations. Just use it and you're good to go!
    • Adoption of FormRequest classes as a default validation mechanism instead of validation jobs, which is still possible in custom cases that require it. See validation docs for more
    • init:micro command to initialize a Micro instance into Laravel
    • init:monolith command to initialize a Monolith instance into Laravel
    • Documentation at https://docs.lucidarch.dev which source is in the docs repo
    • Website at https://lucidarch.dev which source is in the site repo
    Source code(tar.gz)
    Source code(zip)
Owner
Lucid
The Lucid Architecture for Scalable Laravel Applications
Lucid
FFCMS 3 version core MVC architecture. Build-on use with ffcms main architecture builder.

FFCMS 3 version core MVC architecture. Build-on use with ffcms main architecture builder.

FFCMS 0 Feb 25, 2022
Test and enforce architectural rules in your Laravel applications. Keep your app's architecture clean and consistent!

Laravel Arkitect Laravel Arkitect lets you test and enforce your architectural rules in your Laravel applications, and it's a PHPArkitect wrapper for

SMorteza Ebadi 55 Dec 17, 2022
Orkestra is a library of infrastructure and architecture helpers for creating CQRS applications

Orkestra Orkestra is an opinionated framework with a plethora of recommendations on architectural design that we use internally at Morebec to develop

Morébec 2 Aug 18, 2021
my personal example of Laravel clean architecture

what is this repo about Clean Architect Laravel ###run we assume docker desktop is up and running open up a terminal cd project directory run "cp .env

Sadegh Salari 37 Dec 23, 2022
Production ready scalable Magento setup utilizing the docker

Magento docker image Requirements This docker image expects 2 other linked containers to work . Mysqldb or Mariadb linked as 'db' Memcached linked as

Paim pozhil 49 Jun 21, 2021
Scalable and durable data imports for publishing and consuming APIs

Porter Scalable and durable data imports for publishing and consuming APIs Porter is the all-purpose PHP data importer. She fetches data from anywhere

null 596 Jan 6, 2023
A simple but scalable FFA Practice Core featuring one Game Mode & Vasar PvP aspects.

A simple but scalable FFA Practice Core featuring one Game Mode & Vasar PvP aspects. An example of this Plugin can be found in-game at ganja.bet:19132!

null 6 Dec 7, 2022
Detect flaws in your architecture, before they drag you down into the depths of dependency hell ...

Detect flaws in your architecture before they drag you down into the depths of dependency hell ... What it does System Requirements Installation Phive

Michael Haeuslmann 507 Dec 27, 2022
POC d'un projet Clean Architecture + DDD

Proof Of Concept - Clean Architecture & DDD Installation Dans un premier temps, cloner le repository : git clone https://github.com/TBoileau/rse cd rs

Thomas Boileau 11 Sep 3, 2022
🐘 🎯 Hexagonal Architecture, DDD & CQRS in PHP

?? ?? Hexagonal Architecture, DDD & CQRS in PHP Example of a PHP application using Domain-Driven Design (DDD) and Command Query Responsibility Segrega

CodelyTV 2.5k Jan 6, 2023
A research raw data repository for researchers of Arba Minch University built using Codeigniter which follows MVC architecture. The front-end is build using Bootstrap.

Arba Minch University Dataset Repository This system is a research dataset repository for Arba Minch University researchers and is build using Codeign

Wuletaw Wonte 8 Jul 1, 2022
Dockerise Symfony Application (Symfony 6 + Clean Architecture+ DDD+ CQRS + Docker + Xdebug + PHPUnit + Doctrine ORM + JWT Auth + Static analysis)

Symfony Dockerise Symfony Application Install Docker Install Docker Compose Docker PHP & Nginx Create Symfony Application Debugging Install Xdebug Con

null 48 Jan 5, 2023
A Symfony project made with DDD, CQRS and Hexagonal Architecture

Symfony Blog DDD + CQRS + Hexagonal Architecture A Symfony blog project made with CQRS, Hexagonal Architecture and DDD Docker integration This project

null 5 Aug 10, 2022
Because every Wedding RSVP website needs to follow DDD, CQRS, Hexagonal Architecture, Event Sourcing, and be deployed on Lambda.

Our Wedding Website Because every Wedding RSVP website needs to follow DDD, CQRS, Hexagonal Architecture, Event Sourcing, and be deployed on Lambda. ?

Edd Mann 3 Aug 21, 2022
Clean Architecture, DDD and CQRS using Symfony 6

Task manager system using Clean Architecture, DDD and CQRS. Environment setup Install Docker Clone the project: git clone https://github.com/k0t9i/Tas

null 3 Sep 5, 2022
Ecotone Framework is Service Bus Implementation. It enables message driven architecture and DDD, CQRS, Event Sourcing PHP

This is Read Only Repository To contribute make use of Ecotone-Dev repository. Ecotone is Service Bus Implementation, which enables message driven arc

EcotoneFramework 308 Dec 29, 2022
A @laravel based RAD platform for back-office applications, admin/user panels, and dashboards.

For the full documentation, visit orchid.software. Introduction Orchid is a free Laravel package that abstracts standard business logic and allows cod

Laravel Orchid 3.4k Jan 7, 2023
This pacakge provides an easy connection to the Open Brewery DB project for PHP and Laravel applications.

Laravel Openbrewerydb API This pacakge provides an easy connection to the Open Brewery DB project for PHP and Laravel applications. About Open Brewery

Alex Justesen 1 Oct 4, 2022
PPM is a process manager, supercharger and load balancer for modern PHP applications.

PPM - PHP Process Manager PHP-PM is a process manager, supercharger and load balancer for PHP applications. It's based on ReactPHP and works best with

PPM - PHP Process Manager 6.5k Jan 3, 2023