304 lines
11 KiB
PHP
304 lines
11 KiB
PHP
<?php
|
|
|
|
/*
|
|
* @copyright Copyright (C) 2005-2010 Keyboard Monkeys Ltd. http://www.kb-m.com
|
|
* @license http://creativecommons.org/licenses/BSD/ BSD License
|
|
* @author Keyboard Monkey Ltd
|
|
* @since CommunityID 0.9
|
|
* @package CommunityID
|
|
* @packager Keyboard Monkeys
|
|
*/
|
|
|
|
class Application
|
|
{
|
|
const VERSION = '2.0.0.RC3';
|
|
|
|
public static $config;
|
|
public static $logger;
|
|
public static $mockLogger;
|
|
public static $acl;
|
|
public static $front;
|
|
|
|
private static $_pathList;
|
|
|
|
/**
|
|
* Used in unit tests
|
|
*/
|
|
public static function cleanUp()
|
|
{
|
|
Zend_Registry::_unsetInstance();
|
|
Zend_Layout::resetMvcInstance();
|
|
Zend_Controller_Action_HelperBroker::resetHelpers();
|
|
}
|
|
|
|
public static function setIncludePath()
|
|
{
|
|
if (isset(self::$_pathList)) {
|
|
// to avoid passing here more than once in unit tests
|
|
return;
|
|
}
|
|
|
|
self::$_pathList = array(
|
|
'.',
|
|
APP_DIR,
|
|
APP_DIR.'/libs',
|
|
// this should go at the end to avoid clashes with other Zend Framework versions in the machine
|
|
get_include_path(),
|
|
);
|
|
if (!set_include_path(implode(PATH_SEPARATOR, self::$_pathList))) {
|
|
die('ERROR: couldn\'t execute PHP\'s set_include_path() function in your system.'
|
|
.' Please ask your system admin to enable that functionality.');
|
|
}
|
|
}
|
|
|
|
public static function setAutoLoader()
|
|
{
|
|
require_once 'Zend/Loader/Autoloader.php';
|
|
$loader = Zend_Loader_Autoloader::getInstance();
|
|
$loader->registerNamespace('Monkeys_');
|
|
$loader->registerNamespace('CommunityID');
|
|
$loader->registerNamespace('Auth');
|
|
$loader->registerNamespace('Yubico');
|
|
new Monkeys_Application_Module_Autoloader(array(
|
|
'namespace' => '',
|
|
'basePath' => APP_DIR . '/modules/default',
|
|
));
|
|
new Monkeys_Application_Module_Autoloader(array(
|
|
'namespace' => 'Users',
|
|
'basePath' => APP_DIR . '/modules/users',
|
|
));
|
|
new Monkeys_Application_Module_Autoloader(array(
|
|
'namespace' => 'News',
|
|
'basePath' => APP_DIR . '/modules/news',
|
|
));
|
|
new Monkeys_Application_Module_Autoloader(array(
|
|
'namespace' => 'Stats',
|
|
'basePath' => APP_DIR . '/modules/stats',
|
|
));
|
|
new Monkeys_Application_Module_Autoloader(array(
|
|
'namespace' => 'Install',
|
|
'basePath' => APP_DIR . '/modules/install',
|
|
));
|
|
}
|
|
|
|
public static function setConfig()
|
|
{
|
|
$config = array();
|
|
|
|
// first defaults are loaded, then the custom configs
|
|
require APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php';
|
|
if (file_exists(APP_DIR . DIRECTORY_SEPARATOR . 'config.php')) {
|
|
require APP_DIR . DIRECTORY_SEPARATOR . 'config.php';
|
|
}
|
|
|
|
self::$config = new Zend_Config($config, array('allowModifications' => true));
|
|
|
|
Zend_Registry::set('config', self::$config);
|
|
}
|
|
|
|
public static function setErrorReporting()
|
|
{
|
|
ini_set('log_errors', 'Off');
|
|
if (self::$config->environment->production) {
|
|
error_reporting(E_ALL & E_NOTICE);
|
|
ini_set('display_errors', 'Off');
|
|
} else {
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 'On');
|
|
}
|
|
}
|
|
|
|
public static function setLogger($addMockWriter = false)
|
|
{
|
|
self::$logger = new Zend_Log();
|
|
if (self::$config->logging->level == 0) {
|
|
self::$logger->addWriter(new Zend_Log_Writer_Null(APP_DIR . '/log.txt'));
|
|
} else {
|
|
if (is_writable(self::$config->logging->location)) {
|
|
$file = self::$config->logging->location;
|
|
} else if (!is_writable(APP_DIR . DIRECTORY_SEPARATOR . self::$config->logging->location)) {
|
|
throw new Exception('Couldn\'t find log file, or maybe it\'s not writable');
|
|
} else {
|
|
$file = APP_DIR . DIRECTORY_SEPARATOR . self::$config->logging->location;
|
|
}
|
|
|
|
self::$logger->addWriter(new Zend_Log_Writer_Stream($file));
|
|
if ($addMockWriter) {
|
|
self::$mockLogger = new Zend_Log_Writer_Mock();
|
|
self::$logger->addWriter(self::$mockLogger);
|
|
}
|
|
}
|
|
self::$logger->addFilter(new Zend_Log_Filter_Priority((int)self::$config->logging->level));
|
|
Zend_Registry::set('logger', self::$logger);
|
|
}
|
|
|
|
public static function logRequest()
|
|
{
|
|
if (isset($_SERVER['REQUEST_URI'])) {
|
|
self::$logger->log('REQUESTED URI: ' . $_SERVER['REQUEST_URI'], Zend_Log::INFO);
|
|
} else {
|
|
self::$logger->log('REQUESTED THROUGH CLI: ' . $GLOBALS['argv'][0], Zend_Log::INFO);
|
|
}
|
|
|
|
if (isset($_POST) && $_POST) {
|
|
self::$logger->log('POST payload: ' . print_r($_POST, 1), Zend_Log::INFO);
|
|
}
|
|
}
|
|
|
|
public static function setDatabase()
|
|
{
|
|
// I was using this for when using PDO, but lately it's generating a segfault, and we're not using PDO anymore anyway
|
|
/*if (defined('PDO::MYSQL_ATTR_USE_BUFFERED_QUERY')) {
|
|
// constant not set if pdo_mysql extension is not loaded
|
|
self::$config->database->params->driver_options = array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true);
|
|
}*/
|
|
|
|
$db = Zend_Db::factory(self::$config->database);
|
|
if (self::$config->logging->level == Zend_Log::DEBUG) {
|
|
$profiler = new Monkeys_Db_Profiler();
|
|
$db->setProfiler($profiler);
|
|
}
|
|
Zend_Db_Table_Abstract::setDefaultAdapter($db);
|
|
// unknown PHP bug (tested on PHP 5.2.8 and PHP 5.2.10) corrupts the $db reference, so I gotta retrieve it again:
|
|
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
|
|
Zend_Registry::set('db', $db);
|
|
|
|
try {
|
|
$db->getConnection();
|
|
return true;
|
|
} catch (Zend_Db_Adapter_Exception $e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function setSession()
|
|
{
|
|
// The framework doesn't provide yet a clean way of doing this
|
|
if (isset($_POST['rememberme'])) {
|
|
Zend_Session::rememberMe();
|
|
}
|
|
|
|
// ZF still doesn't have facilities for session_name().
|
|
session_name(self::$config->environment->session_name);
|
|
|
|
$appSession = new Zend_Session_Namespace('Default');
|
|
if (is_null($appSession->messages)) {
|
|
$appSession->messages = array();
|
|
}
|
|
Zend_Registry::set('appSession', $appSession);
|
|
}
|
|
|
|
public static function setAcl()
|
|
{
|
|
self::$acl = new Zend_Acl();
|
|
require 'Acl.php';
|
|
|
|
foreach ($privileges as $module => $moduleConfig) {
|
|
foreach ($moduleConfig as $controller => $controllerConfig) {
|
|
self::$acl->add(new Zend_Acl_Resource($module . '_' . $controller));
|
|
foreach ($controllerConfig as $action => $role) {
|
|
self::$acl->allow($role, $module . '_' . $controller, $action);
|
|
}
|
|
}
|
|
}
|
|
Zend_Registry::set('acl', self::$acl);
|
|
}
|
|
|
|
public static function setI18N()
|
|
{
|
|
if (self::$config->environment->locale == 'auto') {
|
|
try {
|
|
$locale = new Zend_Locale(Zend_Locale::BROWSER);
|
|
} catch (Zend_Locale_Exception $e) {
|
|
// happens when no browser around, e.g. when calling the rest api by other means
|
|
$locale = new Zend_Locale('en_US');
|
|
}
|
|
} else {
|
|
$locale = new Zend_Locale(self::$config->environment->locale);
|
|
}
|
|
Zend_Registry::set('Zend_Locale', $locale);
|
|
$translate = new Zend_Translate('gettext',
|
|
APP_DIR . '/languages',
|
|
$locale->toString(),
|
|
array(
|
|
'scan' => Zend_Translate::LOCALE_DIRECTORY,
|
|
'disableNotices' => true));
|
|
Zend_Registry::set('Zend_Translate', $translate);
|
|
|
|
return $translate;
|
|
}
|
|
|
|
public static function setLayout()
|
|
{
|
|
$template = self::$config->environment->template;
|
|
|
|
// Hack: Explicitly add the ViewRenderer, so that when an exception is thrown,
|
|
// the layout is not shown (should be better handled in ZF 1.6)
|
|
// @see http://framework.zend.com/issues/browse/ZF-2993?focusedCommentId=23121#action_23121
|
|
Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_ViewRenderer());
|
|
|
|
Zend_Layout::startMvc(array(
|
|
'layoutPath' => $template == 'default'? APP_DIR.'/views/layouts' : APP_DIR."/views/layouts_$template",
|
|
));
|
|
}
|
|
|
|
public static function setFrontController()
|
|
{
|
|
self::$front = Zend_Controller_Front::getInstance();
|
|
self::$front->registerPlugin(new Monkeys_Controller_Plugin_Auth(self::$acl));
|
|
self::$front->addModuleDirectory(APP_DIR.'/modules');
|
|
|
|
$router = self::$front->getRouter();
|
|
|
|
if (self::$config->subdomain->enabled) {
|
|
if (self::$config->subdomain->use_www) {
|
|
$reqs = array('username' => '([^w]|w[^w][^w]|ww[^w]|www.+).*');
|
|
} else {
|
|
$reqs = array();
|
|
}
|
|
$hostNameRoute = new Zend_Controller_Router_Route_Hostname(
|
|
':username.' . self::$config->subdomain->hostname,
|
|
array(
|
|
'module' => 'default',
|
|
'controller' => 'identity',
|
|
'action' => 'id',
|
|
),
|
|
$reqs
|
|
);
|
|
$router->addRoute('hostNameRoute', $hostNameRoute);
|
|
}
|
|
|
|
$route = new Zend_Controller_Router_Route(
|
|
'identity/:userid',
|
|
array(
|
|
'module' => 'default',
|
|
'controller' => 'identity',
|
|
'action' => 'id',
|
|
),
|
|
array('userid' => '[\w-]*')
|
|
);
|
|
$router->addRoute('identityRoute', $route);
|
|
|
|
$route = new Zend_Controller_Router_Route(
|
|
'news/:id',
|
|
array(
|
|
'module' => 'news',
|
|
'controller' => 'view',
|
|
'action' => 'index',
|
|
),
|
|
array('id' => '\d+')
|
|
);
|
|
$router->addRoute('articleView', $route);
|
|
}
|
|
|
|
public static function dispatch()
|
|
{
|
|
self::$front->dispatch();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* this is just a global function used to mark translations
|
|
*/
|
|
function translate() {}
|