8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je développe actuellement un site sur lequel les utilisateurs peuvent s'enregistrer et se connecter, et j'utilise $_SESSION pour gérer plusieurs infos (pseudo de l'utilisateur, date de dernière connexion ...).

J'utilise un fichier layout.twig pour l'ensemble du HTML commun à toutes les pages, et la seule chose qui varie sont les boutons connexion/déconnexion.

Actuellement j'arrive à récupérer et à afficher le pseudo de l'utilisateur connecté, mais je n'arrive pas à effectuer la vérification de l'existence d'une session.

Dans mon index php :

$app->register(new Silex\Provider\SessionServiceProvider());


Dans mon Controller où je vérifie le mot de passe :

if ($passwordIsChecked) {
session_start();
$_SESSION['pseudo'] = $pseudo;
$_SESSION['lastConnection'] = $data[0]['lastConnection'];

$call = new UserController();
return $return = $call->home($app, $pseudo);


Dans UserController :

public function home (Application $app, $pseudo)
    {
return $app['twig']->render('ownpage_root.twig', [
            'pseudo' => $pseudo,
            'session' =>$_SESSION
        ]);
    }


Et dans mon fichier layout.twig :

{% if app.session.started %}
<button class="disconnection"><a href="{{ url('disconnection') }}">Déconnexion</a></button>
<p>Bienvenue {{ session.pseudo }}, votre dernière connexion : {{ session.lastConnection }}.</p>

{% else %}
<button class="inscription"><a href="{{ url('registration_form') }}">Inscription</a></button>
<button class="connection"><a href="{{ url('connection') }}">Connexion</a></button>

% endif %}


Mais mon "if" ne semble pas marcher : je récupère bien $_SESSION['pseudo'] mais je n'ai pas l'affichage du bouton "déconnexion" et du paragraphe "Bienvenue ..."

J'ai oublié quelque chose ?

Merci d'avance pour votre aide.
Modérateur
bonjour,

tu testes app.session.started

mais started ne semble pas dans $_SESSION dans le code fourni?
kustolovic a écrit :
bonjour,

tu testes app.session.started

mais started ne semble pas dans $_SESSION dans le code fourni?


Je ne comprends pas la réponse.

J'ai oublié une étape qui fait que les variables $_SESSION['...'] ne sont pas globales ? Dès que je change de page, mes variables de session sont NULL.

J'ai essayé de trouver des réponses en ligne mais c'est très confus pour moi ... (d'autant plus qu'il est dur de trouver une réponse à jour et pour Silex).
Modérateur
J'ai raconté nimp'

par contre il y a bien un problème:

tu injectes un service de gestion de session, pour gérer ensuite cela à la main pour ensuite utiliser une gestion hybride lors de la vue…

Si tu fais les choses proprement tu utilises le service (et ne touche jamais ni à session_start ni à $_SESSION).

> https://silex.symfony.com/doc/2.0/providers/session.html
Bonjour.

J'avoue que j'ai du mal avec cette organisation du code éclatée mais :

La seule contrainte (mais je me trompe peut-être) est qu'il faut
que session_start() s'exécute avant que quoi que ce soit ait été
envoyé à l'affichage, visible ou non.

Et aussi que les fichiers aient été enregistrés en UTF-8 sans
BOM.

Smiley sweatdrop
Modifié par Zelena (06 Sep 2017 - 16:01)
kustolovic a écrit :
J'ai raconté nimp'

par contre il y a bien un problème:

tu injectes un service de gestion de session, pour gérer ensuite cela à la main pour ensuite utiliser une gestion hybride lors de la vue…

Si tu fais les choses proprement tu utilises le service (et ne touche jamais ni à session_start ni à $_SESSION).

&gt; https://silex.symfony.com/doc/2.0/providers/session.html


Ok, je vais re-re-...-regarder la doc mais c'est très obscur pour moi vu que les modifications possibles ne sont pas indiquées.

Notamment :
- tout le code
$app->get('/login', function [...] return $response;}); 
remplace le code suivant ?
$app->get('/connexion', 'app\controllers\RegisterController::connectionForm')->bind('connection_form');

- l'utilisation de Response (lignes 13 à 16 sur le lien) nécessite une manipulation particulière ?
- est-ce que tout le code des lignes 19-25 doit être dans index.php ? Il n'est pas possible de le déplacer dans un Controller ? (par exemple pour gérer la situation où l'utilisateur A essaie d'accéder à une page dédiée à l'utilisateur B)
Modifié par AlexP (06 Sep 2017 - 16:50)
kustolovic a écrit :
Si tu fais les choses proprement tu utilises le service (et ne touche jamais ni à session_start ni à $_SESSION).

&gt; https://silex.symfony.com/doc/2.0/providers/session.html


J'ai essayé mais je rencontre les problèmes suivants :

- en mettant le code dans mon index.php, j'obtiens le message d'erreur suivant en me rendant sur /login :
RuntimeException

Controller "Closure" requires that you provide a value for the "$request" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.


- si je sépare la route de la fonction :
$app->get('/login', 'app\controllers\RegisterController::login')->bind('login');

$app->get('/account', 'app\controllers\RegisterController::account')->bind('account');



    public function account (Application $app)
    {
        if (null === $user = $app['session']->get('user')) {
            return $app->redirect('/login');
        }

        return $app['twig']->render('account.twig', [
            'session' =>$_SESSION,
            'user' =>$user
        ]);
    }

Je peux utiliser {{ user.username }} dans mon fichier account.twig mais dès que je change de page, j'obtiens un message :
Twig_Error_Runtime

Variable "user" does not exist.


Donc :
1) Je ne comprends pas comment adapter le code à ma méthode (d'un côté la route et de l'autre la fonction),
2) En utilisant PHP_AUTH_USER et PHP_AUTH_PW, je me prive de la possibilité d'utiliser un formulaire ?,
3) Et je n'arrive toujours pas à obtenir des variables utilisables sur tout le site une fois la session ouverte.
Modifié par AlexP (07 Sep 2017 - 11:27)