<?php
namespace ticky;
use ticky\helper\file;
class filter {
public static function globals() {
return self::handler('globals');
}
public static function module() {
return self::handler('module');
}
public static function controller($filter, array $only = [], array $except = []) {
self::load($filter);
$namespace = app::$namespace . '\\' . MODULE_NAME . '\\filter\\';
$filter = $namespace . $filter;
$handler = new $filter();
if (!method_exists($handler, 'run')) {
throw new exception('Filter ' . $filter . ' must has run method');
}
if (array_filter($only) && !in_array(ACTION_NAME, $only)) {
return true;
} elseif (array_filter($except) && in_array(ACTION_NAME, $except)) {
return true;
}
$result = $handler->run();
if ($result !== true) {
throw new exception($result);
}
return true;
}
private static function load($filter) {
if (is_file($include = FILTER_PATH . DS . APP_ENV . DS . $filter . '.php')) {
$file = $include;
} elseif (is_file($include = FILTER_PATH . DS . $filter . '.php')) {
$file = $include;
} elseif (is_file($include = FILTER . DS . APP_ENV . DS . FILTER . '.php')) {
$file = $include;
} elseif (is_file($include = FILTER . DS . $filter . '.php')) {
$file = $include;
}
return file::load($file);
}
private static function handler($type = 'module') {
switch ($type) {
case 'globals':
$file = CONFIG . DS . 'filter.php';
if (is_file($file)) {
$name = 'common';
$rule = config::get($file, 'rule');
}
break;
case 'module':
$file = CONFIG_PATH . DS . 'filter.php';
if (is_file($file)) {
$name = MODULE_NAME;
$rule = config::get($file, 'rule');
}
break;
}
if (!isset($rule)) {
return false;
}
$namespace = app::$namespace . "\\{$name}\\filter\\";
$filters = explode(',', $rule);
foreach ($filters as $filter) {
$filter = $namespace . $filter;
$handler = new $filter();
if (!method_exists($handler, 'run')) {
throw new exception('Filter ' . $filter . ' must has run method');
}
$result = $handler->run();
if ($result !== true) {
throw new exception($result);
}
}
return true;
}
}