****Bonjour,
J'essaye depuis plusieurs jours de resoudre un probleme de deconnexion avec Cakephp3.
J'ai suivi le tutoriel "auth" sur la documentation.
Pour l'inscription/connexion tout est OK
le seul probleme c'est lorsque je souhaite me deconnecte /users/logout
j'ai cette erreur que je ne comprends pas:

Error: Call to undefined method Cake\Controller\Component\AuthComponent::redirect()
File /media/htdocs/cakephp/vendor/cakephp/cakephp/src/Controller/Component/AuthComponent.php
Line: 632

Si vous avez une idee ?

Merci d'avance.

23 réponses


Montre ton code, tu as bien utiliser les use ?
L'erreur est explicite, il n'arrive pas à définir la classe statique redirect, donc dans le AppController elle ne doit pas être chargé

Houdette
Auteur

Oui, voici les use utilise:
namespace App\Controller:
use App\Controller\AppController;
use Cake\Event\Event;
use Cake\Network\Exception\NotFoundException;
use App\Controller\AuthComponent;

La methode beforeFilter:

public function beforeFilter(Event $event)
{
    parent::beforeFilter($event);
    $this->Auth->allow(['add','logout']);

}

Et Logout:

    public function logout()
{
    return $this->redirect($this->Auth->logout());
    $this->Flash->success('Vous êtes maintenant déconnecté.');
}

EDIT:

Si, la classe est bien charge j'utilise redirect pour le login par exemple:

public function login(){

    if($this->Auth->user()){

        //return $this->redirect($this->Auth->redirectUrl('users/index'));

    }
    if ($this->request->is('post')) {

        $user = $this->Auth->identify();

        if ($user) {

            $this->Auth->setUser($user);
          return $this->redirect($this->Auth->redirectUrl('users/index'));

        }

        $this->Flash->error(__("Nom d'utilisateur ou mot de passe incorrect, essayez à nouveau."));
    }
}

Dans le AppControlle tu as bien

$this->loadComponent('Auth'); 
Houdette
Auteur

Oui bien sur, voici le code:

public function initialize()
{
$this->loadComponent('Flash');

    $this->loadComponent('Auth', [
        'authenticate' => [
            'Form' => [
                'fields' => ['username' => 'email', 'password' => 'password']]]
]);}

essaye redirectUrl(); seul sans rien dedans ?

Houdette
Auteur

J'ai deja essayer mais sans success :/
J'ai la meme erreur.

Houdette
Auteur

Bonjour,

J'ai exactement fait ca:

public function logout()
{
    $this->Auth->logout();
    $this->Flash->success('Vous êtes maintenant déconnecté.');
    return $this->redirect($this->Auth->redirectUrl('users/login'));

}

Mais toujours le meme probleme:
Error: Call to undefined method Cake\Controller\Component\AuthComponent::redirect()

Je pense que c'est soi le ('user/login') qui bloque ou soit un problème au niveau de l'AppController

Houdette
Auteur

Pour la le Controlleur Users

<?php

namespace App\Controller;

use App\Controller\AppController;
use Cake\Event\Event;
use Cake\Network\Exception\NotFoundException;

class UsersController extends AppController
{

    public function beforeFilter(Event $event)
    {
        parent::beforeFilter($event);
        $this->Auth->allow(['add','logout','edit','index']);

    }

    public function index()
    {

        if($this->Auth->user()){
        echo 'Hello '. $userName = $this->Auth->user('first_name');
       // $this->set('users', $this->Users->find('all'));
    }
        else{

            $this->redirect('users/login');
        }

    }

    public function view($id)
    {
        if (!$id) {
            throw new NotFoundException(__('utilisateur non valide'));
        }

        $user = $this->Users->get($id);
        $this->set(compact('user'));
    }

    public function add()
    {
        $user = $this->Users->newEntity();
        if ($this->request->is('post')) {
            $user = $this->Users->patchEntity($user, $this->request->data);
            if ($this->Users->save($user)) {
                $this->Flash->success(__("L'utilisateur a été sauvegardé."));
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__("Impossible d'ajouter l'utilisateur."));
        }
        $this->set('user', $user);
    }

    public function login(){

        if($this->Auth->user()){

            return $this->redirect($this->Auth->redirectUrl('users/index'));

        }
        if ($this->request->is('post')) {

            $user = $this->Auth->identify();

            if ($user) {

                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl('users/index'));

            }

            $this->Flash->error(__("Nom d'utilisateur ou mot de passe incorrect, essayez à nouveau."));
        }
    }

    public function edit()
    {

            $user = $this->Users->get($this->Auth->user('id'));

        if ($this->request->is(['post'])) {
            $this->Users->patchEntity($user, $this->request->data);
           // $user->id = $this->Auth->user('id');
            if ($this->Users->updateAll($user)) {
                $this->Flash->success(__('Votre article a été mis à jour.'));
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('Impossible de mettre à jour votre article.'));
        }

        $this->set('user', $user);
    }

    public function logout()
    {
        $this->Auth->logout();
        $this->Flash->success('Vous êtes maintenant déconnecté.');
        return $this->redirect($this->Auth->redirectUrl('users/login'));

    }

}

et appController:

<?
namespace App\Controller;

use Cake\Controller\Controller;
use Cake\Event\Event;

class AppController extends Controller
{
//...

    public function initialize()
    {
        $this->loadComponent('Flash');

        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'fields' => ['username' => 'email', 'password' => 'password']]]
    ]);}

    public function beforeFilter(Event $event)
    {
        $this->Auth->allow(['index', 'view', 'display']);
    }

}
Houdette
Auteur

J'ai compris tes explications merci :)

Cependant j'ai essayer ta methode logout, mais j'ai toujours la meme erreur

Error: Call to undefined method Cake\Controller\Component\AuthComponent::redirect()
File /media/htdocs/cakephp/vendor/cakephp/cakephp/src/Controller/Component/AuthComponent.php
Line: 632

return $this->redirectUrl(['Controller' => 'Users', 'action' => 'login']);

Essaye cela

la documentation officielle préconise la syntaxe suivante

public function logout()
{
    return $this->redirect($this->Auth->logout());
}

et si tu le couple avec la config suivante, cela doit fonctionner.

$this->loadComponent('Auth', [
            ...
            'logoutRedirect' => ['controller' => 'Mycontroller', 'action' => 'myaction],
        ]);

J'utilise ce code dans plusieurs app sans problème particuler.
Voici le lien vers la partie connectino du tutoriel de blog

http://book.cakephp.org/3.0/en/tutorials-and-examples/blog-auth-example/auth.html#authentication-login-and-logout

Houdette
Auteur

Merci pour vos reponses mes ça ne marche toujours pas j ai toujours la meme erreur :/

Quelle est ta version de CakePHP exactement ?

A moins que tu utilises ta propore version du AuthComponent, tu devrais enlever le

use App\Controller\AuthComponent;
Houdette
Auteur

c'est cake php 3 qu est ce que tu veux dire par ma propre version AuthComponenet?

je veux connaitre la version de CakePHP 3.0.x (le x m'interesse).
Enfin elève la ligne que je t'ai demandé.

use App\Controller\AuthComponent; signifie que tu veux charger un fichier situé dans src/Controller/AuthComponent !!?

Houdette
Auteur

c'est juste version 3

Je vais essayer une dernier fois... de quand date ton dernier composer update ?

Houdette
Auteur

meme pas une semaine

et quand tu enlève la ligne que je t'ai demandé dans ton UsersController ?

Houdette
Auteur

je l'ai déjà enlevé et ça ne marche pas

Houdette
Auteur

ça a marché finalement j'ai juste supprimé le dossier vendor merci pour vos idées