oktopost / skeleton
Inversion of Control library
Installs: 3 811
Dependents: 12
Suggesters: 0
Security: 0
Stars: 0
Watchers: 12
Forks: 0
Open Issues: 1
Requires
- php: >=8.1
- unstable-cacao/traitor: ^2.0.1
Requires (Dev)
- oktopost/unit-cover: ^1.0
- phpunit/phpunit: ^8.1
README
Skeleton
Latest version 1.2.0
Skeleton is an Inversion of Control (IoC) Library for PHP 7.1 or higher.
Installation
composer require oktopost/skeleton
or inside composer.json
"require": { "oktopost/skeleton": "^1.0" }
Basic Usage Example:
// src/Proj/Base/IUserDAO.php interface IUserDAO { public function load($id); } // src/Proj/DAO/UserDAO.php class UserDAO implements IUserDAO { public function load($id) { // ... } } // skeleton-config.php $skeleton = new \Skeleton\Skeleton(); $skeleton->set(Proj\Base\IUserDAO::class, Proj\DAO\UserDAO::class); // or $skeleton->set("Using any string as key", Proj\DAO\UserDAO::class); // Obtaining a new instance using $service = $skeleton->get(Proj\DAO\IUserDAO::class); // or $service = $skeleton->get("Using any string as key");
In this case, $service will be set to a new instance of the UserDAO class that was created by Skeleton.
Autoloading class
Given the following setup:
// src/Proj/Base/IUserDAO.php interface IUserDAO {} // src/Proj/Base/IUserService.php interface IUserService {} // src/Proj/DAO/UserDAO.php class UserDAO implements IUserDAO {} // skeleton-config.php $skeleton = new \Skeleton\Skeleton(); $skeleton->set(Proj\Base\IUserDAO::class, Proj\DAO\UserDAO::class); $skeleton->set(Proj\Base\IUserService::class, Proj\Service\UserService::class);
Instance of UserService may be obtained without autoloading using:
// src/Proj/Service/UserService.php class UserService implements IUserService { public function setUserDAO(IUserDAO $dao) { } } $instance = $skeleton->get(IUserService::class); $instance->setUserDAO($skeleton->get(IUserDAO::class));
But with autoloading you can omit the call to setUserDAO using one of the following.
Using setter methods autolaoding
// skeleton-config.php $skeleton->enableKnot(); // src/Proj/Service/UserService.php /** * @autoload */ class UserService implements IUserService { /** * @autoload * Method must start with the word "set", have only one parameter and the @autoload annotation. * Private and protected methods will be also autoloaded. */ public function setUserDAO(IUserDAO $dao) { } } // example.php $instance = $skeleton->get(IUserService::class);
Using data member autoloading.
// skeleton-config.php $skeleton->enableKnot(); // src/Proj/Service/UserService.php /** * @autoload */ class UserService implements IUserService { /** * @autoload * @var \Full\Path\To\IUserDAO * Important: Full path must be defined under the @var annotation. */ private $dao; } // example.php $instance = $skeleton->get(IUserService::class);
Using __construct autoloading.
In this case the autoload annotation is not required for the class name nor for the __construct method.
// skeleton-config.php $skeleton->enableKnot(); // src/Proj/Service/UserService.php class UserService implements IUserService { public function __construct(IUserDAO $dao) { } } // example.php $instance = $skeleton->get(IUserService::class);