Kirby \ Exception \ LogicException (error.logic)
Disallowed output from file /home/mmvjnko/www/site/plugins/kirby-professional/controllers/login.php:1, possible accidental whitespace? Kirby\Exception\LogicException thrown with message "Disallowed output from file /home/mmvjnko/www/site/plugins/kirby-professional/controllers/login.php:1, possible accidental whitespace?" Stacktrace: #6 Kirby\Exception\LogicException in /home/mmvjnko/www/kirby/src/Http/Response.php:214 #5 Kirby\Http\Response:guardAgainstOutput in /home/mmvjnko/www/kirby/src/Filesystem/F.php:443 #4 Kirby\Filesystem\F:loadOnce in /home/mmvjnko/www/kirby/src/Cms/AppPlugins.php:797 #3 Kirby\Cms\App:pluginsLoader in /home/mmvjnko/www/kirby/src/Cms/AppPlugins.php:764 #2 Kirby\Cms\App:plugins in /home/mmvjnko/www/kirby/src/Cms/AppPlugins.php:640 #1 Kirby\Cms\App:extensionsFromPlugins in /home/mmvjnko/www/kirby/src/Cms/App.php:146 #0 Kirby\Cms\App:__construct in /home/mmvjnko/www/index.php:5
Stack frames (7)
6
Kirby\Exception\LogicException
/kirby/src/Http/Response.php214
5
Kirby\Http\Response guardAgainstOutput
/kirby/src/Filesystem/F.php443
4
Kirby\Filesystem\F loadOnce
/kirby/src/Cms/AppPlugins.php797
3
Kirby\Cms\App pluginsLoader
/kirby/src/Cms/AppPlugins.php764
2
Kirby\Cms\App plugins
/kirby/src/Cms/AppPlugins.php640
1
Kirby\Cms\App extensionsFromPlugins
/kirby/src/Cms/App.php146
0
Kirby\Cms\App __construct
/index.php5
/home/mmvjnko/www/kirby/src/Http/Response.php
     *
     * @codeCoverageIgnore
     */
    public static function go(string $url = '/', int $code = 302): never
    {
        die(static::redirect($url, $code));
    }
 
    /**
     * Ensures that the callback does not produce the first body output
     * (used to show when loading a file creates side effects)
     */
    public static function guardAgainstOutput(Closure $callback, ...$args): mixed
    {
        $before = headers_sent();
        $result = $callback(...$args);
        $after  = headers_sent($file, $line);
 
        if ($before === false && $after === true) {
            throw new LogicException("Disallowed output from file $file:$line, possible accidental whitespace?");
        }
 
        return $result;
    }
 
    /**
     * Getter for single headers
     *
     * @param string $key Name of the header
     */
    public function header(string $key): string|null
    {
        return $this->headers[$key] ?? null;
    }
 
    /**
     * Getter for all headers
     */
    public function headers(): array
    {
/home/mmvjnko/www/kirby/src/Filesystem/F.php
 
        return include $___file___;
    }
 
    /**
     * Loads a file using `include_once()` and
     * returns whether loading was successful
     */
    public static function loadOnce(
        string $file,
        bool $allowOutput = true
    ): bool {
        if (is_file($file) === false) {
            return false;
        }
 
        $callback = fn () => include_once $file;
 
        if ($allowOutput === false) {
            Response::guardAgainstOutput($callback);
        } else {
            $callback();
        }
 
        return true;
    }
 
    /**
     * Returns the mime type of a file
     */
    public static function mime(string $file): string|null
    {
        return Mime::type($file);
    }
 
    /**
     * Converts a mime type to a file extension
     */
    public static function mimeToExtension(string|null $mime = null): string|false
    {
/home/mmvjnko/www/kirby/src/Cms/AppPlugins.php
        $root   = $this->root('plugins');
        $loaded = [];
 
        foreach (Dir::read($root) as $dirname) {
            if (in_array(substr($dirname, 0, 1), ['.', '_']) === true) {
                continue;
            }
 
            $dir = $root . '/' . $dirname;
 
            if (is_dir($dir) !== true) {
                continue;
            }
 
            $entry  = $dir . '/index.php';
            $script = $dir . '/index.js';
            $styles = $dir . '/index.css';
 
            if (is_file($entry) === true) {
                F::loadOnce($entry, allowOutput: false);
            } elseif (is_file($script) === true || is_file($styles) === true) {
                // if no PHP file is present but an index.js or index.css,
                // register as anonymous plugin (without actual extensions)
                // to be picked up by the Panel\Document class when
                // rendering the Panel view
                static::plugin(
                    name: 'plugins/' . $dirname,
                    extends: [],
                    root: $dir
                );
            } else {
                continue;
            }
 
            $loaded[] = $dir;
        }
 
        return $loaded;
    }
}
/home/mmvjnko/www/kirby/src/Cms/AppPlugins.php
     * Loading only happens on the first call.
     *
     * @internal
     * @param array|null $plugins Can be used to overwrite the plugins registry
     */
    public function plugins(array $plugins = null): array
    {
        // overwrite the existing plugins registry
        if ($plugins !== null) {
            $this->pluginsAreLoaded = true;
            return static::$plugins = $plugins;
        }
 
        // don't load plugins twice
        if ($this->pluginsAreLoaded === true) {
            return static::$plugins;
        }
 
        // load all plugins from site/plugins
        $this->pluginsLoader();
 
        // mark plugins as loaded to stop doing it twice
        $this->pluginsAreLoaded = true;
        return static::$plugins;
    }
 
    /**
     * Loads all plugins from site/plugins
     *
     * @return array Array of loaded directories
     */
    protected function pluginsLoader(): array
    {
        $root   = $this->root('plugins');
        $loaded = [];
 
        foreach (Dir::read($root) as $dirname) {
            if (in_array(substr($dirname, 0, 1), ['.', '_']) === true) {
                continue;
            }
/home/mmvjnko/www/kirby/src/Cms/AppPlugins.php
     * the options array. I.e. hooks and routes can be
     * setup from the config.
     */
    protected function extensionsFromOptions(): void
    {
        // register routes and hooks from options
        $this->extend([
            'api'    => $this->options['api']    ?? [],
            'routes' => $this->options['routes'] ?? [],
            'hooks'  => $this->options['hooks']  ?? []
        ]);
    }
 
    /**
     * Apply all plugin extensions
     */
    protected function extensionsFromPlugins(): void
    {
        // register all their extensions
        foreach ($this->plugins() as $plugin) {
            $extends = $plugin->extends();
 
            if (empty($extends) === false) {
                $this->extend($extends, $plugin);
            }
        }
    }
 
    /**
     * Apply all passed extensions
     */
    protected function extensionsFromProps(array $props): void
    {
        $this->extend($props);
    }
 
    /**
     * Apply all default extensions
     */
    protected function extensionsFromSystem(): void
/home/mmvjnko/www/kirby/src/Cms/App.php
 
        // configurable properties
        $this->setLanguages($props['languages'] ?? null);
        $this->setRoles($props['roles'] ?? null);
        $this->setSite($props['site'] ?? null);
        $this->setUser($props['user'] ?? null);
        $this->setUsers($props['users'] ?? null);
 
        // set the singleton
        if (static::$instance === null || $setInstance === true) {
            static::$instance = ModelWithContent::$kirby = Model::$kirby =  $this;
        }
 
        // setup the I18n class with the translation loader
        $this->i18n();
 
        // load all extensions
        $this->extensionsFromSystem();
        $this->extensionsFromProps($props);
        $this->extensionsFromPlugins();
        $this->extensionsFromOptions();
        $this->extensionsFromFolders();
 
        // trigger hook for use in plugins
        $this->trigger('system.loadPlugins:after');
 
        // execute a ready callback from the config
        $this->optionsFromReadyCallback();
 
        // bake config
        $this->bakeOptions();
    }
 
    /**
     * Improved `var_dump` output
     *
     * @codeCoverageIgnore
     */
    public function __debugInfo(): array
    {
/home/mmvjnko/www/index.php
<?php
 
require 'kirby/bootstrap.php';
 
echo (new Kirby)->render();
 

Environment & details:

empty
empty
empty
empty
empty
Key Value
PATH /usr/local/bin:/usr/bin:/bin
REDIRECT_STATUS 200
UNIQUE_ID aRo6ZWn48OzgIpYKggMuKAAALQ4
GEOIP_COUNTRY_CODE US
GEOIP_COUNTRY_NAME United States
GEOIP_DMA_CODE 0
GEOIP_AREA_CODE 0
GEOIP_LATITUDE 37.750999
GEOIP_LONGITUDE -97.821999
SCRIPT_URL /fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
SCRIPT_URI https://www.lesroyalesmarionnettes.be:443/fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
HTTPS on
CFG_CLUSTER cluster130
ENVIRONMENT production
APP_ENGINE_VERSION 8.2
APP_ENGINE phpcgi
HTTP_HOST www.lesroyalesmarionnettes.be
HTTP_X_PREDICTOR 1
HTTP_X_FORWARDED_FOR 18.97.14.90
HTTP_X_FORWARDED_PROTO https
HTTP_X_OVHREQUEST_ID 84dfda8e4728cf2263785e5b50893148
HTTP_USER_AGENT CCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGE en-US,en;q=0.5
HTTP_ACCEPT_ENCODING br,gzip
HTTP_REMOTE_IP 18.97.14.90
SERVER_SIGNATURE
SERVER_SOFTWARE Apache
SERVER_NAME www.lesroyalesmarionnettes.be
SERVER_ADDR 10.130.20.20
SERVER_PORT 443
REMOTE_ADDR 18.97.14.90
DOCUMENT_ROOT /home/mmvjnko/www
SERVER_ADMIN postmaster@www.lesroyalesmarionnettes.be
SCRIPT_FILENAME /home/mmvjnko/www/index.php
REMOTE_PORT 33398
REDIRECT_URL /fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
GATEWAY_INTERFACE CGI/1.1
SERVER_PROTOCOL HTTP/1.1
REQUEST_METHOD GET
QUERY_STRING
REQUEST_URI /fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
SCRIPT_NAME /index.php
HOME /homez.1036/mmvjnko
PWD /homez.1036/mmvjnko/www
UID mmvjnko
PHP_SELF /index.php
REQUEST_TIME_FLOAT 1763326565.2788
REQUEST_TIME 1763326565
argv Array ( [0] => index.php )
argc 1
Key Value
PATH /usr/local/bin:/usr/bin:/bin
REDIRECT_STATUS 200
UNIQUE_ID aRo6ZWn48OzgIpYKggMuKAAALQ4
GEOIP_COUNTRY_CODE US
GEOIP_COUNTRY_NAME United States
GEOIP_DMA_CODE 0
GEOIP_AREA_CODE 0
GEOIP_LATITUDE 37.750999
GEOIP_LONGITUDE -97.821999
SCRIPT_URL /fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
SCRIPT_URI https://www.lesroyalesmarionnettes.be:443/fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
HTTPS on
CFG_CLUSTER cluster130
ENVIRONMENT production
APP_ENGINE_VERSION 8.2
APP_ENGINE phpcgi
HTTP_HOST www.lesroyalesmarionnettes.be
HTTP_X_PREDICTOR 1
HTTP_X_FORWARDED_FOR 18.97.14.90
HTTP_X_FORWARDED_PROTO https
HTTP_X_OVHREQUEST_ID 84dfda8e4728cf2263785e5b50893148
HTTP_USER_AGENT CCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGE en-US,en;q=0.5
HTTP_ACCEPT_ENCODING br,gzip
HTTP_REMOTE_IP 18.97.14.90
SERVER_SIGNATURE
SERVER_SOFTWARE Apache
SERVER_NAME www.lesroyalesmarionnettes.be
SERVER_ADDR 10.130.20.20
SERVER_PORT 443
REMOTE_ADDR 18.97.14.90
DOCUMENT_ROOT /home/mmvjnko/www
SERVER_ADMIN postmaster@www.lesroyalesmarionnettes.be
SCRIPT_FILENAME /home/mmvjnko/www/index.php
REMOTE_PORT 33398
REDIRECT_URL /fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
GATEWAY_INTERFACE CGI/1.1
SERVER_PROTOCOL HTTP/1.1
REQUEST_METHOD GET
QUERY_STRING
REQUEST_URI /fr/actualites/conference-spectacle-culture-populaire-arme-de-construction-massive
SCRIPT_NAME /index.php
HOME /homez.1036/mmvjnko
PWD /homez.1036/mmvjnko/www
UID mmvjnko
0. Whoops\Handler\PrettyPageHandler
1. Whoops\Handler\CallbackHandler