$here = dirname(__FILE__);
$project_root = $here . '/..';
require_once $project_root . '/vendor/autoload.php';
-IPF::configure($project_root, $here);
-IPF_Project::getInstance()->run();
-
+IPF::run($project_root, $here);
<?php
+use IPF\BootstrapProvider;
+use Pimple\Container;
+
final class IPF
{
+ public static function run($project_root, $document_root)
+ {
+ IPF::configure($project_root, $document_root);
+
+ $container = new Container();
+
+ $container['settings'] = IPF::$settings;
+ $container->register(new BootstrapProvider());
+
+ if (IPF::get('debug')) {
+ error_reporting(E_ALL);
+ }
+
+ if (php_sapi_name() === 'cli') {
+ $container['cli']->run();
+ } else {
+ $request = new IPF_HTTP_Request;
+
+ $pipeline = $container['pipeline'];
+ $response = $pipeline->call($request);
+ $response->render($request->method !== 'HEAD');
+ }
+ }
+
public static function version()
{
return '0.5 beta';
$t = $tr[$t];
return $t;
}
-
/** @var Container */
private $container;
- function configure(Container $container, IPF_Settings $settings)
+ function configure(Container $container)
{
$container['admin_log'] = function ($c) {
return new IPF_Admin_Log($c['db'], $c['router']);
public function commands()
{
return array(
- new IPF_Admin_Command_SyncPerms($this, $this->container['db']),
+ new IPF_Admin_Command_SyncPerms($this->container['apps'], $this, $this->container['db']),
);
}
}
/** @var Connection */
private $connection;
- public function __construct(IPF_Admin_App $admin_app, Connection $connection)
+ /** @var IPF_Application[] */
+ private $apps;
+
+ public function __construct(array $apps, IPF_Admin_App $admin_app, Connection $connection)
{
$this->admin_app = $admin_app;
$this->connection = $connection;
+ $this->apps = $apps;
}
public function run($args=null)
print "COLLECTED PERMISSIONS:\n";
$permissions = array();
- foreach (IPF_Project::getInstance()->appList() as $appname => $app) {
+ foreach ($this->apps as $app) {
foreach ($this->admin_app->applicationComponents($app) as $component) {
foreach ($component->getPerms(null) as $permName) {
$name = $app->slug().'|'.$component->slug().'|'.$permName;
<?php
+use Pimple\Container;
+
abstract class IPF_Application
{
/**
* Configures application
*
- * @param \Pimple\Container $container
- * @param IPF_Settings $settings
+ * @param Container $container
*/
- public function configure(\Pimple\Container $container, IPF_Settings $settings)
+ public function configure(Container $container)
{
}
* @param Container $container
* @param IPF_Settings $settings
*/
- public function configure(Container $container, IPF_Settings $settings)
+ public function configure(Container $container)
{
$this->container = $container;
$this->userModel = $container['settings']->get('auth_user_model', User::class);
--- /dev/null
+<?php
+
+namespace IPF;
+
+use IPF\Error\ErrorPageProvider;
+use IPF\Template\TemplateProvider;
+use Pimple\Container;
+use Pimple\ServiceProviderInterface;
+
+class BootstrapProvider implements ServiceProviderInterface
+{
+ public function register(Container $container)
+ {
+ $container['apps'] = function ($c) {
+ $applicationNames = $c['settings']->get('applications');
+
+ $apps = array();
+ foreach ($applicationNames as $name) {
+ $className = $name . '_App';
+ /** @var \IPF_Application $app */
+ $app = new $className();
+
+ $apps[$app->slug()] = $app;
+ }
+ return $apps;
+ };
+ $container->extend('apps', function ($apps, $c) {
+ foreach ($apps as $app) {
+ $app->configure($c);
+ }
+ return $apps;
+ });
+
+ $container['router'] = function ($c) {
+ $settings = $c['settings'];
+ return new \IPF_Router(
+ $settings->get('urls'),
+ $settings->get('app_base')
+ );
+ };
+
+ $container->register(new CoreServicesProvider());
+ $container->register(new TemplateProvider());
+ $container->register(new ErrorPageProvider());
+
+ $container['databaseConnection'] = function ($c) {
+ return \IPF_Database::connect();
+ };
+ $container['db'] = $container->factory(function ($c) {
+ return \IPF_Database::connectDBAL();
+ });
+
+ $container->register(new CliProvider());
+
+ $container['pipeline'] = function ($c) {
+ $middlewares = $c['settings']->get('middlewares', array());
+ array_unshift($middlewares, 'IPF_Error_Middleware');
+ array_push($middlewares, 'IPF_Dispatch_Middleware');
+
+ $m = null;
+ foreach (array_reverse($middlewares) as $mw) {
+ $m = new $mw($m, $c);
+ }
+ return $m;
+ };
+
+ foreach ($container['settings']->get('providers', array()) as $providerClass) {
+ $container->register(new $providerClass);
+ }
+ }
+}
<?php
+namespace IPF;
+
/*
Command is a class with following informal interface.
use Pimple\Container;
use Pimple\ServiceProviderInterface;
-class IPF_Cli_Provider implements ServiceProviderInterface {
-
+class CliProvider implements ServiceProviderInterface
+{
public function register(Container $container)
{
- $container['ipf_commands'] = function($c) {
+ $container['ipf_commands'] = function ($c) {
return array(
- new IPF_Command_Shell,
- new IPF_Command_DebugServer,
- new IPF_Command_Routes($c['router']),
- new IPF_Command_DB,
- new IPF_Command_DBDump,
- new IPF_Command_DBRestore,
- new IPF_Command_CollectStatic,
- new IPF_Command_Pack,
- new IPF_Command_Unpack,
- new IPF_Command_CreateMigration,
- new IPF_Command_Migrate($c['apps'], $c['db']),
+ new \IPF_Command_Shell,
+ new \IPF_Command_DebugServer,
+ new \IPF_Command_Routes($c['router']),
+ new \IPF_Command_DB,
+ new \IPF_Command_DBDump,
+ new \IPF_Command_DBRestore,
+ new \IPF_Command_CollectStatic($c['apps']),
+ new \IPF_Command_Pack,
+ new \IPF_Command_Unpack,
+ new \IPF_Command_CreateMigration,
+ new \IPF_Command_Migrate($c['apps'], $c['db']),
);
};
- $container['project_commands'] = function($c) {
+ $container['project_commands'] = function ($c) {
$commands = array();
- foreach (IPF::get('commands', array()) as $cmd) {
+ foreach (\IPF::get('commands', array()) as $cmd) {
if (is_string($cmd))
$cmd = new $cmd;
$commands[] = $cmd;
'IPF' => $c['ipf_commands'],
];
- /** @var IPF_Application[] $apps */
+ /** @var \IPF_Application[] $apps */
$apps = $c['apps'];
foreach ($apps as $app) {
$app_commands = $app->commands();
print "\n\033[1;36m$group:\033[0m\n";
foreach ($commands as $command) {
- echo ' '.str_pad($command->command, 20) . "\t" . $command->description . "\n";
+ echo ' ' . str_pad($command->command, 20) . "\t" . $command->description . "\n";
}
}
return $_SERVER['argv'];
if (@is_array($GLOBALS['HTTP_SERVER_VARS']['argv']))
return $GLOBALS['HTTP_SERVER_VARS']['argv'];
- throw new IPF_Exception("IPF_Cli: Could not read command arguments (register_argc_argv=Off?)");
+ throw new \Exception("IPF_Cli: Could not read command arguments (register_argc_argv=Off?)");
}
public function run()
{
- print "IPF command line tool. Version: ".IPF::version()."\n";
+ print "IPF command line tool. Version: " . \IPF::version() . "\n";
$args = $this->getArgs();
$command = $this->getCommand($args[1]);
if (!$command) {
- print "Unknown command: '".$args[1]."'\n\n";
+ print "Unknown command: '" . $args[1] . "'\n\n";
$this->usage();
return;
}
try {
$command->run(array_slice($args, 2));
- } catch (Exception $e) {
+ } catch (\Exception $e) {
$m = $e->getMessage();
print "\n\033[1;31m$m\033[0m\n";
}
public $command = 'collectstatic';
public $description = 'Collect static files';
+ /** @var IPF_Application[] */
+ private $apps;
+
+ function __construct(array $apps)
+ {
+ $this->apps = $apps;
+ }
+
public function run($args=null)
{
if (!in_array('--quiet', $args))
$destination = IPF::get('document_root') . DIRECTORY_SEPARATOR . IPF::get('static_url');
- foreach (IPF_Project::getInstance()->appList() as $app) {
+ foreach ($this->apps as $app) {
$source = $app->getPath() . 'static';
if (is_dir($source))
IPF_Utils::copyDirectory($source, $destination);
}
}
}
-
public $command = 'migrate';
public $description = 'Migrate DB schema';
- /** @var IPF_Application[] $appList */
- private $appList;
+ /** @var IPF_Application[] $apps */
+ private $apps;
/** @var Connection */
private $connection;
- function __construct(array $appList, Connection $connection)
+ function __construct(array $apps, Connection $connection)
{
- $this->appList = $appList;
+ $this->apps = $apps;
$this->connection = $connection;
}
public function run($args=null)
{
$paths = array(IPF::get('project_root').'/project/db/migrations');
- foreach ($this->appList as $app) {
+ foreach ($this->apps as $app) {
$paths[] = $app->getPath() . 'migrations';
}
/** @var IPF_Middleware */
protected $next;
- /** @var IPF_Settings */
- protected $settings; // deprecated
-
- /** @var IPF_Project */
- protected $project; // deprecated
-
/** @var Container */
protected $container;
/**
* @param IPF_Middleware|null $next Next middleware in a chain
- * @param IPF_Settings $settings
- * @param IPF_Project $project
* @param Container $container
*/
- function __construct($next, IPF_Settings $settings, IPF_Project $project, Container $container)
+ function __construct($next, Container $container)
{
$this->next = $next;
- $this->settings = $settings;
- $this->project = $project;
$this->container = $container;
}
$query = $matches[1];
- foreach ($this->getAppList() as $app) {
+ foreach ($this->getApps() as $app) {
$static = $app->getPath() . $staticUrl . $query;
if (is_file($static))
return new IPF_HTTP_Response_File($static, null, $this->mimetype($query));
/**
* @return IPF_Application[]
*/
- private function getAppList()
+ private function getApps()
{
return $this->container['apps'];
}
+++ /dev/null
-<?php
-
-use IPF\CoreServicesProvider;
-use IPF\Error\ErrorPageProvider;
-use IPF\Template\TemplateProvider;
-use Pimple\Container;
-
-final class IPF_Project
-{
- /** @var Container */
- private $container = null;
- private $apps = array();
-
- static private $instance = NULL;
-
- static function getInstance()
- {
- if (self::$instance == NULL)
- self::$instance = new IPF_Project;
- return self::$instance;
- }
-
- private function __construct()
- {
- $this->container = new Container();
- $this->container['settings'] = IPF::$settings;
-
- $apps = array();
- foreach (IPF::get('applications') as $name) {
- $className = $name.'_App';
- /** @var IPF_Application $app */
- $app = new $className();
- $app->configure($this->container, IPF::$settings);
-
- $this->apps[$name] = $app;
- $apps[$app->slug()] = $app;
- }
- $this->container['apps'] = $apps;
- $this->container['router'] = function ($c) {
- $settings = $c['settings'];
- return new IPF_Router(
- $settings->get('urls'),
- $settings->get('app_base')
- );
- };
- }
-
- private function __clone()
- {
- }
-
- public function appList()
- {
- return $this->apps;
- }
-
- /**
- * @return IPF_Middleware
- */
- private function chainMiddlewares()
- {
- $middlewares = $this->container['settings']->get('middlewares', array());
- array_unshift($middlewares, 'IPF_Error_Middleware');
- array_push($middlewares, 'IPF_Dispatch_Middleware');
-
- $m = null;
- foreach (array_reverse($middlewares) as $mw) {
- $m = new $mw($m, IPF::$settings, $this, $this->container);
- }
- return $m;
- }
-
- public function run()
- {
- $this->container->register(new CoreServicesProvider());
- $this->container->register(new TemplateProvider());
- $this->container->register(new ErrorPageProvider());
-
- $this->container['databaseConnection'] = function ($c) {
- return IPF_Database::connect();
- };
- $this->container['db'] = $this->container->factory(function ($c) {
- return IPF_Database::connectDBAL();
- });
-
- $this->container->register(new IPF_Cli_Provider());
-
- foreach ($this->container['settings']->get('providers', array()) as $providerClass) {
- $this->container->register(new $providerClass);
- }
-
- if (IPF::get('debug')) {
- error_reporting(E_ALL);
- }
-
- if (php_sapi_name() === 'cli') {
- $this->container['cli']->run();
- } else {
- $request = new IPF_HTTP_Request;
-
- $response = $this->chainMiddlewares()->call($request);
- $response->render($request->method !== 'HEAD');
- }
- }
-}
/** @var SessionBackend[] */
private $backends;
- public function configure(\Pimple\Container $container, IPF_Settings $settings)
+ public function configure(\Pimple\Container $container)
{
$this->backends = [
new CookieSessionBackend(),