All Projects → jenssegers → Lean

jenssegers / Lean

Use the PHP League's Container package with auto-wiring support as the core container in Slim 3

Projects that are alternatives of or similar to Lean

Marvelheroes
❤️ A sample Marvel heroes application based on MVVM (ViewModel, Coroutines, LiveData, Room, Repository, Koin) architecture.
Stars: ✭ 826 (+2653.33%)
Mutual labels:  dependency-injection
Snowball
Android Clean Code Sample Project
Stars: ✭ 26 (-13.33%)
Mutual labels:  dependency-injection
Codewif
An Android framework that provides in-app testing
Stars: ✭ 15 (-50%)
Mutual labels:  dependency-injection
Inject.dart
Compile-time dependency injection for Dart and Flutter
Stars: ✭ 833 (+2676.67%)
Mutual labels:  dependency-injection
Kodein Mvvm
Example app using Kodein for dependency injection with MVVM and Architecture Components
Stars: ✭ 26 (-13.33%)
Mutual labels:  dependency-injection
Anakin
This Node module maps all application's dependencies and centralizes everything, at only one place
Stars: ✭ 8 (-73.33%)
Mutual labels:  dependency-injection
Koin
Koin - a pragmatic lightweight dependency injection framework for Kotlin
Stars: ✭ 7,142 (+23706.67%)
Mutual labels:  dependency-injection
Spring Depend
Tool for getting a spring bean dependency graph
Stars: ✭ 28 (-6.67%)
Mutual labels:  dependency-injection
Swiftresolver
Dependency injection framework for Swift
Stars: ✭ 26 (-13.33%)
Mutual labels:  dependency-injection
Inji
a dependency inject container for golang (golang inject), objects will be closed on a reverse order of their creation
Stars: ✭ 13 (-56.67%)
Mutual labels:  dependency-injection
Inherited builder
🤖Autogenerated state management and dependency injection with inherited widgets
Stars: ✭ 17 (-43.33%)
Mutual labels:  dependency-injection
Koa Typeorm Starter
Starter project for using koa with TS and TypeORM
Stars: ✭ 23 (-23.33%)
Mutual labels:  dependency-injection
Laravelyaml
Laravel ServiceProvider for using YAML configuration files
Stars: ✭ 8 (-73.33%)
Mutual labels:  dependency-injection
Framework
MomentPHP | The PHP mini-framework based on Slim and Laravel Components
Stars: ✭ 6 (-80%)
Mutual labels:  slim
Mydi
moved to https://github.com/cekta/di
Stars: ✭ 21 (-30%)
Mutual labels:  dependency-injection
Di
Dependency Injection and IoC framework for PHP
Stars: ✭ 5 (-83.33%)
Mutual labels:  dependency-injection
Lld Parking Lot
Repository for low level design solution of parking lot
Stars: ✭ 27 (-10%)
Mutual labels:  dependency-injection
Servicemanager
🔌 Most basic implementation of dependency injection container for JavaScript
Stars: ✭ 29 (-3.33%)
Mutual labels:  dependency-injection
Alki
Dependency Injection for Ruby
Stars: ✭ 27 (-10%)
Mutual labels:  dependency-injection
Mcp Panthor
A thin PHP microframework built on Slim and Symfony
Stars: ✭ 11 (-63.33%)
Mutual labels:  slim

Lean

Latest Stable Version Build Status Coverage Status

Lean allows you to use the PHP League's Container package with auto-wiring support as the core container in Slim 3.

Install

Via Composer

$ composer require jenssegers/lean

Usage

The easiest way to start using Lean is simply creating a Jenssegers\Lean\App instance:

require 'vendor/autoload.php';

$app = new \Jenssegers\Lean\App();

$app->get('/hello/{name}', function (Request $request, Response $response, string $name) {
    return $response->write('Hello, ' . $name);
});

$app->run();

Behind the scenes, a Slim application is bootstrapped by adding all of the required Slim components to League's container.

Service Providers

Service providers give the benefit of organising your container definitions along with an increase in performance for larger applications as definitions registered within a service provider are lazily registered at the point where a service is retrieved.

To build a service provider it is as simple as extending the base service provider and defining what you would like to register.

use League\Container\ServiceProvider\AbstractServiceProvider;

class SomeServiceProvider extends AbstractServiceProvider
{
    /**
     * The provided array is a way to let the container
     * know that a service is provided by this service
     * provider. Every service that is registered via
     * this service provider must have an alias added
     * to this array or it will be ignored.
     */
    protected $provides = [
        SomeInterface::class,
    ];

    /**
     * This is where the magic happens, within the method you can
     * access the container and register or retrieve anything
     * that you need to, but remember, every alias registered
     * within this method must be declared in the `$provides` array.
     */
    public function register()
    {
        $this->getContainer()
            ->add(SomeInterface::class, SomeImplementation::class);
    }
}

To register this service provider with the container simply pass an instance of your provider or a fully qualified class name to the League\Container\Container::addServiceProvider method.

$app = new \Jenssegers\Lean\App();
$app->getContainer()->addServiceProvider(\Acme\ServiceProvider\SomeServiceProvider::class);

Read more about service providers here.

Settings

You can access Slim's internal configuration through the settings key on the container:

$app = new \Jenssegers\Lean\App();

$app->getContainer()->get('settings')['displayErrorDetails'] = true;

Alternatively, an alias is registered that allows a bit more fluent way of working with settings:

$app = new \Jenssegers\Lean\App();

$app->getContainer()->get(\Slim\Settings::class)->set('displayErrorDetails', true);

Read more about the available configuration options here.

Route arguments

By default, Lean will use method injection to pass arguments to your routes. This allows you to type-hint dependencies on method level (similar to the Laravel framework).

Route arguments will be passed as individual arguments to your method:

$app->get('/books/{id}', function (Request $request, Response $response, string $id) {
    ...
});

They are also accessible through the getAttribute method.

$app->get('/books/{id}', function (Request $request, Response $response) {
    $id = $request->getAttribute('id');
    ....
});

If you want to disable this behaviour and use the default Slim way of route arguments, you can disable this feature be setting methodInjection to false:

$app->getContainer()->get(\Slim\Settings::class)->set('methodInjection', false);

Read more about routes here.

Error Handlers

By default, Lean uses Slim's error handlers. There are different ways to implement an error handler for Slim, read more about them here.

Typically you would create a custom error handler class that looks like this:

class CustomErrorHandler
{
    public function __invoke(ServerRequestInterface $request, Response $response, Throwable $exception)
    {
        return $response->withJson([
            'error' => 'Something went wrong',
        ], 500);
    }
}

Then you overwrite the default handler by adding it to the container:

$app = new Jenssegers\Lean\App();

$app->getContainer()->share('errorHandler', function () {
    return new CustomErrorHandler();
});

Ideally, you would put this code inside a service provider. Read more about service providers above.

Testing

$ php ./vendor/bin/phpunit

License

The MIT License (MIT).

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].