So much refactoring...
This commit is contained in:
parent
03e613d380
commit
54471c361b
9 changed files with 562 additions and 707 deletions
|
@ -32,10 +32,9 @@ class Config extends Object
|
|||
/**
|
||||
* Config data
|
||||
*
|
||||
* @access private
|
||||
* @var array
|
||||
*/
|
||||
private $data = array();
|
||||
public $data = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -236,19 +235,6 @@ class Config extends Object
|
|||
return parent::getInstance($class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic Setter Method
|
||||
*
|
||||
* Prohibits the direct modification of module variables.
|
||||
*
|
||||
* @param string $name name of the variable to be set
|
||||
* @param mixed $value value of the variable to be set
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
throw new Exception('Cannot set config variables directly', E_USER_ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic Getter Method
|
||||
*
|
||||
|
|
|
@ -39,10 +39,19 @@ class Controller extends Object
|
|||
parent::__construct();
|
||||
|
||||
// Generate a generic "site down" message if the site is set to be disabled
|
||||
try
|
||||
{
|
||||
// @todo Clean this up to be just a single sanity check
|
||||
if (isset($this->config->pickles['disabled']) && $this->config->pickles['disabled'] == true)
|
||||
{
|
||||
Error::fatal($_SERVER['SERVER_NAME'] . ' is currently<br>down for maintenance');
|
||||
// @todo Add support for custom templates
|
||||
throw new Exception('
|
||||
<h1>Down for Maintenance</h1>
|
||||
<p>' . $_SERVER['SERVER_NAME'] . ' is currently down for maintenance. Please check back in a few minutes.</p>
|
||||
<p>Additionally, a custom maintenance template was not found.</p>
|
||||
<hr>
|
||||
<em>Powered by <a href="https://github.com/joshtronic/pickles">PICKLES</a></em>
|
||||
');
|
||||
}
|
||||
|
||||
// Checks for attributes passed in the URI
|
||||
|
@ -72,7 +81,7 @@ class Controller extends Object
|
|||
{
|
||||
// @todo Rework the Browser class to handle the 301 (perhaps redirect301()) to not break other code
|
||||
header('Location: ' . substr_replace($_SERVER['REQUEST_URI'], $lowercase_request, 1, strlen($lowercase_request)), true, 301);
|
||||
exit;
|
||||
throw new Exception();
|
||||
}
|
||||
|
||||
// Grabs the requested page
|
||||
|
@ -86,9 +95,6 @@ class Controller extends Object
|
|||
// Attempts to instantiate the requested module
|
||||
if ($module_exists)
|
||||
{
|
||||
// @todo Is this redundant because of our autoloader?
|
||||
require_once $module_filename;
|
||||
|
||||
if (class_exists($module_class))
|
||||
{
|
||||
$module = new $module_class;
|
||||
|
@ -104,11 +110,13 @@ class Controller extends Object
|
|||
// Determines if we need to serve over HTTP or HTTPS
|
||||
if ($module->secure == false && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'])
|
||||
{
|
||||
Browser::redirect('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
||||
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], true, 301);
|
||||
throw new Exception();
|
||||
}
|
||||
elseif ($module->secure == true && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == false))
|
||||
{
|
||||
Browser::redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
||||
header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], true, 301);
|
||||
throw new Exception();
|
||||
}
|
||||
|
||||
// Validates security level
|
||||
|
@ -224,6 +232,7 @@ class Controller extends Object
|
|||
}
|
||||
|
||||
// Attempts to execute the default method
|
||||
// @todo Seems a bit redundant, refactor
|
||||
if ($default_method == $role_method || method_exists($module, $default_method))
|
||||
{
|
||||
// Starts a timer before the module is executed
|
||||
|
@ -243,11 +252,9 @@ class Controller extends Object
|
|||
$module->method = [$module->method];
|
||||
}
|
||||
|
||||
$request_method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
foreach ($module->method as $method)
|
||||
{
|
||||
if ($request_method == strtoupper($method))
|
||||
if ($_SERVER['REQUEST_METHOD'] == $method)
|
||||
{
|
||||
$valid_request = true;
|
||||
break;
|
||||
|
@ -317,7 +324,7 @@ class Controller extends Object
|
|||
|
||||
if (!$this->validateTemplates($module, $parent_template))
|
||||
{
|
||||
exit('
|
||||
throw new Exception('
|
||||
<h1>Not Found</h1>
|
||||
<p>The requested URL /' . $request . ' was not found on this server.</p>
|
||||
<p>Additionally, a custom error template was not found.</p>
|
||||
|
@ -349,23 +356,19 @@ class Controller extends Object
|
|||
// Renders the content
|
||||
$output = $display->render();
|
||||
|
||||
echo $output;
|
||||
|
||||
// Stops the display timer
|
||||
if ($profiler)
|
||||
{
|
||||
Profiler::timer('display render');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
*
|
||||
* Dumps out the Profiler's report if applicable.
|
||||
*/
|
||||
public function __destruct()
|
||||
catch (Exception $e)
|
||||
{
|
||||
parent::__destruct();
|
||||
$output = $e->getMessage();
|
||||
}
|
||||
finally
|
||||
{
|
||||
echo $output;
|
||||
|
||||
// Display the Profiler's report if the stars are aligned
|
||||
if ($this->config->pickles['profiler'])
|
||||
|
@ -373,7 +376,9 @@ class Controller extends Object
|
|||
Profiler::report();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// @todo Document me
|
||||
private function validateTemplates(&$module, $parent_template)
|
||||
{
|
||||
$templates = [
|
||||
|
|
|
@ -265,7 +265,9 @@ class Dynamic extends Object
|
|||
&& extension_loaded('curl')
|
||||
&& $this->config->pickles['minify'] === true)
|
||||
{
|
||||
exec('java -jar ' . PICKLES_PATH . 'vendors/google/closure-compiler/compiler.jar --js=' . $original_filename . ' --compilation_level=' . ($level . '_' . ($level == 'WHITESPACE' ? 'ONLY' : 'OPTIMIZATIONS')) . ' --js_output_file=' . $minified_filename);
|
||||
$config = Config::getInstance();
|
||||
|
||||
exec('java -jar ' . $config->pickles['path'] . 'vendors/google/closure-compiler/compiler.jar --js=' . $original_filename . ' --compilation_level=' . ($level . '_' . ($level == 'WHITESPACE' ? 'ONLY' : 'OPTIMIZATIONS')) . ' --js_output_file=' . $minified_filename);
|
||||
|
||||
$reference = $minified_reference;
|
||||
}
|
||||
|
|
|
@ -1,104 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Error Reporting for PICKLES
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistribution of these files must retain the above copyright notice.
|
||||
*
|
||||
* @author Joshua Sherman <pickles@joshtronic.com>
|
||||
* @copyright Copyright 2007-2013, Joshua Sherman
|
||||
* @license http://www.opensource.org/licenses/mit-license.html
|
||||
* @package PICKLES
|
||||
* @link https://github.com/joshtronic/pickles
|
||||
*/
|
||||
|
||||
/**
|
||||
* Error Class
|
||||
*
|
||||
* Standardized error reporting, mostly used to display fatal errors.
|
||||
*/
|
||||
class Error
|
||||
{
|
||||
/**
|
||||
* Fatal Error
|
||||
*
|
||||
* Displays a friendly error to the user via HTML, logs it then exits.
|
||||
*
|
||||
* @static
|
||||
* @param string $message the message to be displayed to the user
|
||||
*/
|
||||
public static function fatal($message)
|
||||
{
|
||||
$config = Config::getInstance();
|
||||
|
||||
if ($config->pickles['logging'] === true)
|
||||
{
|
||||
if (Log::error($message) == false)
|
||||
{
|
||||
$message .= '<br><br>This error message could not be logged as the log path or log file is not writable';
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><?php echo $_SERVER['SERVER_NAME']; ?> - error</title>
|
||||
<style>
|
||||
html
|
||||
{
|
||||
background: #eee;
|
||||
font-family: "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, sans-serif;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size: 1em;
|
||||
}
|
||||
body
|
||||
{
|
||||
text-align: center;
|
||||
margin-top: 100px;
|
||||
}
|
||||
div
|
||||
{
|
||||
font-size: 150%;
|
||||
color: #600;
|
||||
text-shadow: 2px 2px 2px #eb8383;
|
||||
margin: 0;
|
||||
font-weight: bold;
|
||||
background: #ff9c9c;
|
||||
padding: 20px;
|
||||
border-radius: 20px;
|
||||
-moz-border-radius: 20px;
|
||||
-webkit-border-radius: 20px;
|
||||
width: 550px;
|
||||
margin: 0 auto;
|
||||
border: 3px solid #890f0f;
|
||||
}
|
||||
h1, a
|
||||
{
|
||||
font-size: 70%;
|
||||
color: #999;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover
|
||||
{
|
||||
color: #000;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1><?php echo $_SERVER['SERVER_NAME']; ?></h1>
|
||||
<div><?php echo $message; ?></div>
|
||||
<a href="https://github.com/joshtronic/pickles" target="_blank">Powered by PICKLES</a>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
|
@ -182,7 +182,7 @@ class Profiler
|
|||
'log' => $log,
|
||||
'type' => $data_type,
|
||||
'time' => $time,
|
||||
'elapsed' => $time - PICKLES_START_TIME,
|
||||
'elapsed' => $time - $_SERVER['REQUEST_TIME_FLOAT'],
|
||||
'memory' => memory_get_usage(),
|
||||
);
|
||||
}
|
||||
|
@ -325,9 +325,9 @@ class Profiler
|
|||
}
|
||||
else
|
||||
{
|
||||
$start_time = PICKLES_START_TIME;
|
||||
$start_time = $_SERVER['REQUEST_TIME_FLOAT'];
|
||||
$peak_usage = self::formatSize(memory_get_peak_usage());
|
||||
$end_time = self::$profile[count(self::$profile) - 1]['time']; // TODO
|
||||
$end_time = self::$profile[count(self::$profile) - 1]['time']; // @todo No idea what though?
|
||||
$duration = ($end_time - $start_time);
|
||||
|
||||
$logs = count(self::$profile);
|
||||
|
|
351
pickles.php
351
pickles.php
|
@ -23,30 +23,27 @@
|
|||
|
||||
// {{{ PICKLES Constants
|
||||
|
||||
// Grabs the start time in case we're profiling
|
||||
define('PICKLES_START_TIME', microtime(true));
|
||||
|
||||
// Establishes our PICKLES paths
|
||||
define('PICKLES_PATH', dirname(__FILE__) . '/');
|
||||
define('PICKLES_CLASS_PATH', PICKLES_PATH . 'classes/');
|
||||
define('PICKLES_VENDOR_PATH', PICKLES_PATH . 'vendors/');
|
||||
|
||||
// @todo Finish reworking constants to be part of the Config object
|
||||
// Establishes our site paths, sanity check is to allow vfsStream in our tests
|
||||
if (!defined('SITE_PATH'))
|
||||
{
|
||||
define('SITE_PATH', getcwd() . '/../');
|
||||
}
|
||||
|
||||
define('SITE_CLASS_PATH', SITE_PATH . 'classes/');
|
||||
define('SITE_MODEL_PATH', SITE_PATH . 'models/');
|
||||
define('SITE_MODULE_PATH', SITE_PATH . 'modules/');
|
||||
define('SITE_TEMPLATE_PATH', SITE_PATH . 'templates/');
|
||||
if (!defined('SITE_CLASS_PATH'))
|
||||
{
|
||||
define('SITE_CLASS_PATH', SITE_PATH . 'classes/');
|
||||
define('SITE_MODEL_PATH', SITE_PATH . 'models/');
|
||||
// @todo The following 2 constants are being used in sites will need to update them before removing
|
||||
define('SITE_MODULE_PATH', SITE_PATH . 'modules/');
|
||||
define('SITE_TEMPLATE_PATH', SITE_PATH . 'templates/');
|
||||
|
||||
define('PRIVATE_PATH', SITE_PATH . 'private/');
|
||||
define('LOG_PATH', PRIVATE_PATH . 'logs/');
|
||||
define('PRIVATE_PATH', SITE_PATH . 'private/');
|
||||
define('LOG_PATH', PRIVATE_PATH . 'logs/');
|
||||
|
||||
// Creates a variable to flag if we're on the command line
|
||||
define('IS_CLI', !isset($_SERVER['REQUEST_METHOD']));
|
||||
// Creates a variable to flag if we're on the command line
|
||||
define('IS_CLI', !isset($_SERVER['REQUEST_METHOD']));
|
||||
}
|
||||
|
||||
// }}}
|
||||
// {{{ Defaults some important configuration options
|
||||
|
@ -55,10 +52,6 @@ define('IS_CLI', !isset($_SERVER['REQUEST_METHOD']));
|
|||
ini_set('display_errors', true);
|
||||
error_reporting(-1);
|
||||
|
||||
// Sets the error and exception handlers
|
||||
// set_error_handler('__handleError');
|
||||
// set_exception_handler('__handleException');
|
||||
|
||||
// Defaults timezone to UTC if not set
|
||||
if (ini_get('date.timezone') == '')
|
||||
{
|
||||
|
@ -74,14 +67,75 @@ ini_set('session.gc_probability', 1);
|
|||
ini_set('session.gc_divisor', 1000);
|
||||
ini_set('session.hash_function', 1);
|
||||
|
||||
// }}}
|
||||
// {{{ Auto[magical] Loader
|
||||
|
||||
/**
|
||||
* Magic function to automatically load classes
|
||||
*
|
||||
* Attempts to load a core PICKLES class or a site level data model or
|
||||
* module class.
|
||||
*
|
||||
* @param string $class Name of the class to be loaded
|
||||
* @return boolean Return value of require_once() or false (default)
|
||||
*/
|
||||
function __autoload($class)
|
||||
{
|
||||
$loaded = false;
|
||||
$filename = preg_replace('/_/', '/', $class) . '.php';
|
||||
|
||||
$pickles_path = dirname(__FILE__) . '/';
|
||||
$pickles_paths = [
|
||||
'class' => $pickles_path . 'classes/',
|
||||
'vendor' => $pickles_path . 'vendors/',
|
||||
];
|
||||
|
||||
if ($class == 'AYAH')
|
||||
{
|
||||
$loaded = require_once $pickles_paths['vendor'] . 'ayah/' . strtolower($filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Path as the key, boolean value is whether ot not to convert back to hyphenated
|
||||
$paths = [
|
||||
$pickles_paths['class'] => false,
|
||||
SITE_CLASS_PATH => false,
|
||||
SITE_MODEL_PATH => false,
|
||||
SITE_MODULE_PATH => true,
|
||||
];
|
||||
|
||||
foreach ($paths as $path => $hyphenated)
|
||||
{
|
||||
// Converts the filename back to hypenated
|
||||
if ($hyphenated == true)
|
||||
{
|
||||
$filename = strtolower(preg_replace('/([A-Z]{1})/', '-$1', $filename));;
|
||||
}
|
||||
|
||||
if (file_exists($path . $filename))
|
||||
{
|
||||
$loaded = require_once $path . $filename;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $loaded;
|
||||
}
|
||||
|
||||
spl_autoload_register('__autoload');
|
||||
|
||||
// }}}
|
||||
// {{{ Loads the configuration file and sets any configuration options
|
||||
|
||||
// Loads the base config
|
||||
$config = Config::getInstance();
|
||||
|
||||
// Injects PICKLES variables into the config
|
||||
$config->data['pickles']['path'] = dirname(__FILE__) . '/';
|
||||
|
||||
// Configures any available PHP configuration options
|
||||
if (is_array($config->php) && count($config->php) > 0)
|
||||
if (is_array($config->php) && count($config->php))
|
||||
{
|
||||
foreach ($config->php as $variable => $value)
|
||||
{
|
||||
|
@ -115,261 +169,6 @@ if (!isset($_REQUEST['request']))
|
|||
$_REQUEST['request'] = 'home';
|
||||
}
|
||||
|
||||
// }}}
|
||||
// {{{ Auto[magical] Loader
|
||||
|
||||
/**
|
||||
* Magic function to automatically load classes
|
||||
*
|
||||
* Attempts to load a core PICKLES class or a site level data model or
|
||||
* module class.
|
||||
*
|
||||
* @param string $class Name of the class to be loaded
|
||||
* @return boolean Return value of require_once() or false (default)
|
||||
*/
|
||||
function __autoload($class)
|
||||
{
|
||||
$loaded = false;
|
||||
$filename = preg_replace('/_/', '/', $class) . '.php';
|
||||
|
||||
if ($class == 'AYAH')
|
||||
{
|
||||
$loaded = require_once PICKLES_VENDOR_PATH . 'ayah/' . strtolower($filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Path as the key, boolean value is whether ot not to convert back to hyphenated
|
||||
$paths = array(
|
||||
PICKLES_CLASS_PATH => false,
|
||||
SITE_CLASS_PATH => false,
|
||||
SITE_MODEL_PATH => false,
|
||||
SITE_MODULE_PATH => true,
|
||||
);
|
||||
|
||||
foreach ($paths as $path => $hyphenated)
|
||||
{
|
||||
// Converts the filename back to hypenated
|
||||
if ($hyphenated == true)
|
||||
{
|
||||
$filename = strtolower(preg_replace('/([A-Z]{1})/', '-$1', $filename));;
|
||||
}
|
||||
|
||||
if (file_exists($path . $filename))
|
||||
{
|
||||
$loaded = require_once $path . $filename;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $loaded;
|
||||
}
|
||||
|
||||
spl_autoload_register('__autoload');
|
||||
|
||||
// }}}
|
||||
// {{{ Error Handler
|
||||
|
||||
/**
|
||||
* Error handling function that thinks it's magical
|
||||
*
|
||||
* Catches errors (warnings and the like) and throws it back out as an
|
||||
* ErrorException. This really helps trapping complex errors that need a ton of
|
||||
* sanity checks, just try / catch and you're good. Also, this isn't a magic
|
||||
* function, but I opted to use the __ prefix to help avoid a naming collision
|
||||
* since namespace support is 5.3+ and PICKLES strives to be 5.0+ compatible.
|
||||
*
|
||||
* Keep in mind that fatal errors cannot and will not be handled.
|
||||
*
|
||||
* @param integer $errno the level of the error raised
|
||||
* @param string $errstr the error message
|
||||
* @param string $errfile filename that the error was raised in
|
||||
* @param integer $errline line number the error was raised at
|
||||
* @param array $errcontext array of every variable that existed in scope
|
||||
* @return ErrorException not really returned, but worth documenting
|
||||
*/
|
||||
function __handleError($errno, $errstr, $errfile, $errline, array $errcontext)
|
||||
{
|
||||
// Handle hacktastic @ error suppression. Seriously, don't ever use @
|
||||
if (error_reporting() === 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
|
||||
}
|
||||
|
||||
// }}}
|
||||
// {{{ Exception Handler
|
||||
|
||||
/**
|
||||
* Top level exception handling function
|
||||
*
|
||||
* Catches uncaught exceptions and displays them.
|
||||
*
|
||||
* @param object $exception the exception
|
||||
*/
|
||||
function __handleException($exception)
|
||||
{
|
||||
if (IS_CLI == true)
|
||||
{
|
||||
$lines = array();
|
||||
$maxes = array('key' => 0, 'method' => 0, 'file' => 0, 'line' => 4);
|
||||
|
||||
$trace = $exception->getTrace();
|
||||
rsort($trace);
|
||||
|
||||
foreach ($trace as $key => $data)
|
||||
{
|
||||
$method = '';
|
||||
|
||||
if (isset($data['class']))
|
||||
{
|
||||
$method .= $data['class'] . $data['type'];
|
||||
}
|
||||
|
||||
$method .= $data['function'] . '()';
|
||||
|
||||
$line = array(
|
||||
'key' => $key + 1 . '.',
|
||||
'method' => $method,
|
||||
'file' => (isset($data['file']) ? $data['file'] : __FILE__),
|
||||
'line' => (isset($data['line']) ? $data['line'] : '0')
|
||||
);
|
||||
|
||||
foreach (array_keys($maxes) as $variable)
|
||||
{
|
||||
$length = strlen($line[$variable]);
|
||||
|
||||
if ($length > $maxes[$variable])
|
||||
{
|
||||
$maxes[$variable] = $length;
|
||||
}
|
||||
}
|
||||
|
||||
$lines[] = $line;
|
||||
}
|
||||
|
||||
$max_length = array_sum($maxes) + 11;
|
||||
$horizontal_border = '+' . str_repeat('-', $max_length) . '+' . "\n";
|
||||
|
||||
echo $horizontal_border;
|
||||
echo '|' . str_pad('Uncaught Exception', $max_length, ' ', STR_PAD_BOTH) . '|' . "\n";
|
||||
echo $horizontal_border;
|
||||
echo '|' . str_pad(' ' . $exception->getMessage(), $max_length) . '|' . "\n";
|
||||
echo '|' . str_pad(' in ' . $exception->getFile() . ' on line ' . $exception->getLine(), $max_length) . '|' . "\n";
|
||||
|
||||
echo $horizontal_border;
|
||||
echo '| ' . str_pad('Trace', $maxes['key'] + $maxes['method'] + 3) . ' | ' . str_pad('File', $maxes['file']) . ' | ' . str_pad('Line', $maxes['line']) . ' |' . "\n";
|
||||
echo $horizontal_border;
|
||||
|
||||
foreach ($lines as $line)
|
||||
{
|
||||
echo '| ';
|
||||
|
||||
echo implode(
|
||||
array(
|
||||
str_pad($line['key'], $maxes['key'], ' ', STR_PAD_LEFT),
|
||||
str_pad($line['method'], $maxes['method']),
|
||||
str_pad($line['file'], $maxes['file']),
|
||||
str_pad($line['line'], $maxes['line'], ' ', STR_PAD_LEFT)
|
||||
),
|
||||
' | '
|
||||
);
|
||||
|
||||
echo ' |' . "\n";
|
||||
}
|
||||
|
||||
echo $horizontal_border;
|
||||
}
|
||||
else
|
||||
{
|
||||
?>
|
||||
<style>
|
||||
#pickles-exception
|
||||
{
|
||||
background: #212121;
|
||||
width: 800px;
|
||||
margin: 0 auto;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
border-radius: 20px;
|
||||
-moz-border-radius: 20px;
|
||||
-webkit-border-radius: 20px;
|
||||
box-shadow: 0 3px 4px #000;
|
||||
-moz-box-shadow: 0 3px 4px #000;
|
||||
-webkit-box-shadow: 0 3px 4px #000;
|
||||
border: 6px solid #666;
|
||||
padding: 10px 20px 20px;
|
||||
font-family: monospace;
|
||||
font-size: 12px;
|
||||
text-align: left;
|
||||
}
|
||||
#pickles-exception table
|
||||
{
|
||||
width: 100%;
|
||||
}
|
||||
#pickles-exception table tr th, #pickles-exception table tr td
|
||||
{
|
||||
padding: 10px;
|
||||
}
|
||||
#pickles-exception .even
|
||||
{
|
||||
background-color: #323232;
|
||||
}
|
||||
#pickles-exception, #pickles-exception table tr td, #pickles-exception table tr th
|
||||
{
|
||||
color: #efefe8;
|
||||
}
|
||||
</style>
|
||||
<div id="pickles-exception">
|
||||
<strong style="font-size:1.5em">Uncaught Exception</strong><br /><br />
|
||||
<table style="border-collapse:separate;border-spacing:1px;border-radius:10px;text-shadow:1px 1px 1px #000;text-align:center">
|
||||
<tr><td style="background-color:#480000;padding:10px">
|
||||
<div style="font-size:1.5em;font-style:italic"><?php echo $exception->getMessage(); ?></div>
|
||||
</td></tr>
|
||||
<tr><td style="background-color:#552200;padding:10px">
|
||||
<div style="font-size:1.2em"><?php echo $exception->getFile(); ?> on line <?php echo $exception->getLine(); ?></div>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th style="text-align:left" colspan="2">Trace</th>
|
||||
<th style="text-align:left">File</th>
|
||||
<th style="text-align:right">Line</th>
|
||||
</tr>
|
||||
<?php
|
||||
$trace = $exception->getTrace();
|
||||
rsort($trace);
|
||||
|
||||
foreach ($trace as $key => $data)
|
||||
{
|
||||
$method = '';
|
||||
|
||||
if (isset($data['class']))
|
||||
{
|
||||
$method .= $data['class'] . $data['type'];
|
||||
}
|
||||
|
||||
$method .= $data['function'] . '()';
|
||||
?>
|
||||
<tr>
|
||||
<td style="font-weight:bold;color:#999"><?php echo $key + 1; ?>.</td>
|
||||
<td><?php echo $method; ?></td>
|
||||
<td><?php echo isset($data['file']) ? $data['file'] : __FILE__; ?></td>
|
||||
<td style="text-align:right"><?php echo isset($data['line']) ? $data['line'] : '0'; ?></td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<br /><br />
|
||||
<?php
|
||||
}
|
||||
}
|
||||
|
||||
// }}}
|
||||
|
||||
?>
|
||||
|
|
|
@ -5,20 +5,11 @@ ob_start();
|
|||
require_once '.composer/autoload.php';
|
||||
|
||||
$root = org\bovigo\vfs\vfsStream::setup('site');
|
||||
define('SITE_PATH', org\bovigo\vfs\vfsStream::url('site/'));
|
||||
|
||||
require_once 'classes/Convert.php';
|
||||
require_once 'classes/Date.php';
|
||||
require_once 'classes/Time.php';
|
||||
require_once 'classes/String.php';
|
||||
|
||||
require_once 'classes/Object.php';
|
||||
require_once 'classes/Config.php';
|
||||
require_once 'classes/Display.php';
|
||||
require_once 'classes/File.php';
|
||||
|
||||
require_once 'classes/API/Common.php';
|
||||
require_once 'classes/API/Gravatar.php';
|
||||
if (!defined('SITE_PATH'))
|
||||
{
|
||||
define('SITE_PATH', org\bovigo\vfs\vfsStream::url('site/'));
|
||||
}
|
||||
|
||||
require_once 'pickles.php';
|
||||
|
||||
|
|
176
tests/classes/ControllerTest.php
Normal file
176
tests/classes/ControllerTest.php
Normal file
|
@ -0,0 +1,176 @@
|
|||
<?php
|
||||
|
||||
class ControllerTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
private $config;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
$this->config = Config::getInstance();
|
||||
$this->config->data['pickles']['disabled'] = false;
|
||||
$this->config->data['pickles']['profiler'] = false;
|
||||
$_SERVER['REQUEST_URI'] = '';
|
||||
|
||||
if (!file_exists(SITE_MODULE_PATH))
|
||||
{
|
||||
mkdir(SITE_MODULE_PATH, 0644);
|
||||
}
|
||||
|
||||
unlink(SITE_MODULE_PATH . 'testing.php');
|
||||
|
||||
$_SERVER['HTTP_HOST'] = 'testsite.com';
|
||||
$_SERVER['REQUEST_URI'] = '/home';
|
||||
$_REQUEST['request'] = 'home';
|
||||
|
||||
$module = '<?php class home extends Module { } ?>';
|
||||
|
||||
file_put_contents(SITE_MODULE_PATH . 'home.php', $module);
|
||||
}
|
||||
|
||||
public function testSiteDown()
|
||||
{
|
||||
$_SERVER['SERVER_NAME'] = 'Test Server';
|
||||
|
||||
$this->config->data['pickles']['disabled'] = true;
|
||||
|
||||
$this->expectOutputRegex('/Test Server is currently down for maintenance/');
|
||||
|
||||
new Controller();
|
||||
}
|
||||
|
||||
/*
|
||||
public function testCustomSiteDown()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testAttributesInURI()
|
||||
{
|
||||
/testing/id:123/foo:bar
|
||||
$this->fail();
|
||||
}
|
||||
*/
|
||||
|
||||
public function testUpperCaseURI()
|
||||
{
|
||||
$_SERVER['REQUEST_URI'] = '/TESTING';
|
||||
$_REQUEST['request'] = 'TESTING';
|
||||
|
||||
new Controller();
|
||||
|
||||
$this->assertTrue(in_array('Location: /testing', xdebug_get_headers()));
|
||||
}
|
||||
|
||||
public function testForceSecure()
|
||||
{
|
||||
$_SERVER['REQUEST_URI'] = '/secure';
|
||||
$_REQUEST['request'] = 'secure';
|
||||
|
||||
$module = '
|
||||
<?php
|
||||
class secure extends Module
|
||||
{
|
||||
public $secure = true;
|
||||
}
|
||||
?>
|
||||
';
|
||||
|
||||
file_put_contents(SITE_MODULE_PATH . 'secure.php', $module);
|
||||
|
||||
new Controller();
|
||||
|
||||
$this->assertTrue(in_array('Location: https://testsite.com/secure', xdebug_get_headers()));
|
||||
}
|
||||
|
||||
public function testForceInsecure()
|
||||
{
|
||||
$_SERVER['HTTPS'] = 'on';
|
||||
$_SERVER['REQUEST_URI'] = '/insecure';
|
||||
$_REQUEST['request'] = 'insecure';
|
||||
|
||||
$module = '
|
||||
<?php
|
||||
class insecure extends Module
|
||||
{
|
||||
public $secure = false;
|
||||
}
|
||||
?>
|
||||
';
|
||||
|
||||
file_put_contents(SITE_MODULE_PATH . 'insecure.php', $module);
|
||||
|
||||
new Controller();
|
||||
|
||||
$this->assertTrue(in_array('Location: http://testsite.com/insecure', xdebug_get_headers()));
|
||||
}
|
||||
|
||||
/*
|
||||
public function testNotAuthenticated()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testNotAuthenticatedPOST()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testAuthenticated()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testHasLevelAccess()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testIsLevelAccess()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testRoleDefaultMethod()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testBadRequestMethod()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
// @todo Reuse one of the Module tests?
|
||||
public function testValidationErrors()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testError404()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
public function testCustomError404()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
|
||||
// @todo Reuse one of the Display tests?
|
||||
public function testOutput()
|
||||
{
|
||||
$this->fail();
|
||||
}
|
||||
*/
|
||||
|
||||
public function testProfilerOutput()
|
||||
{
|
||||
$this->config->data['pickles']['profiler'] = true;
|
||||
|
||||
$this->expectOutputRegex('/id="pickles-profiler"/');
|
||||
|
||||
new Controller();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Loading…
Add table
Add a link
Reference in a new issue