Hallo zusammen,
ich schlage mich gerade etwas mit Routing in Verbindung mit einem eingeloggten Frontend-User herum.
Es geht um eine Seite, über die eine Onlineschulung für eingeloggte Mitglieder stattfinden soll. Damit am Ende ein Zertifikat ausgestellt werden kann, soll das System in der Lage sein zu erkennen, wie lange ein User die Onlineschulung angesehen hat.
Meine Idee war, dafür ein Routing auf eine URL einzurichten, die per JavaScript ein Mal pro Minute aufgerufen wird. Für den jeweils eingeloggten User sollen dann Daten in die Datenbank geschrieben werden.
Ich habe es inzwischen hinbekommen ein Routing über eine eigene Erweiterung einzurichten.
PHP-Code:
<?php
// src/Controller/UpdateMemberStatsController.php
namespace BohnMedia\MemberStatsBundle\Controller;
use Contao\CoreBundle\Framework\ContaoFramework;
use Contao\FrontendUser;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
class UpdateMemberStatsController extends AbstractController
{
protected $rootDir;
protected $session;
protected $framework;
public function __construct(string $rootDir, Session $session, ContaoFramework $framework)
{
$this->rootDir = $rootDir;
$this->session = $session;
$this->framework = $framework;
}
public function loadAction(): Response
{
// $objUser = FrontendUser::getInstance();
return $this->json(['path' => 'it works']);
}
}
Der Controller wurde in der services.yml registriert.
Code:
services:
BohnMedia\MemberStatsBundle\Controller\UpdateMemberStatsController:
arguments:
- '%kernel.project_dir%'
- "@session"
- "@contao.framework"
tags: ['controller.service_arguments']
calls:
- [setContainer, ['@service_container']]
Die Route wurde wie folgt eingerichtet.
Code:
update_member_stats:
path: /update_member_stats
defaults:
_controller: BohnMedia\MemberStatsBundle\Controller\UpdateMemberStatsController:loadAction
_scope: frontend
_token_check: true
Zurzeit versuche ich, an die ID des im Frontend eingeloggten Nutzers zu kommen, was per "FrontendUser::getInstance()" in der Funktion "loadAction" auch bereits funktioniert, wenn man eingeloggt ist.
PHP-Code:
$objUser = FrontendUser::getInstance();
$userId = $objUser->id;
Bin ich jedoch nicht eingeloggt, erhalte ich folgende Fehlermeldung.
Code:
Call to a member function get() on null
Ausgelöst wird der Fehler in der FrontendUser.php in Zeile 89.
PHP-Code:
$objToken = System::getContainer()->get('security.token_storage')->getToken();
Nun bin ich mir nicht ganz sicher, ob FrontendUser hier überhaupt die richtige Herangehensweise ist.
Ist der Weg hier korrekt oder gibt es einen eleganteren und vor allem auch sicheren Weg, hier zweifelsfrei an die ID des eingeloggten Nutzers innerhalb einer eigenen Route zu kommen?
Danke und VG
Dennis
Lesezeichen