<?php
namespace FluentForm\Framework\Foundation;
use FluentForm\Framework\View\View;
use FluentForm\Framework\Http\Router;
use FluentForm\Framework\Request\Request;
use FluentForm\Framework\Response\Response;
use FluentForm\Framework\Database\Orm\Model;
use FluentForm\Framework\Validator\Validator;
use FluentForm\Framework\Foundation\Dispatcher;
use FluentForm\Framework\Foundation\RequestGuard;
use FluentForm\Framework\Pagination\AbstractPaginator;
use FluentForm\Framework\Database\ConnectionResolver;
use FluentForm\Framework\Database\Query\WPDBConnection;
use FluentForm\Framework\Foundation\UnAuthorizedException;
class ComponentBinder
{
protected $app = null;
protected $bindables = [
'Request',
'Response',
'Validator',
'View',
'Events',
'DataBase',
'Router',
'Paginator'
];
public function __construct($app)
{
$this->app = $app;
}
public function bindComponents()
{
foreach ($this->bindables as $value) {
$method = "bind{$value}";
$this->{$method}();
}
$this->extendBindings($this->app);
$this->loadGlobalFunctions($this->app);
$this->registerResolvingEvent($this->app);
}
protected function registerResolvingEvent($app)
{
$app->resolving(RequestGuard::class, function($request) use ($app) {
$request->merge($request->beforeValidation());
$data = $request->validate($app->make('validator'));
$request->merge($request->afterValidation());
});
}
protected function bindRequest()
{
$this->app->singleton(Request::class, function ($app) {
return new Request($app, $_GET, $_POST, $_FILES);
});
$this->app->alias(Request::class, 'request');
}
protected function bindResponse()
{
$this->app->singleton(Response::class, function($app) {
return new Response($app);
});
$this->app->alias(Response::class, 'response');
}
protected function bindValidator()
{
$this->app->bind(Validator::class, function($app) {
return new Validator;
});
$this->app->alias(Validator::class, 'validator');
}
protected function bindView()
{
$this->app->bind(View::class, function($app) {
return new View($app);
});
$this->app->alias(View::class, 'view');
}
protected function bindEvents()
{
$this->app->singleton(Dispatcher::class, function($app) {
return new Dispatcher($app);
});
$this->app->alias(Dispatcher::class, 'events');
}
protected function bindDataBase()
{
$this->app->bindShared('db', function($app) {
return new WPDBConnection(
$GLOBALS['wpdb'], $app->config->get('database')
);
});
Model::setEventDispatcher($this->app['events']);
Model::setConnectionResolver(new ConnectionResolver);
}
protected function bindRouter()
{
$this->app->singleton('router', function($app) {
return new Router($app);
});
}
protected function bindPaginator()
{
AbstractPaginator::currentPathResolver(function () {
return $this->app['request']->url();
});
AbstractPaginator::currentPageResolver(function ($pageName = 'page') {
$page = $this->app['request']->get($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
}
protected function extendBindings($app)
{
$bindings = $app['path'] . 'boot/bindings.php';
if (is_readable($bindings)) {
require_once $bindings;
}
}
protected function loadGlobalFunctions($app)
{
$globals = $app['path'] . 'boot/globals.php';
if (is_readable($globals)) {
require_once $globals;
}
}
}