phaziz.com

SLIM3 - Code behind vs. Klasse

slim-php-framework-logo.png

Code-behind vs. extra Klasse???

Ist eigentlich eine Art der persönlichen Vorlieben, ob man die Logik einer Slim3-Anwendung einfach als Code-behind-Variante direkt in die Closures schreibt, oder für jede Route eine extra Klasse anlegt. Hängt auch immer ein wenig von der Projektgröße ab - irgendwann wird eine Code-behind-Datei zu umfangreich, um sich darin noch elegant zurechtzufinden.

Code-behind

Code-behind ist ein Begriff, mit dem Programmierer aus der C#-Welt zum Beispiel was anfangen können - bedeutet hier: Jede XAML-Datei hat genau eine Code-behind-Datei, in der die Logik der erstellten Oberfläche abgehandelt wird. Das Pendant in Slim3 ist die Datei, in der die Route spezifiziert wird.

Als kleines Beispiel: im Browser haben wir die Möglichkeit eine Route ./user aufzurufen. Diese Route ist wie üblich in Slim3 in der Hauptdatei ./public/index.php eingerichtet:

<?php
require __DIR__ . '/../vendor/autoload.php';
...
$app = new \Slim\App;
$app->get('/user', function (Request $request, Response $response){...
return $response;
});
...
$app->run();
...

Eine extra Klasse je Route

Eine andere Art der Projektorganisation, ist der Ansatz je Route eine eigene Klasse zu schreiben und diese irgendwo in der Projektstruktur unterzubringen. Unsere Route ./user handelt mit den Benutzerdaten - wir arbeiten also mit Daten - diese könnten wir nun auch in einem extra Controller abrufen/verarbeiten:

<?php
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../controller/userController.php';
...
$app = new \Slim\App;
$app->get('/user', function (Request $request, Response $response){return userController::Init($app, $request, $response, $this -> twig, $this -> logger);
});
...
$app->run();
...

Im oben gezeigten Beispiel rufen wir so über die Route ./user die Klasse userController auf und aus dieser Klasse die Funktion Init. Die Klasse userController könnte dabei ungefähr so aussehen:

<?php
require_once __DIR__ . '/../vendor/autoload.php';
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
class userController
{
public function Init(Slim\App $app, Request $request, Response $response, $renderer, $logger, $args = []){$logger -> addInfo('userController');
...
return $renderer -> render('user.html', [
'PageTitle' => 'Benutzer',
...
]);
}}

Wir übergeben der Klassenfunktion Init unsere $app, die Response- und Request-Objekte und Instanzen unserer Container - hier für das Monolog Logging und die Twig-Renderingengine.

Was sagt Slim3 dazu

Laut Dokumentation:

container_key:method
Class:method
An invokable class
container_key

Hier - https://www.slimframework.com/docs/objects/router.html#container-resolution - nachzulesen.

phaziz.com   |   ConstructrCMS   |   ConstructrCMS GitHub   |   Impressum & Datenschutz