In Teil 3 werde ich dir zeigen wie du die Daten vom Character „Hans“ aus der Datenbank abrufen kannst.
Bevor das passiert, nochmal eine kurze Zusammenzufassung darüber was im Projekt aktuell funktionieren sollte:
- Die Programme sind installiert und laufen
- Das PHP Projekt ist angelegt
- Slim ist an seinem Platz im libs Verzeichnis
- Der erste Test hat ein „Hello, NAME“ zurückgeliefert
- Die Datenbank tutorialslim ist angelegt
- Die Tabelle characters ist angelegt
- die Spalten in der Tabelle wurden angelegt
- Character „Hans“ ist als Datensatz in der Datenbank angelegt
Das ist soweit schon ganz gut.
Im nächsten Schritt werden wir die Daten aus der Datenbank ziehen und im Browser als json string anzeigen lassen.
Dazu erstellst du nun ein PHP Script namen AbstractController.php und speicherst es in das controller Verzeichnis.
Dieses Script sieht nun so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php abstract class AbstractController { public $connection; // auto constructor function __construct() { require '../include/dbconnect.php'; // opening db connection $db = new dbconnect(); $this->connection = $db->Connect(); } // returns the date public function GetDate() { return date('d.m.Y - H:i:s'); } public function ReturnStatusCode($error, $code, $message) { $status = new StatusCodeController(); $status->ReturnStatusCode($error, $code, $message); } } ?> |
Von diesem Script erben alle Controller-Scripts später. Die Idee dahinter ist schlichte Vererbung von Funktionalitäten innerhalb der Klassen. Ein Beispiel dafür ist das Verbinden zur Datenbank, die nun durch alle erbenden Klassen ganz simpel erfolgen kann. Das zeige ich dir direkt am nächsten Script, denn dieses wird alle Aufgaben rund um die Character-Daten erledigen.
Das StatusController-Script kommt, wie alle Controller-Scripts, ebenfalls in das controller-Verzeichnis. Dieses Script sorgt dafür, dass du einen String in Json Format vom Server zurück erhälst, der den Fehler-Code und eine Nachricht enthält.
1 2 3 4 5 6 7 8 9 10 11 |
<?php class StatusCodeController { public function ReturnStatusCode($error, $code, $message) { $response = array(); $response["error"] = $error; $response["code"] = $code; $response["message"] = $message; echo json_encode($response, JSON_PRETTY_PRINT); } } |
Erstelle jetzt ein neues Script mit dem Namen CharacterController.php und speichere dieses ebenfalls im controller Verzeichnis.
Das CharacterController-Script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<?php class CharacterController extends AbstractController { public function GetCharacter($character) { // $character = name or id $db = NULL; if (is_numeric($character)) { $this->GetCharacterById($character); } else { $this->GetCharacterByName($character); } } private function GetCharacterById($guid) { try { $db = $this->connection; $qry = "SELECT * FROM `characters` WHERE `guid` = :guid "; $stmt = $db->prepare($qry); $stmt->bindValue(':guid', $guid, PDO::PARAM_INT); $stmt->execute(); $rows = $stmt->fetch(PDO::FETCH_ASSOC); if ($stmt->rowCount() > 0) { // character exists! //$this->ReturnStatusCode(true, "CHARACTER_FOUND", json_encode($rows, JSON_PRETTY_PRINT)); echo json_encode($rows, JSON_PRETTY_PRINT); } else { $db = NULL; $this->ReturnStatusCode(true, "CHARACTER_NOT_FOUND", "CHARACTER_NOT_FOUND"); } } catch (Exception $ex) { $db = NULL; echo $ex; $this->ReturnStatusCode(true, "CHARACTER_GET_ERROR", $ex); } $db = NULL; } private function GetCharacterByName($characterName) { try { $db = $this->connection; $qry = "SELECT * FROM `characters` WHERE `name` = :name "; $stmt = $db->prepare($qry); $stmt->bindValue(':name', $characterName, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetch(PDO::FETCH_ASSOC); if ($stmt->rowCount() > 0) { // character exists! //$this->ReturnStatusCode(true, "CHARACTER_FOUND", json_encode($rows, JSON_PRETTY_PRINT)); echo json_encode($rows, JSON_PRETTY_PRINT); } else { $db = NULL; $this->ReturnStatusCode(true, "CHARACTER_NOT_FOUND", "CHARACTER_NOT_FOUND"); } } catch (Exception $ex) { $db = NULL; echo $ex; $this->ReturnStatusCode(true, "CHARACTER_GET_ERROR", $ex); } $db = NULL; } } ?> |
Nun muss noch die index.php modifiziert werden und sollte so aussehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php // load slim require '../../libs/Slim/Slim.php'; \Slim\Slim::registerAutoloader(); $app = new \Slim\Slim(); // load classes spl_autoload_register('autoload_class'); function autoload_class($class_name) { $directories = array( '../include/', '../controller/', '../model/' ); foreach ($directories as $directory) { $filename = $directory . $class_name . '.php'; if (is_file($filename)) { // echo $filename . " "; require($filename); break; } } } // der erste Test: http://localhost/tutorialgameapi/game1/v1/hello/Hans $app->get('/hello/:name', function ($name) { echo "Hello, $name"; }); // get player character by id or name $app->get('/character/:guidorname', function($guidorname) use($app) { $cc = new CharacterController(); $cc->GetCharacter($guidorname); }); // WICHTIG, WICHTIG, WICHTIG: am Ende noch die App starten: $app->run(); ?> |
Wenn du nun alles richtig gemacht hast und du
http://localhost/tutorialgameapi/game1/v1/character/Hans
in die Adresszeile deines Browsers eingibst, sollte folgendes zurückkommen:
{ „guid“: „1“, „name“: „Hans“, „health“: „100“, „score“: „1000“ }
Das Repo zum Projekt: https://bitbucket.org/AgentCodeMonkey/tutorialslimapi
Cheers!
Daniel