<?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();
Messung V0.5 in Prozent C=94 H=91 G=92
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland