Bonjour,
Voila je suis le tuto de Grafikart "creer un site de A à Z" (structure en MVC), Actuellement au jour 5 du tuto, après l'ajout d'un fichier hook.php j'obtient une erreur.

Voici le contructeur, qui require le fichier qui fait planter:

    /**
    * Contructeur
    * @param $request, Objet request de notre application
    **/
    function __construct($request = null){
        if($request){
            $this->request = $request; // on stocke la request dans l'instance
        }
        require ROOT.DS.'config'.DS.'hook.php';
    }

Mon conf.php

    <?php
    class Conf{

        static $debug = 1;

        static $databases = array(
            'default' => array(
            'host' => 'localhost',
            'database' => 'test',
            'login' => 'root',
            'password' => 'root',
            )
        );
    }

    Router::prefix('cockpit','admin');
    Router::connect('/','posts/index');
    Router::connect('post/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
    Router::connect('blog/:action','posts/:action');

Mon fichier Hook.php (qui fait afficher une erreur: Notice: Trying to get property of non-object in ... on line 2)

    <?php
    if($this->request->prefix == 'admin'){
        $this->layout = 'admin';
    }
    ?>

Le début de ma page Router.php (si jamais ca peut servir)

    <?php
    class Router{
        static $routes = array();
        static $prefixes = array();
        static function prefix($url,$prefix){
            self::$prefixes[$url] = $prefix;
    }

Ma page admin.php qui est dans layout

    <!DOCTYPE html>
    <html lang="fr">
        <head>
            <title><?php echo isset($title_for_layout)?$title_for_layout: 'Administration'; ?></title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
        </head>
    <body>
        <nav class="navbar navbar-inverse">
            <div class="container">
                <div class="navbar-header">
                    <a class="navbar-brand" href="<?php echo Router::url('admin/posts/index') ?>">Administration</a>
                </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a href="<?php echo Router::url('admin/posts/index') ?>">Articles</a></li>
                    <li><a href="<?php echo Router::url('admin/posts/index') ?>" >Pages</a></li>
                </ul>
            </div><!--/.nav-collapse -->
            </div>
      </nav>
        <div class="container">
            <div class="jumbotron">
                <?php echo $this->Session->flash(); ?>
                <?php echo $content_for_layout; ?>           
            </div>
        </div>
    </body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    </html>

J'aimerai bien que cette erreur disparaisse car elle m'empeche d'avancer, m'empechant d'etre rediriger vers admin.php dans mon layout

J'espere que quelqu'un poura m'éclairer puisque dans le tuto tout se passe bien mais pas chez moi ... ne sachant pas trop comment rebondir je viens vers vous esperant trouver une réponse qui poura m'aider et aider ceux qui sont dans le meme cas que moi,

Merci

3 réponses


betaWeb
Réponse acceptée

Salut,

L'erreur parle d'elle-même : tu essaye d'accéder à une propriété d'une variable qui n'est PAS un objet.
Dans ton controller, tu as déclaré la propriété "request" (public $request;) ?
A quel endroit assigne-tu $this->request->prefix ?

<?php
    if(isset($this->request) && $this->request->prefix == 'admin'){
        $this->layout = 'admin';
    }
?>
McDev
Auteur
Réponse acceptée

j'ai trouvé la solution , dans mon controller.php j'ai remplacé:

        ob_start();
        require($view);
        $content_for_layout = ob_get_clean();
        require ROOT.DS.'view'.DS.'layout'.DS.'default.php';
        $this->rendered = true;
    }

Par:

        ob_start();
        require($view);
        $content_for_layout = ob_get_clean();
        require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
        $this->rendered = true;
    }
McDev
Auteur

Oups ^^désolé, une erreur stupide apparement mais j'suis novice ... j'en laisse passé encore pas mal, merci bcp en tt cas :)

Ca marche, ca m'affiche "http://localhost/Tuto/Site/cockpit/posts/index"

Cependant ca pointe toujours sur mon layout defaut.php et non index.php, comment puis je réglé ce dernier détail ? :)