initial commit
This commit is contained in:
commit
1fc7fd5553
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 meta-tech.academy
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
90
README.md
Normal file
90
README.md
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
|
||||||
|
# MetaTech\Silex\ControllerServiceProvider
|
||||||
|
|
||||||
|
A service provider for [ Silex ](http://silex.sensiolabs.org) for managing DI and mounting on controllers.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
PHP 7.0
|
||||||
|
|
||||||
|
### Install
|
||||||
|
|
||||||
|
The package can be installed using [ Composer ](https://getcomposer.org/). (not yet)
|
||||||
|
```
|
||||||
|
composer require meta-tech/silex-controller-service
|
||||||
|
```
|
||||||
|
|
||||||
|
Or add the package to your `composer.json`.
|
||||||
|
|
||||||
|
```
|
||||||
|
"require": {
|
||||||
|
"meta-tech/silex-controller-service" : "1.0"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The provider will create a service relative to a Controller instance builded with its dependencies.
|
||||||
|
If the controller implements the `Silex\Api\ControllerProviderInterface` the provider will also
|
||||||
|
mount the controller 's routes to the defined routing entry point
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Admit you have a controller Test with dependencies on instanciation :
|
||||||
|
|
||||||
|
```php
|
||||||
|
class Test implements ControllerProviderInterface
|
||||||
|
{
|
||||||
|
public function __construct(Application $app)
|
||||||
|
{
|
||||||
|
// do stuff
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can use the ControllerServiceProvider to create a service to manage your
|
||||||
|
controller class instanciation :
|
||||||
|
|
||||||
|
```php
|
||||||
|
|
||||||
|
use MetaTech\Silex\Provider\ControllerServiceProvider;
|
||||||
|
use Acme\Ctrl\Test;
|
||||||
|
...
|
||||||
|
|
||||||
|
$app->register(new ControllerServiceProvider(Test::class, [$app], '/test', 'ctrl.'));
|
||||||
|
|
||||||
|
```
|
||||||
|
**first parameter** is your *controller class*
|
||||||
|
**second parameter** is an array of your *controller depencies*
|
||||||
|
**third parameter** define your controller *routing entry point*
|
||||||
|
**fouth parameter** define your *service 's namespace* to acces your controller (default ctrl.)
|
||||||
|
|
||||||
|
the name of the registering service is the *given namespace* followed by your *controller class shortname*
|
||||||
|
|
||||||
|
with the previous example `$app['ctrl.Test']` is now available and return your controller instance.
|
||||||
|
|
||||||
|
the `connect` method of your controller can now benefits of this service to define appropriate routes, like that :
|
||||||
|
|
||||||
|
```php
|
||||||
|
class Test implements ControllerProviderInterface
|
||||||
|
{
|
||||||
|
...
|
||||||
|
|
||||||
|
public function connect(Application $app)
|
||||||
|
{
|
||||||
|
$collection = $app['controllers_factory'];
|
||||||
|
$_ = 'ctrl.Test';
|
||||||
|
|
||||||
|
$collection->match('/' , "$_:index");
|
||||||
|
$collection->match('/test', "$_:test");
|
||||||
|
|
||||||
|
return $collection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
see source code of `MetaTech\Core\Ws` for an advance controller architecture.
|
||||||
|
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
The project is released under the MIT license, see the LICENSE file.
|
23
composer.json
Normal file
23
composer.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"name" : "meta-tech/silex-controller-service",
|
||||||
|
"type" : "library",
|
||||||
|
"homepage" : "https://github.com/meta-tech/silex-controller-service",
|
||||||
|
"description" : "Controller service for Silex.",
|
||||||
|
"license" : "MIT",
|
||||||
|
"authors" : [
|
||||||
|
{
|
||||||
|
"name" : "a-Sansara",
|
||||||
|
"homepage" : "https://github.com/a-sansara/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"keywords" : ["Silex", "Controller", "Service", "Provider"],
|
||||||
|
"autoload" : {
|
||||||
|
"psr-4" : {
|
||||||
|
"" : "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require" : {
|
||||||
|
"php" : "^7.0",
|
||||||
|
"pimple/pimple" : "~3.0"
|
||||||
|
}
|
||||||
|
}
|
69
src/MetaTech/Silex/Provider/ControllerServiceProvider.php
Normal file
69
src/MetaTech/Silex/Provider/ControllerServiceProvider.php
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
namespace MetaTech\Silex\Provider;
|
||||||
|
|
||||||
|
use Pimple\Container;
|
||||||
|
use Pimple\ServiceProviderInterface;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @package MetaTech\Silex\Provider
|
||||||
|
* @class ControllerServiceProvider
|
||||||
|
* @implements Pimple\ServiceProviderInterface
|
||||||
|
* @author a-Sansara
|
||||||
|
* @date 2017-03-13 16:40:56 CET
|
||||||
|
*/
|
||||||
|
class ControllerServiceProvider implements ServiceProviderInterface
|
||||||
|
{
|
||||||
|
/*! @private @var str $name */
|
||||||
|
private $name;
|
||||||
|
/*! @private @var str $ns */
|
||||||
|
private $ns;
|
||||||
|
/*! @private @var str $route */
|
||||||
|
private $route;
|
||||||
|
/*! @private @var [mixed] $args */
|
||||||
|
private $args;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ControllerServiceProvider constructor
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @public
|
||||||
|
* @param str $class a controller class
|
||||||
|
* @param [mixed] $args controller arguments
|
||||||
|
* @param str $route controller entry point
|
||||||
|
* @param str $namespace controller service namespace in application
|
||||||
|
*/
|
||||||
|
public function __construct($class, $args=[], $route=null, $namespace='ctrl.')
|
||||||
|
{
|
||||||
|
if (class_exists($class)) {
|
||||||
|
$this->name = $class;
|
||||||
|
$this->ns = $namespace . (new \ReflectionClass($class))->getShortName();
|
||||||
|
$this->route = $route;
|
||||||
|
$this->args = $args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* create a service dedicated to the controller and mount the controller's routes
|
||||||
|
*
|
||||||
|
* @method register
|
||||||
|
* @public
|
||||||
|
* @param Pimple\Container $app
|
||||||
|
*/
|
||||||
|
public function register(Container $app)
|
||||||
|
{
|
||||||
|
if (!is_null($this->name)) {
|
||||||
|
$class = $this->name;
|
||||||
|
$args = $this->args;
|
||||||
|
$app[$this->ns] = function() use ($class, $args) {
|
||||||
|
return new $class(...$args);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!is_null($this->route)) {
|
||||||
|
$imp = class_implements($class);
|
||||||
|
if (isset($imp['Silex\\Api\\ControllerProviderInterface'])) {
|
||||||
|
$app->mount($this->route, $app[$this->ns]->connect($app));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user