Hallo PHP hulpers,

Ik ben momenteel bezig met een script om pagina's weer te laten geven. Mijn code is als volgt:

Page class

<?php
    namespace src\Handlers\Page;
    use src\Handlers\User as Handlers;

    class Page {
        public static $requestedPage;
        public static $viewPath;

        public static function getPage($uri) {
            $path = explode('/', $uri);
            $lengthAssetUrl = count(explode('/', APP['asset_url']));

            if (Handlers\User::isLoggedIn() === true) {
                self::$requestedPage = $path[$lengthAssetUrl+1];
                self::$viewPath = __BASE__.'/resources/views/panel/';
            } else {
                self::$requestedPage = $path[$lengthAssetUrl];
                self::$viewPath = __BASE__.'/resources/views/landing/';
            }
        }

        public static function showPage() {
            switch(self::$requestedPage) {
                case LANG['login']:
                    self::checkPath(self::$viewPath.'login.php');
                    break;
                case LANG['register']:
                    include self::$viewPath.'register.php';
                    break;
                case LANG['passforgot']:
                    include self::$viewPath.'passforgot.php';
                    break;
                default:
                    self::errorPages('404');
                    break;
            }
        }

        public static function checkPath($path) {
            if (file_exists($path)) {
                if (Handlers\User::permissionForPage(null, self::$requestedPage) === true) {
                    include $path;
                } else {
                    self::errorPages('101');
                }
            } else {
                self::errorPages('404');
            }
        }

        public static function errorPages($error) {
            switch($error) {
                case '404':
                    include __BASE__.'/resources/views/error/404.php';
                    break;
                case '101':
                    include __BASE__.'/resources/views/error/101.php';
                    break;
            }
        }
    }
?>


User class (provisorisch)

<?php
    namespace src\Handlers\User;

    class User {

        public static function isLoggedIn() {
            if(isset($_SESSION['id'])) {
                return true;
            } else {
                return false;
            }
        }

        public static function permissionForPage($userId, $page) {
            if ($userId === null) {
                switch($page) {
                    case LANG['login']:
                        return true;
                        break;
                    case LANG['register']:
                        return true;
                        break;
                    case LANG['passforgot']:
                        return true;
                        break;
                    default:
                        return false;
                        break;
                }
            }
        }
    }
?>


Index

<?php
    include 'bin/panelr.php';

    use src\Handlers\Page as Handlers;

    Handlers\Page::getPage($uri);
    Handlers\Page::showPage();
?>


Zoals te zien is in de code hierboven gebruik ik voor elke pagina een case en in die case controleer ik of de pagina bestaat en of de gebruiker toegang heeft tot die pagina. Nu zijn het nog maar drie pagina's dus die switch case is niet al te lang. Maar als ik straks 20+ pagina's heb, loopt het erg op. Ik heb mijn brein er even over laten breken maar ik zie het zo 1,2,3 niet hoe ik ervoor kan zorgen dat de code niet zo ultiem lang wordt door een pagina toe te voegen. De urls van de website verschillen per taal, deze worden vastgesteld in het vertaalbestand die LANG defined.

Een voorbeeld van een $uri is als volgt: /panelr/login Hier moet dus de login pagina worden weergegeven en gecontroleerd worden of de gebruiker deze pagina mag zien. Maar $uri kan ook zo zijn: /panelr/inloggen (vandaar dus LANG['login']).

Graag zou ik jullie visie hierop willen. Alvast bedankt voor de moeite!
1) Volgens mij moet je User::permissionForPage() gewoon in de Page class plaatsen (het heeft meer met Page te maken, dan met User). Misschien ga je in de toekomst nog een specifiek recht controleren: dat doe je dan in de User class, maar de combinatie met de pagina zou ik in de Page class houden.

2) Als je zo consequent werkt (de "login" pagina heet in de $LANG "login", het script bestand heet dan "login.php", en het recht heet ook weer "login"), dan zou ik in de Page gewoon een lijstje (array) met toegestane pagina's maken (en evt. wat opties, bijvoorbeeld of je wel/niet de permission moet checken). Dan wordt het:
<?php

  public $pages = ['login','register','passforgot']; //enz

  public static function showPage() {
    foreach($this->pages as $page) if($page == self::$requestedPage){
      self::checkPath(self::$viewPath . $page . '.php');
      return;
    }
    self::errorPages('404'); //alleen indien geen matchende pagina
  }

?>
Dankjewel Rob Doemaarwat! Enige fout is dat $this->pages self::$pages moet zijn en public $pages public static $pages, anders krijg je een error ;) Hier kan ik in ieder geval mee vooruit, nogmaals bedankt!

Reageren