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.
Via Composer
$ composer require blast/facades
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);
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
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.
<?php
use Acme\Facades\Service;
//is returning the service instance
$service = Service::__instance();
<?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.
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();
Please see CHANGELOG for more information what has changed recently.
$ composer test
Please see CONTRIBUTING for details.
If you discover any security related issues, please email :author_email instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.