blast / facades
Minimize complexity and represent dependencies as facades.
Installs: 128 473
Dependents: 4
Suggesters: 0
Security: 0
Stars: 7
Watchers: 1
Forks: 3
Open Issues: 5
Requires
- php: >=5.5.0
- container-interop/container-interop: ^1.1
Requires (Dev)
- league/container: ~2.0
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2024-11-09 19:29:49 UTC
README
Blast facades is aiming to minimize complexity and represent dependencies as generic facades. This package is part of Blast component collection.
This package is compliant with PSR-1, PSR-2 and PSR-4. If you notice compliance oversights, please send a patch via pull request.
This package is also supporting container-interop (PSR-11) and all container packages which are using container-interop.
Install
Via Composer
$ composer require blast/facades
Usage
Initialize
First of all we need to tell FacadeFactory which container instance should be used. We could use thephpleague/container for example:
A bootstrap is looking like this:
<?php use Blast\Facades\FacadeFactory; use League\Container\Container; $container = new Container(); FacadeFactory::setContainer($container);
Dealing with dependencies
We need to register a service to our container, for example with league/container.
There are several ways to now register this service with the container.
For a better transparency and design we recommend to pass an Interface or Contract FQCN as service id.
<?php //add our service $container->add('Acme\Service', 'Acme\Service\SomeService'); //returns an instance of Acme\Service\SomeService $container->get('Acme\Service');
or
<?php //add our service $container->add('Acme\Service\SomeService'); //returns an instance of Acme\Service\SomeService $container->get('Acme\Service\SomeService');
or
<?php //returns an instance of Acme\Service\SomeService without registration $container->get('Acme\Service\SomeService');
for more information please read league/container documentation
Creating and using a facade
A Facade should be an instance of AbstractFacade and should provide an accessor.
The accessor is the service identifier. It will be used to fetch the service in the container (via Interop\Container\ContainerInterface::get($accessor)
.
<?php namespace Acme\Facades\Service; use Blast\Facades\AbstractFacade; use Acme\Service; class Service extends AbstractFacade { protected static function accessor() { return Acme\Service::class; } }
We could now call serivce methods from our facade, or the service instance itself.
Calling service instance
<?php use Acme\Facades\Service; //is returning the service instance $service = Service::__instance();
Calling service methods
<?php use Acme\Facades\Service; Service::someMethod();
or
<?php use Acme\Facades\Service; //is returning the service instance $service = Service::__instance(); $service->someMethod();
or
<?php use Acme\Facades\Service; forward_static_call([Service::class, 'someMethod']);
or
<?php use Acme\Facades\Service; call_user_func(sprintf('%s::%s', Service::class, 'someMethod'));
You are also able to pass arguments. The method call itself is behaving like the call of original class.
Instance swaping
Sometimes service will be replaced by another service. As long as the service id is not changing, we don't need to modify anything in our facade.
<?php use Acme\Facades\Service; //add a service $container->add('Acme\Service', 'Acme\Service\SomeService'); //is returning the service instance Acme\Service\SomeService $service = Service::__instance(); //replace a service with another one $container->add('Acme\Service', 'Acme\Service\AnotherService'); //is now returning the service instance Acme\Service\AnotherService $service = Service::__instance();
Supporting projects
Projects using ContainerInterface
Change log
Please see CHANGELOG for more information what has changed recently.
Testing
$ composer test
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security related issues, please email :author_email instead of using the issue tracker.
Credits
Special thanks
License
The MIT License (MIT). Please see License File for more information.