Partage
  • Partager sur Facebook
  • Partager sur Twitter

SLIM3 - Simplification de code

Problème de namespaces et de longueurs

    11 décembre 2018 à 0:50:20

    Bonsoir à tous, 

    Je suis en train de me remettre doucement à la migration d'une appli sous le FW Slim3. Tous va très bien malgré le fait que je trouve des lenteurs et des répétitions dans la rédaction de mon code. Et j'aimerais des conseils / astuces / façons de faire pour changer tout ça !

    Pour résumer, j'ai une arborescence de fichiers comme suit :

    - app
    --- Controllers
    ------ Controller1.php
    ----- Controller2.php
    --- Handlers
    ------ Handler1.php
    ------ Handler2.php
    --- Middlewares
    ------ Middleware1.php
    ------ Middleware2.php
    --- Models
    ------ Models1.php
    ------ Models2.php
    --- Views
    ------ *.twig
    - public
    --- assets
    ------ (images/js/css/ ...)
    --- index.php
    --- .htaccess
    - vendor
    --- (géré par composer)
    -composer.json
    

    Mon composer.json est très basique :

    {
        "name": "name",
        "authors": [
            {
                "name": "name",
                "email": "mail
            }
        ],
        "autoload": {
            "psr-4": {
                "App\\Controllers\\": "app/Controllers",
                "App\\Middlewares\\": "app/Middlewares",
                "App\\Handlers\\": "app/Handlers",
                "App\\Models\\": "app/Models"
            }
        },
        "require": {
            "slim/slim": "^3.5",
            "slim/twig-view": "^2.1",
            "respect/validation": "^1.1",
            "slim/csrf": "^0.7.0",
            "illuminate/database": "~5.1"
        }
    }

    Si je prends mon fichier NotFoundHandler par exemple, qui se charge des 404 sur mon appli, j'ai en tout et pour tout ce code là (moins les commentaires) :

    <?php
            namespace App\Handlers;
        
            use \Psr\Http\Message\RequestInterface;
            use \Psr\Http\Message\ResponseInterface;
            use \Respect\Validation\Validator;
            use \Illuminate\Database\Eloquent\Model;
        
            class NotFoundHandler extends \Slim\Handlers\NotFound {
        
               
                    private $templatePath = '';
                    private $view;
                
                    public function __construct(\Slim\Views\Twig $view) { 
                        $this->view = $view; 
                    }
                
                    public function __invoke(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response) { 
                        parent::__invoke($request, $response);
                        $templateFile = '404.twig';
                        $this->view->render($response, $this->templatePath . $templateFile);
                        return $response->withStatus(404); 
                        exit();
                    }
            }


    Il a le mérite de fonctionner, mais je dois à chaque mentionner le "chemin complet" des élements, tels que "\Psr\Http\Message\ServerRequestInterface" ou encore "\Slim\Views\Twig". 

    Dans mon routeur, c'est pareil, je me retrouve avec des longeurs de lignes inutiles du genre " $app->get('/', App\Controllers\DashboardController::class . ':dashboard')->setName('root');" alors que j'indique dès le début les namespaces à utiliser.

                // --- HANDLERS NAMESPACES -- //
                    use App\Handlers\LoginHandler;
                    use App\Handlers\NotFoundHandler;
    
                // --- END HANDLERS NAMESPACES --- //
    
                // --- CONTROLLERS NAMESPACES --- //
                    use App\Controllers\DashboardController;
                    use App\Controllers\PagesController;
                    use App\Controllers\QuotesController;
                    use App\Controllers\SearchController;
                    use App\Controllers\CronController;
                    use App\Controllers\ContactsController;
                    use App\Controllers\CompaniesController;
                // --- END CONTROLLERS NAMESPACES --- //

    Si quelqu'un a la solution pour palier à ce problème, je suis preneur. Ou alors si quelqu'un peut m'expliquer pourquoi cette nécessité, je serais ravi de savoir. Personnellement, je croyais que les namespaces servaient justement à palier à ces longeurs en indiquant les emplacements des classes de façon à les charger dynamiquement via un autoloader ...

    Merci d'avance, et désolé pour les longueurs :) 

    -
    Edité par Ealon 11 décembre 2018 à 0:53:04

    • Partager sur Facebook
    • Partager sur Twitter
    Kwo:re / topic OC | Aidez les autres, indiquez un sujet résolu ! | Vous êtes bloqué ? Suivez le guide ! | N'aide pas par MP
      11 décembre 2018 à 7:05:07

      Les uses ne sont que la possibilité de mettre des alias au nom d'une classe dans le fichier en cours (http://php.net/manual/fr/language.namespaces.importing.php)

      En gros tu dois le faire pour chaque fichier car le use ce n'est pas un require.

      Edit: Si je reprends l'exemple de ton NotFoundHandler ça donnerai :

      <?php
      
      namespace App\Handlers;
      
      // Je te les laisses car je sais pas si tu les utilises ailleurs
      // Mais sinon tu peux les enlever
      use Psr\Http\Message\RequestInterface;
      use Psr\Http\Message\ResponseInterface;
      use \Respect\Validation\Validator;
      use Illuminate\Database\Eloquent\Model;
      
      // Les nouveaux
      use \Slim\Handlers\NotFound;
      use \Slim\Views\Twig;
      use Psr\Http\Message\ServerRequestInterface;
      
      class NotFoundHandler extends NotFound
      {
          private $templatePath = '';
          private $view;
      
          public function __construct(Twig $view)
          {
              $this->view = $view;
          }
      
          public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
          {
              parent::__invoke($request, $response);
      
              $templateFile = '404.twig';
              $this->view->render($response, $this->templatePath, $templateFile);
      
              return $response->withStatus(404);
              // exit(); cette ligne ne sera jamais exécuté
          }
      }
      

      Voici par exemple à quoi pourrai servir un use :

      <?php
      
      namespace App\Handlers;
      
      use Psr\Http\Message\{
          RequestInterface as IRequest,
          ResponseInterface as IResponse,
          ServerRequestInterface as IServerRequest
      };
      
      // Je pousse le vice assez loin car en vrai
      // je n'utilise pas les versions avec {}
      // et le as je m'en sert que quand il y a
      // un conflit de nom d'alias entre 2 classes.
      
      use \Respect\Validation\Validator;
      use Illuminate\Database\Eloquent\Model;
      use \Slim\Handlers\NotFound;
      use \Slim\Views\Twig;
      
      class NotFoundHandler extends NotFound
      {
          private $templatePath = '';
          private $view;
      
          public function __construct(Twig $view)
          {
              $this->view = $view;
          }
      
          public function __invoke(IServerRequest $request, IResponse $response)
          {
              parent::__invoke($request, $response);
      
              $templateFile = '404.twig';
              $this->view->render($response, $this->templatePath, $templateFile);
      
              return $response->withStatus(404);
              // exit(); cette ligne ne sera jamais exécuté
          }
      }
      



      -
      Edité par quenti77 11 décembre 2018 à 9:21:45

      • Partager sur Facebook
      • Partager sur Twitter

      SLIM3 - Simplification de code

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown