Rolf B: In MVC-Umgebung bei JS-Validierung auf Datenbank zugreifen

Beitrag lesen

Hallo borisbaer,

public function verify(): never
{
   $attr = array_keys( $_GET )[1] ?? null;
	 if ( $attr === 'username' || $attr === 'email' ) {
   }
}

Ich nehme mal an, dass dies die Top-Level Funktion ist, die vom Router aufgerufen wird. Nur in diesem Fall würde ich dein Hantieren mit $_GET und dem Setzen der Header für korrekt halten.

Nicht korrekt ist, dass sie im Fehlerfall einen Redirect liefert. Das ist sinnlos, du möchtest den fetch() umleiten?! Wenn Du etwas tun willst für den Fall, dass jemand die API-URL im Browser eingibt: tu's nicht. Wer APIs aufruft und HTML erwartet, hat Pech. Falsche Parametrierung kannst Du mit HTTP Statuscodes beantworten.

Deine read-Funktion bekommt ein Array mit den Spalten, für die zu prüfen ist, ob der Wert schon in der DB existiert? Kann man so machen - aber was soll read tun? Kollisionstest für genau ein Attribut? In dem Fall würde die Methode vielleicht doch besser "exists($column, $value)" heißen und einfach ein bool zurückgeben?

Und wer garantiert Dir, dass username oder email der zweite Parameter für deine Funktion sind? Davon solltest Du Dich entkoppeln und eine Prüffunktion schreiben, die schaut, ob einer von mehreren Parametern da ist. Ich habe sie erstmal ohne $this oder \App\Tools\Bla\Foo davor hingeschrieben - die kann man an geeignetem Ort unterbringen.

use \App\Models\User\SignUp;

...
function verify()
{
   $attr = hasKey($_GET, ['username', 'email']);
   if (attr)
   {
      // Potenzielles Sicherheitsloch!
      $value = SignUp::read( [ $attr => $_GET[$attr] ] ); 
      header( 'Content-Type: application/json' );
      echo json_encode( [ 'value' => $value ] );      
   }
   else
   {
      http_response_code(400);  // Bad Request, no content
   }
   exit;
}

...

// Mögliche Implementierungen von hasKey
// Einzeiler mit 2 Array-Funktionen und ??
function hasKey($array, $keys) {
   return array_intersect(array_keys($array), $keys)[0] ?? null;
}
// oder klassisch als Schleife:
function hasKey($array, $keys)
{
   foreach ($keys as $key)
   {
      if (array_key_exists($array, $key) 
      {
         return $key;
      }
   }
   return null;
}

Zu deiner read-Funktion und der Motivation, sie so zu gestalten, wie sie ist, kann ich nichts sagen. Soll sie einen User über einen beliebigen Schlüssel finden können, und gibt diesen User dann zurück? In dem Fall wäre der Rückgabewert viel zu umfangreich, du willst bestimmt nicht einen allgemeinen Userdaten-Reader für anonyme Benutzer bereitstellen. Deine verify-Schnittstelle sollte nicht mehr als einen Bool zurückgeben. "Geht" oder "Geht nicht". Nichts weiter.

Rolf

--
sumpsi - posui - obstruxi