Posts van een user

In een vorige paragraaf hebben we een pagina gemaakt waar posts konden worden toegevoegd. Nu we een inlog mogelijkheid hebben kunnen we de ingevoerd post koppelen aan de ingevoerde gebruiker.

In controllers/post-store.php stond de volgende code die een post invoert in de database:

$db->query("INSERT INTO posts (title, content, user_id) VALUES (:title, :content, :user_id)", [
    'title' => $request->title,
    'content' => $request->content,
    'user_id' => 63, // bij ingelogde gebruiker ipv 63 de id van de ingelogde gebruiker: user()->id
]);

De 63 was het user_id, op deze plaats willen we nu het id van de ingelogde gebruiker plaatsen. Dit kan eenvoudig door deze uit de session te halen. Dit kan met $_SESSION['user']['id']  of met de veel makkelijkere helper functie user()->id

$db->query("INSERT INTO posts (title, content, user_id) VALUES (:title, :content, :user_id)", [
    'title' => $request->title,
    'content' => $request->content,
    'user_id' => user()->id,
]);

Alleen voor ingelogde gebruikers

Uiteraard mag je de pagina waar je posts aan kan maken alleen benaderen als je ingelogde gebruiker bent.

De route kunnen we beveiligen met de auth() functie.

router.php

if(auth()){
  $route->get('post-create', "views/post-create.view.php");
}

Het is nu alleen nog voor ingelogde gebruikers mogelijk om naar /post-create te gaan.
Toch staat de link nu ook nog bij niet ingelogde gebruikers op de pagina waar de posts te zien zijn. Dus daar moeten we ook een kleine aanpassing doen.

views/posts.view.php

<?php if (auth()): ?>
  <a href="/post-create" class="text-indigo-600 hover:text-indigo-400">Post toevoegen</a><br>
<?php endif; ?>

Om de link naar /post-create zetten we een if(auth()): dus alleen als je ingelogd bent zal de link op het scherm worden getoond.
Je router.php kan er dan bijvoorbeeld zo uit gaan zien

//Alleen als je ingelogd bent
if (auth()) {
    //hier komen routes die je alleen kan bereiken als je ingelogd bent
    $route->get('posts-create', "views/posts-create.view.php");
    $route->post('posts-store', "controllers/posts-store.php");
}

//alleen toegankelijk als administrator
if (hasRole('admin')) {
    //hier komen de routes die alleen toegankelijk zijn voor een admin
    $route->post('posts-destroy/{id}', "controllers/posts-destroy.php");
    $route->get('posts-edit/{id}', "controllers/posts-edit.php");
    $route->post('posts-update/{id}', "controllers/posts-update.php");
}

 

 

Opgave L1.1 - Alleen toegankelijk voor ingelogde gebruikers

Pas de volgende bestanden aan zodat je dit alleen door middel van inloggen kan doen.

 

Uitwerking

/app/router.php
/app/controllers/posts-store.php
/app/views/posts.view.php