blob: b24ebcdbbec7442eec149994e241f0616133d6c9 [file] [log] [blame]
<?php
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
namespace TodoList;
use \TodoList\Exception\NotFoundException;
use \TodoList\Flash\Flash;
/**
* Main application class.
*/
final class Index {
const DEFAULT_PAGE = 'home';
const PAGE_DIR = '../page/';
const LAYOUT_DIR = '../layout/';
private static $CLASSES = [
'TodoList\Config\Config' => '/../config/Config.php',
'TodoList\Flash\Flash' => '/../flash/Flash.php',
'TodoList\Exception\NotFoundException' => '/../exception/NotFoundException.php',
'TodoList\Dao\TodoDao' => '/../dao/TodoDao.php',
'TodoList\Dao\TodoSearchCriteria' => '/../dao/TodoSearchCriteria.php',
'TodoList\Mapping\TodoMapper' => '/../mapping/TodoMapper.php',
'TodoList\Model\Todo' => '/../model/Todo.php',
'TodoList\Validation\TodoValidator' => '/../validation/TodoValidator.php',
'TodoList\Validation\ValidationError' => '/../validation/ValidationError.php',
'TodoList\Util\Utils' => '/../util/Utils.php',
];
/**
* System config.
*/
public function init() {
// error reporting - all errors for development (ensure you have display_errors = On in your php.ini file)
error_reporting(E_ALL | E_STRICT);
mb_internal_encoding('UTF-8');
set_exception_handler([$this, 'handleException']);
spl_autoload_register([$this, 'loadClass']);
// session
session_start();
}
/**
* Run the application!
*/
public function run() {
$this->runPage($this->getPage());
}
/**
* Exception handler.
*/
public function handleException($ex) {
$extra = ['message' => $ex->getMessage()];
if ($ex instanceof NotFoundException) {
header('HTTP/1.0 404 Not Found');
$this->runPage('404', $extra);
} else {
// TODO log exception
header('HTTP/1.1 500 Internal Server Error');
$this->runPage('500', $extra);
}
}
/**
* Class loader.
*/
public function loadClass($name) {
if (!array_key_exists($name, self::$CLASSES)) {
die('Class "' . $name . '" not found.');
}
require_once __DIR__ . self::$CLASSES[$name];
}
private function getPage() {
$page = self::DEFAULT_PAGE;
if (array_key_exists('page', $_GET)) {
$page = $_GET['page'];
}
return $this->checkPage($page);
}
private function checkPage($page) {
if (!preg_match('/^[a-z0-9-]+$/i', $page)) {
// TODO log attempt, redirect attacker, ...
throw new NotFoundException('Unsafe page "' . $page . '" requested');
}
if (!$this->hasScript($page)
&& !$this->hasTemplate($page)) {
// TODO log attempt, redirect attacker, ...
throw new NotFoundException('Page "' . $page . '" not found');
}
return $page;
}
private function runPage($page, array $extra = []) {
$run = false;
if ($this->hasScript($page)) {
$run = true;
require $this->getScript($page);
}
if ($this->hasTemplate($page)) {
$run = true;
// data for main template
$template = $this->getTemplate($page);
$flashes = null;
if (Flash::hasFlashes()) {
$flashes = Flash::getFlashes();
}
// main template (layout)
require self::LAYOUT_DIR . 'index.phtml';
}
if (!$run) {
die('Page "' . $page . '" has neither script nor template!');
}
}
private function getScript($page) {
return self::PAGE_DIR . $page . '.php';
}
private function getTemplate($page) {
return self::PAGE_DIR . $page . '.phtml';
}
private function hasScript($page) {
return file_exists($this->getScript($page));
}
private function hasTemplate($page) {
return file_exists($this->getTemplate($page));
}
}
$index = new \TodoList\Index();
$index->init();
// run application!
$index->run();