blast/facades

Minimize complexity and represent dependencies as facades.

1.0 2015-10-22 17:05 UTC

README

Latest Version on Packagist Software License Build Status Total Downloads Coverage Status

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.