*/ class core extends controller { /** * Postfix for name of controllers files */ final public const POSTFIX = ''; /** * Instance of a session */ protected readonly session session; /** * Instance of an account */ protected readonly ?account account; /** * Registry of errors */ protected array errors = [ 'session' => [], 'account' => [] ]; /** * Constructor of an instance * * @param bool initialize Initialize a controller? * * @return void */ public function __construct(bool initialize = true) { // Blocking requests from CloudFlare (better to write this blocking into nginx config file) if (_SERVER['HTTP_USER_AGENT'] === 'nginx-ssl early hints') return; // For the extends system parent::__construct(initialize); if (initialize) { // Initializing is requested // Initializing of models core (connect to ArangoDB...) new models(); // Initializing of the date until which the session will be active expires = strtotime('+1 week'); // Initializing of default value of hash of the session _COOKIE["session"] ??= null; // Initializing of session this->session = new session(_COOKIE["session"], expires, this->errors['session']); // Handle a problems with initializing a session if (!empty(this->errors['session'])) die; else if (_COOKIE["session"] !== this->session->hash) { // Hash of the session is changed (implies that the session has expired and recreated) // Write a new hash of the session to cookies setcookie( 'session', this->session->hash, [ 'expires' => expires, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'strict' ] ); } // Initializing of preprocessor of views this->view = new templater(this->session); } } /** * Check of initialization * * Checks whether a property is initialized in a document instance from ArangoDB * * @param string name Name of the property from ArangoDB * * @return bool The property is initialized? */ public function __isset(string name): bool { // Check of initialization of the property and exit (success) return match (name) { default => isset(this->{name}) }; } }