[Yii 2] [Risolto] Come effettuare un banale redirect in base al ruolo dell'utente?

Nel SiteController ho provato a fare così




    public function actionIndex()

    {

        if (\Yii::$app->user->isGuest) {

            return $this->render('index');

        }

        

        if (\Yii::$app->user->role == User::ROLE_ADMN) {

            return $this->redirect('/admin');

        } else {

            return $this->render('index');

        }

    }



avendo stabilito in common\models\User.php




const ROLE_ADMIN = 100;



E avendo messo A MANO il role a 100 nel db all’unico utente che ho

Ora eseguo il login e mi aspetto che la index mi rediriga a /admin, ma questo non avviene.

Questo è l’errore

Mi sa che user qui è l’identità utente e non il modello.

Come si accede al model dello user loggato ?

Se il modello user implementa IdentityInterface lo ritrovi con




\Yii::$app->user->getIdentity()



o più comodamente se vuoi arrivare ad una proprietà del tuo modello User


<?= Yii::$app->user->identity->username ?>

Se sei come anonimo Yii::$app->user->identity è vuoto, quindi occhio ai controlli.

Nicola, grazie del tuo aiuto, ma non ci sono ancora arrivato in fondo

La classe /common/models/User.php è quella generata automaticamente con lo skeleton avanzato




class User extends ActiveRecord implements IdentityInterface



Ora il codice dentro a /backend/controllers/SiteController.php è questo




public function actionIndex()

    {

        if (\Yii::$app->user->isGuest) {

            return $this->render('index');

        }

        

        $user = \Yii::$app->user->getIdentity();


        // is not a guest

        if ($user->role == User::ROLE_ADMN) {

            return $this->redirect('/admin');

        } else {

            return $this->render('index');

        }        


    }



Ma questo crea lo stesso un errore:

scatenata da questa riga




if ($user->role == User::ROLE_ADMN) {



Questo però non ha senso: la classe User è definita cosi




namespace common\models;


class User extends ActiveRecord implements IdentityInterface

...



E dentro a backend/models per ora non c’è nulla.

Non capisco perchè se identity usa correttamente user, come mai poi ‘sbaglia’ il namespace…

Ho cercato nella guida, ed ho visto che \Yii::$app->user è della classe yii\web\User.

Questo è il link alla documentazione di getIdentity

Non ho però capito cosa sto sbagliando

Aggiungo che facendo il dump di $user ottengo




common\models\User#1

(

    [yii\db\BaseActiveRecord:_attributes] => [

        'id' => 1

        'username' => 'admin'

        'auth_key' => 'm7DUgxyclm0O2JiDOCg_xGqxtHWMP959'

        'password_hash' => '$2y$13$GhIhNKYvxeREpjV1THDUluEJHW0jKWAZ0KTZx1nDTFMW8KRlfj7H.'

        'password_reset_token' => null

        'email' => '<hidden>'

        'role' => 100

        'status' => 10

        'created_at' => 1415033690

        'updated_at' => 1415033690

    ]

...



Quindi ancora di piu non capisco perchè scrivendo




$user->role



Mi dica questo

Che c’entrano i controller con la richiesta di una proprietà di un modello ?

Cosa sto sbagliando?

Mamma mia che stupido che sono … ho capito …

Il problema non è la proprietà, ma l’uso della costante




if ($user->role == User::ROLE_ADMN) {



Non avendo dichiarato di usare un preciso namespace, PHP cerca la classe User nel namespace in cui mi trovo ora, per cui, ora, ha senso

(Ed aggiungo che mancava anche una ‘I’ in ‘ROLE_ADMN’, LOL)

Soluzione:




if ($user->role == \common\models\User::ROLE_ADMIN)



Ora non ho sottomano un’installazione advanced comunque, come dici giustamente \Yii::$app->user è un istanza yii\web\User, nel file di configurazione (sia backend che frontend) dovresti avere la dichiarazione di questo componente, una cosa tipo:




...

'components' => [

...

        'user' => [

            'identityClass' => 'common\models\User',

            'enableAutoLogin' => true,

        ]

...



identityClass indica quale classe fa da Identity per l’utente loggato (la tua /common/models/User.php), penso che tu hai un errore nella dichiarazione del componente user nei config, verifica che i tuoi webuser siano dichiarati correttamente nei config e che i namespace nei files delle classi siano corretti (e pure gli use), altro non mi viene in mente senza vedere tutta la struttura dell’app!

ah bene! :)