2011-05-05 16 views
24

Tengo el siguiente código:CakePHP comprobar si el usuario se registra en el interior de una vista

<?php 

    if (!$this->Auth->user()) 
    { 
     echo $this->element('header'); 
    } 
    else 
    { 
     echo $this->element('header-bar'); 
    } 

    ?> 

dentro de mi vista que debe mostrar un encabezado diferente para los usuarios registrados, pero arroja el siguiente error:

Notice (8): Undefined property: View::$Auth [APP/views/layouts/page.ctp, line 17] 
Fatal error: Call to a member function user() on a non-object in /Users/cameron/Sites/thehive/app/views/layouts/page.ctp on line 17 

¿Cómo puedo solucionar esto? Gracias

+1

Si sirve una vista diferente para una acción de usuario diferente (es decir, acceso no autenticado), ¿no debería simplemente servir una vista diferente? – kontur

Respuesta

29

Nota: También echa un vistazo a answer below de meotimdihia. Tiene un lote de votos positivos.


El componente Auth se utiliza en el controlador. Deberá verificar la autorización en el controlador y luego establecer una variable para la vista, por ejemplo, $this->set('authUser', $this->Auth->user());. A continuación, en su opinión, que puede hacer:

if (!$authUser) 
{ 
    echo $this->element('header'); 
} 

Si quieres que esto se haga de forma automática para todos los métodos de controlador, se puede mirar en la modificación cake/libs/controller/app_controller.php de manera que incluya el componente Auth.

+0

funcionó para mí. Gracias. –

+0

Esa es la respuesta correcta http://stackoverflow.com/a/6497338/2274855 –

+2

¡Esto está DESCUBIERTO a partir de CakePHP 2.x! ¡Usa la respuesta de jesal! http://stackoverflow.com/a/18198982/1294758 –

5

Hace tiempo que uso CakePHP pero, por lo que recuerdo, CakePHP no es compatible con Auth in View. Lo que puede hacer, por supuesto, se establece una variable en el controlador para usarlo en la vista

<? 
    class AppController { 
    .... 
    function beforeFilter(){ 
     .... 
     $this->set('auth',$this->Auth); 
    } 
    .... 
    } 
?> 

y luego utilizarlo en la vista como esta

$auth->.... 

o puede utilizar el AuthHelper escrita por Ritesh Agrawal

http://bakery.cakephp.org/articles/ragrawal/2008/07/29/authhelper

por cierto

Creo que si se trata solo de probar si alguien ha iniciado sesión en la respuesta de @ webbiedave es mejor que el estilo de MVC.

Sin embargo, si usted tiene que tener acceso a los datos de usuario a la vista la justa extraer el userinfo del componente de autenticación y la puso en el controlador como he mostrado y utilizarlo en la vista

Saludos

+0

beforeFile debe estar antes del filtro – Dunhamzzz

+0

@Dunhamzz lo ha cambiado ... –

+1

¡Esto está DESACTIVADO a partir de CakePHP 2.x! ¡Usa la respuesta de jesal! http://stackoverflow.com/a/18198982/1294758 –

0

Es necesario configure los detalles del usuario desde un controlador, preferiblemente el AppController que heredan todos los controladores de su sitio. Cree/modifique su app_controller.php para contener este método beforeFilter();.

<?php 
class AppController extends Controller { 

function beforeFilter() { 
    $user = $this->Auth->user(); 
    $this->set(compact('user')); 
} 

Esto establecerá una var llamados $user a los puntos de vista que estará vacía si el usuario no está conectado, o contener sus datos si lo son.

85

No es necesario hacer $this->set(compact('authUser')); solamente utilizar esto en Vista:

if ($this->Session->read('Auth.User')){ 
// do something 
} 
+5

este debe ser el aceptado – zizoujab

+7

Esto está DESCUENTO a partir de CakePHP 2.x !! ¡Usa la respuesta de jesal! http://stackoverflow.com/a/18198982/1294758 –

0
//In the views (or layout) 
$session->check('Auth.User.id'); 

//In controller 
$this->Auth->User('id'); 
+1

'$ this-> Session'- ¡pero aparte de eso me gustaría ir por este enfoque! – mark

48

A partir de CakePHP 2.x:

<?php if (AuthComponent::user('id')): ?> 
    Logged in as <?= AuthComponent::user('name') ?> 
<?php endif; ?> 
+3

Esto funciona para el último Cake PHP! ¡Las otras respuestas están desactualizadas! –

+1

Para CakePHP 3 esto causa un error fatal, pero '$ this-> Session-> read' da una advertencia obsoleta con el código real que debe usar, como en @ LeeNelson's [answer] (http://stackoverflow.com/a/29759420/327074) – icc97

2

probar este

class AppController extends Controller{ 
    $this->user = false; 

    public function beforeFilter(){ 
    $this->user = $this->Auth->user(); 
    } 

    public function beforeRender(){ 
     $this->set('logged_user',$this->user); 
    } 
} 

Ahora puedes marcar $ logged_ usuario en la vista como

if($logged_user){ 
    // users logged in $logged_user have all the details 
}else{ 
    // not logged in 
} 
11

Esto funciona en Cakephp 3+ (salientes modifican: "Auth.User.username" de acuerdo con sus datos de sesión)

<?php 

if (is_null($this->request->session()->read('Auth.User.username'))) { 

    echo "....logged out"; 

} else { 

    echo "You are Logged in As " . $this->request->session()->read('Auth.User.username'); 

} 

?> 
+4

Simplemente no puedo entender por qué todas las funciones y formas están cambiando con tanta frecuencia en cakephp. Aprende que cake 2.4 luego 3.0 viene con toda la sintaxis nueva. Muy molesto. –

+1

Hola RN Kushwaha, CakePHP sigue PHP, hay un PHP 7, ¿usaste todo lo nuevo en esa versión? CakePHP 1.x a 2.x solo mejora las cosas, CakePHP 3 es todo un nuevo framework hecho desde cero para cumplir con los espacios de nombres y todas las nuevas características en el lenguaje. –

+0

@RNKushwaha lo mismo sucedió con el código de encendedor, laravel y yii .. tenemos que seguir frecuentemente la última tecnología – aswzen

14

Para resumir las respuestas en esta página, evaluar uno de los siguientes basado en la versión de CakePHP que está utilizando:

Para la versión 1.x

$this->Session->read('Auth.User') 

Para versión 2.x

AuthComponent::user('id') 

versión 3.x Fore

$this->request->session()->read('Auth.User.id') 
2

en cakephp 3 se puede comprobar sesión de autenticación en la vista como esta

if($this->request->Session()->read('Auth.User')){ 
//do when login 
} 
else{ 
//do not login 
} 
0

he encontrado algo digno de mención, En El manejador de sesión CakePHP 3.x está en desuso,

si queremos acceder a la sesión a la vista, podemos hacerlo a través de la petición st manejador. tenemos que usar

<?php 
    // For CakePHP 3.x to access all user information 
    $this->request->session()->read('Auth.User'); 

    // For CakePHP 3.x to check session 
    if($this->request->session()->read('Auth.User.id')) { 

    } 
?> 
Cuestiones relacionadas