PHP PHP Require funktioniert nicht

ClocxHD

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
376
Hallo,

in meinen Routen im Slim Framework konnte ich noch Dateien ganz normal requiren.
Jedoch verwende ich jetzt Silex, und dort funktioniert das nicht mehr.
Er gibt zwar keinen Fehler aus, verhält sich aber so, als würde das require gar nicht da stehen.

Die Route:
PHP:
<?php
/**
 * Created by IntelliJ IDEA.
 * User: w10
 * Date: 5/2/2016
 * Time: 6:22 PM
 */
$app->get('/settings/user', function () use ($app) {
    // Das ist die gemeinte Zeile
    require __DIR__ . '/logincheck.php';

    $sql_gu = "SELECT u.`ID`, u.`Username`, u.`Password`, g.`Name` FROM `User` u JOIN `Groups` g ON u.gID = g.ID";
    $sql_gg = "SELECT `ID`, `Name` FROM `Groups`";

    $get_user = $app['db']->fetchAll($sql_gu);
    $get_group = $app['db']->fetchAll($sql_gg);

    $app['session']->set('_token', bin2hex(openssl_random_pseudo_bytes(16)));

    return $app['twig']->render('backend.twig', array(
        'title' => 'Benutzerverwaltung',
        'users' => $get_user,
        'groups' => $get_group,
        'csrf_token' => $app['session']->get('_token')
    ));
})->bind('settings.user');

Include und Require_once haben den gleichen Effekt.

Inhalt der "logincheck.php:
PHP:
<?php
/**
 * Created by IntelliJ IDEA.
 * User: w10
 * Date: 5/2/2016
 * Time: 8:24 PM
 */

if (null === $user = $app['session']->get('Username')) {
    $app['session']->clear();
    return $app->redirect($app['url_generator']->generate('devlogin'));
}

Wenn ich den Inhalt der logincheck.php direkt in die Route schreibe, funktioniert es.

Woran liegt das?

LG,
ClocxHD
 
Ich vermute, dass return außerhalb einer Funktion nicht funktioniert.
 
Und wie könnte ich das am besten machen?
 
wieso requierst du denn überhaupt irgend etwas?

die einfachste lösung..
du lagerst das ganze in eine function aus die du in der route aufrufst.. für so etwas nutzt man eigentlich eine middleware
 
Dependency Injection, Silex kann Pimpel Container.
Schreib deine File um zur Klasse und Injecte in den Container.
Dann kannst du die Klasse aus der Route heraus über $app['xyz'] erreichen.

Falls es dich doch nochmal zu Slim zieht. Die Version 3.x ist richtig nice, die haben mittlerweile auch ne cooles Demo Projekt und super Seite.
 
Zuletzt bearbeitet:
Also:

1. Was du mit dem require versuchst zu lösen wirkt sehr *äh* von hinten durch die Brust... Für genau deinen Zweck (LoginCheck) gibt es die Middlewares, genauer gesagt die before-Middleware. Wenn du es noch eine Ecke abgefahrener willst, kannst du auch den SecurityServiceProvider verwenden.
Silex ist sehr einfach, ich empfehle dir aber einmal das ganze Manual durchzulesen, es gibt da einige Dinge die eben erst später in der Doku kommen (wie Middlewares) aber extrem hilfreich sind.

2. Dein Code funktioniert nicht, weil ein return Statement in einem includeten/requireten File eine besondere Bedeutung hat (Example #5). Du kannst damit direkt etwas an den Caller returnen:
Code:
$temp = require __DIR__ . '/logincheck.php';
var_dump($temp); // null oder Redirect-Object
Das ist aber auch solch ein Spezialfall, den man eigentlich fast nie in PHP-Code sieht, habe ich auch das erste Mal aktiv nach 5+ Jahren gesehen.

3. Musst du nicht $app per Closure binden, du kannst Silex einfach anweisen, dir das zu übergeben, ist eine ganze Ecke sauberer:
Code:
$app->get('/settings/user', function (Silex\Application $app) {}

4. Du musst nicht den csrf_token von PHP and Twig übergeben. Du hast in Twig Zugriff auf $app:
Code:
{{ app.session.get('_token') }}

5. verwende doch random_bytes(), damit ist dein Code nicht mehr von der OpenSSL Extension abhängig. In der Dokumentation ist auch ein Polyfill verlinkt, wie du random_bytes() auf PHP 5.2-5.6 nutzen kannst.
 
Zuletzt bearbeitet: (Bedeutung von return mit include erklärt)
Hallo,

vielen Dank für die Tipps!

@ice-breaker: Ich habe den Code jetzt an Hand deiner Tips entsprechend geändert. (Auch mit der Middleware)

Gut erklärt, danke :)
 
Zurück
Oben