Add 404 error handler and update permission data structure

This commit is contained in:
Kijin Sung 2020-06-18 14:13:23 +09:00
parent e20c06bf00
commit 5fa72f8629
7 changed files with 49 additions and 29 deletions

View file

@ -49,10 +49,9 @@ class ModuleActionParser
$info->route->GET = [];
$info->route->POST = [];
$info->action = new \stdClass;
$info->menu = new \stdClass;
$info->grant = new \stdClass;
$info->permission = new \stdClass;
$info->permission_check = new \stdClass;
$info->menu = new \stdClass;
$info->error_handlers = [];
// Parse grants.
foreach ($xml->grants->grant ?: [] as $grant)
@ -64,19 +63,6 @@ class ModuleActionParser
$info->grant->{$grant_name} = $grant_info;
}
// Parse permissions not defined in the <actions> section.
foreach ($xml->permissions->permission ?: [] as $permission)
{
$action_name = trim($permission['action']);
$permission = trim($permission['target']);
$info->permission->{$action_name} = $permission;
$check = new \stdClass;
$check->key = trim($permission['check_var']) ?: trim($permission['check-var']);
$check->type = trim($permission['check_type']) ?: trim($permission['check-type']);
$info->permission_check->{$action_name} = $check;
}
// Parse menus.
foreach ($xml->menus->menu ?: [] as $menu)
{
@ -95,15 +81,12 @@ class ModuleActionParser
// Parse permissions.
$action_name = trim($action['name']);
$permission = trim($action['permission']);
$permission_info = (object)['target' => '', 'check_var' => '', 'check_type' => ''];
if ($permission)
{
$info->permission->{$action_name} = $permission;
if (isset($info->permission_check->{$action_name}))
{
$info->permission_check->{$action_name} = new \stdClass;
}
$info->permission_check->{$action_name}->key = trim($action['check_var']) ?: trim($action['check-var']);
$info->permission_check->{$action_name}->type = trim($action['check_type']) ?: trim($action['check-type']);
$permission_info->target = $permission;
$permission_info->check_var = trim($action['check_var']) ?: trim($action['check-var']);
$permission_info->check_type = trim($action['check_type']) ?: trim($action['check-type']);
}
// Parse routes.
@ -136,6 +119,7 @@ class ModuleActionParser
$action_info = new \stdClass;
$action_info->type = trim($action['type']);
$action_info->grant = trim($action['grant']) ?: 'guest';
$action_info->permission = $permission_info;
$action_info->ruleset = trim($action['ruleset']);
$action_info->method = $method;
$action_info->route = $route_arg;
@ -171,6 +155,28 @@ class ModuleActionParser
{
$info->simple_setup_index_act = $action_name;
}
// Set error handler settings.
$error_handlers = explode(',', trim($action['error_handlers']) ?: trim($action['error-handlers']));
foreach ($error_handlers as $error_handler)
{
if (intval($error_handler) > 200)
{
$info->error_handlers[intval($error_handler)] = $action_name;
}
}
}
// Parse permissions not defined in the <actions> section.
foreach ($xml->permissions->permission ?: [] as $permission)
{
$action_name = trim($permission['action']);
if (isset($info->action->{$action_name}))
{
$info->action->{$action_name}->permission->target = trim($permission['target']);
$info->action->{$action_name}->permission->check_var = trim($permission['check_var']) ?: trim($permission['check-var']);
$info->action->{$action_name}->permission->check_type = trim($permission['check_type']) ?: trim($permission['check-type']);
}
}
// Return the complete result.

View file

@ -83,6 +83,7 @@ class ModuleInfoParser
$info->default_index_act = $action_info->default_index_act;
$info->setup_index_act = $action_info->setup_index_act;
$info->simple_setup_index_act = $action_info->simple_setup_index_act;
$info->error_handlers = $action_info->error_handlers ?: [];
// Return the complete result.
return $info;

View file

@ -156,6 +156,13 @@ class Router
$allargs = array_merge(['mid' => $prefix, 'act' => $internal_url], $args);
return (object)['status' => 200, 'url' => $url, 'args' => $allargs];
}
// If the module defines a 404 error handler, call it.
if ($internal_url && isset($action_info->error_handlers[404]))
{
$allargs = array_merge(['mid' => $prefix, 'act' => $action_info->error_handlers[404]], $args);
return (object)['status' => 200, 'url' => $url, 'args' => $allargs];
}
}
}