Coder Social home page Coder Social logo

easy-container's Introduction

A simple dependency injecting container from laravel.

styleci passed easy-container Latest Stable Version Total Downloads License

Why

Currently more popular php container:

Pimple is a simple and excellent php 5.3 container, which is also the most used service container, and the installed capacity of packagist is also up to 1000W+ .But Pimple just a simple service container that does not support many features such as:

class Cache
{
    public function __construct(Config $config){}
}

class Config
{
}

// not support
$cache = $container->make('Cache');

Pimple Does not support the automatic injection of dependency parameters, when you need to rely on other objects object, you can only instantiate the required parameters.

Laravel Container is the most full-featured service container, including auto-injection, load-loading, alias, TAG, and so so. But the official does not recommend using the component in non-laravel project.

If you have noticed the composer.json file under that component,You will find that he depends on the illuminate/contracts component.(see also)

Based on this, easy-container was born, and the project code relied heavily on Laravel Container πŸ˜„ πŸ˜„ . You can use it like a Laravel Container container.

Install

SDK Version PHP Version Composer Command
3.x >= 8.1 composer require "easy-container:^3.0"
2.x >= 7.2 composer require "easy-container:^2.1"
1.x >= 5.6 composer require "easy-container:^2.1"

Use

You can get more help with container usage at laravel.com.

Initialize the container.

$app = new Godruoyi\Container\Container;

The following documents support from laravel.com, reproduced please indicate the source.

Simple Bindings

We can register a binding using the bind method, passing the class or interface name that we wish to register along with a Closure that returns an instance of the class:

$app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

Note,All anonymous functions accept the service container instance as a parameter.

Binding A Singleton

The singleton method binds a class or interface into the container that should only be resolved one time. Once a singleton binding is resolved, the same object instance will be returned on subsequent calls into the container:

$app->singleton('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

Each time you call $app['HelpSpot\API'] will return the same object.

Binding A Singleton

The singleton method binds a class or interface into the container that should only be resolved one time. Once a singleton binding is resolved, the same object instance will be returned on subsequent calls into the container:

$api = new HelpSpot\API(new HttpClient);

$app->instance('HelpSpot\API', $api);

Binding Interfaces To Implementations

A very powerful feature of the service container is its ability to bind an interface to a given implementation. For example, let's assume we have an EventPusher interface and a RedisEventPusher implementation. Once we have coded our RedisEventPusher implementation of this interface, we can register it with the service container like so:

$app->bind(
    'App\Contracts\EventPusher',
    'App\Services\RedisEventPusher'
);

This statement tells the container that it should inject the RedisEventPusher when a class needs an implementation of EventPusher. Now we can type-hint the EventPusher interface in a constructor, or any other location where dependencies are injected by the service container:

use App\Contracts\EventPusher;

/**
 * Create a new instance of the class, which will be injected into the App\Services\RedisEventPusher instance.
 *
 * @param  EventPusher  $pusher
 * @return void
 */
public function __construct(EventPusher $pusher)
{
    $this->pusher = $pusher;
}

Resolving

The make Method

You may use the make method to resolve a class instance out of the container(regardless of what type of parameter the object needs). The make method accepts the name of the class or interface you wish to resolve:

$api = $app->make('HelpSpot\API');

The mark method is the most important method I think of,You can simply use the "type prompt" way to add dependencies,the container will automatically parse all the parameters you need.

// Automatically parses the dependencies required by the UserController constructor
$userController = $app->make(UserController::class);

class UserController
{
    public function __construct(UserRepository $users, HttpClient $client, $other = 'default')
    {
    }
}

PSR-11

Laravel's service container implements the PSR-11 interface. Therefore, you may type-hint the PSR-11 container interface to obtain an instance of the Laravel container:

use Psr\Container\ContainerInterface;

$service = $app->get('Service');

LISTEN

MIT

Thanks

laravel-china

easy-container's People

Contributors

godruoyi avatar sunl888 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

easy-container's Issues

Support psr/container 2.0

🐜 php -v
PHP 8.2.6 (cli) (built: May 11 2023 12:51:38) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.6, Copyright (c), by Zend Technologies


🐜 ./vendor/bin/phpunit
PHPUnit 10.2.3 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.6
Configuration: phpunit.xml

PHP Fatal error:  Declaration of Godruoyi\Container\Container::has($id) must be compatible with Psr\Container\ContainerInterface::has(string $id): bool in src/Container.php on line 101

Fatal error: Declaration of Godruoyi\Container\Container::has($id) must be compatible with Psr\Container\ContainerInterface::has(string $id): bool in src/Container.php on line 101

We plan to separate the versions, which is more conducive to future updates and maintenance. If your PHP version < 7.2, we recommend that you install version ^1.0. We will create a new version 2.0 for PHP >= 7.2.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.