2017-02-16 4 views
0

Ich benutze dieses Paket: https://github.com/RobThree/TwoFactorAuth und ich versuche, den Teil des Handbuchs zu folgen, wo Sie Ihren eigenen QR-Code-Anbieter verwenden können.Klasse nicht gefunden PHP (2FA Paket)

Ich habe die Datei phpqrcode.php heruntergeladen und in das Verzeichnis gestellt, in dem sich TwoFactorAuth.php befindet.

Wenn require_once an der Spitze wie in der Führung ist, erhalte ich die Fehlermeldung:

Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in /var/www/public/vendor/robthree/twofactorauth/lib/Providers/Qr/MyProvider.php on line 4

im Verzeichnis Also, mit TwoFactorAuth.php fügte ich myprovider.php mit dem folgenden Code:

<?php 
namespace RobThree\Auth\Providers\Qr; 

require_once(__DIR__ . '/../../phpqrcode.php'); 

class MyProvider implements IQRCodeProvider { 
    public function getMimeType() { 
    return 'image/png';        // This provider only returns PNG's 
    } 

    public function getQRCodeImage($qrtext, $size) { 
    ob_start();          // 'Catch' QRCode's output 
    QRCode::png($qrtext, null, QR_ECLEVEL_L, 3, 4); // We ignore $size and set it to 3 
                // since phpqrcode doesn't support 
                // a size in pixels... 
    $result = ob_get_contents();     // 'Catch' QRCode's output 
    ob_end_clean();         // Cleanup 
    return $result;         // Return image 
    } 
} 

I Verwenden Sie dann den folgenden Code, um ähnlich wie bei der Readme einen QR-Code zu generieren:

Aber dann diesen Fehler ich ..

Fatal error: Uncaught Error: Class 'RobThree\Auth\Providers\Qr\QRCode' not found in /var/www/public/vendor/robthree/twofactorauth/lib/Providers/Qr/MyProvider.php:13 Stack trace: #0 /var/www/public/vendor/robthree/twofactorauth/lib/TwoFactorAuth.php(146): RobThree\Auth\Providers\Qr\MyProvider->getQRCodeImage('otpauth://totp/...', 200) #1 /var/www/public/test.php(6): RobThree\Auth\TwoFactorAuth->getQRCodeImageAsDataUri('Bob Ross', 'ID2Y3P5C6N2NXKD...') #2 {main} thrown in /var/www/public/vendor/robthree/twofactorauth/lib/Providers/Qr/MyProvider.php on line 13

Kann mir jemand dabei helfen?

Antwort

1

Hinzufügen Sie müssen die Klasse Qr entweder referenzieren über sie Namespace vollständig aufgelöst ist, otr durch eine use Aussage. Das Hinzufügen von namespace RobThree\Auth\Providers\Qr; an den Anfang Ihres Codes platziert Ihren Code in den Namespace dieser Bibliothek, was ein extrem schlechtes Entwurfsmuster ist. Ihr Code ist nicht nur Teil der RobThree Auth-Bibliothek, sondern was passiert, wenn Sie eine andere Bibliothek verwenden müssen?

Versuchen Sie stattdessen, diesen Code zu verwenden, es ist das richtige Design und Sie werden nicht auf Probleme stoßen. Außerdem würde ich vorschlagen, Ihre eigenen Klassen Namensräume, unter so etwas wie MyOrganisation\MyLibrary, die ich unten aufgeführt haben:

<?php 

require_once(__DIR__ . '/../../phpqrcode.php'); 

namespace MyOrganisation\MyLibrary; 

use RobThree\Auth\Providers\Qr\QRCode; 

class MyProvider implements IQRCodeProvider { 
    public function getMimeType() { 
    return 'image/png';        // This provider only returns PNG's 
    } 

    public function getQRCodeImage($qrtext, $size) { 
    ob_start();          // 'Catch' QRCode's output 
    QRCode::png($qrtext, null, QR_ECLEVEL_L, 3, 4); // We ignore $size and set it to 3 
                // since phpqrcode doesn't support 
                // a size in pixels... 
    $result = ob_get_contents();     // 'Catch' QRCode's output 
    ob_end_clean();         // Cleanup 
    return $result;         // Return image 
    } 
} 

Die andere Option zu diesem Code (was ich eingangs erwähnt) wäre:

<?php 

require_once(__DIR__ . '/../../phpqrcode.php'); 

namespace MyOrganisation\MyLibrary; 

class MyProvider implements IQRCodeProvider { 
    public function getMimeType() { 
    return 'image/png';        // This provider only returns PNG's 
    } 

    public function getQRCodeImage($qrtext, $size) { 
    ob_start();          // 'Catch' QRCode's output 
    RobThree\Auth\Providers\Qr\QRCode::png($qrtext, null, QR_ECLEVEL_L, 3, 4); // We ignore $size and set it to 3 
                // since phpqrcode doesn't support 
                // a size in pixels... 
    $result = ob_get_contents();     // 'Catch' QRCode's output 
    ob_end_clean();         // Cleanup 
    return $result;         // Return image 
    } 
} 

Die erste Lösung führt zu viel besserem Code, insbesondere bei tief verschachtelten Namespace-Klassen.

0

ich es fest von namespace RobThree\Auth\Providers\Qr; an die Spitze der phpqrcode.php