phaziz.com

Startseite > 29.10.2017 Slim3 - Eine andere Art der Projekteinrichtung

29.10.2017 Slim3 - Eine andere Art der Projekteinrichtung

Slim3 - Eine andere Art der Projekteinrichtung

Slim Framework

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.

Suche

Suchbegriffe mit mindestens 3 Zeichen! Suchvorgang mit ENTER-Taste starten.