Maison  >  Questions et réponses  >  le corps du texte

Embellir les URL dans les frameworks PHP

Je sais que vous pouvez ajouter des règles dans htaccess, mais j'ai trouvé que les frameworks PHP ne le font pas et que d'une manière ou d'une autre, vous avez toujours de belles URL. Comment les serveurs peuvent-ils faire cela s'ils ne connaissent pas les règles d'URL ?

Je cherchais la classe de gestionnaire d'URL de Yii, mais je ne comprends pas comment c'est fait.

P粉176980522P粉176980522375 Il y a quelques jours690

répondre à tous(1)je répondrai

  • P粉801904089

    P粉8019040892023-10-31 08:17:16

    Cela se fait généralement en acheminant toutes les requêtes vers un seul point d'entrée (un fichier qui exécute un code différent en fonction de la requête), avec les règles suivantes :

    # Redirect everything that doesn't match a directory or file to index.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* index.php [L]

    Le fichier compare ensuite la requête ($_SERVER["REQUEST_URI"]) à une liste de routes - des modèles qui correspondent à la requête, mappant les chemins d'exécution aux actions du contrôleur (dans une application MVC) ou à d'autres actions. Les frameworks incluent souvent une route qui peut déduire des contrôleurs et des actions à partir de la requête elle-même, en tant que route de secours.

    Un exemple simple :

    <?php
    
    // Define a couple of simple actions
    class Home {
        public function GET() { return 'Homepage'; }
    }
    
    class About {
        public function GET() { return 'About page'; }
    }
    
    // Mapping of request pattern (URL) to action classes (above)
    $routes = array(
        '/' => 'Home',
        '/about' => 'About'
    );
    
    // Match the request to a route (find the first matching URL in routes)
    $request = '/' . trim($_SERVER['REQUEST_URI'], '/');
    $route = null;
    foreach ($routes as $pattern => $class) {
        if ($pattern == $request) {
            $route = $class;
            break;
        }
    }
    
    // If no route matched, or class for route not found (404)
    if (is_null($route) || !class_exists($route)) {
        header('HTTP/1.1 404 Not Found');
        echo 'Page not found';
        exit(1);
    }
    
    // If method not found in action class, send a 405 (e.g. Home::POST())
    if (!method_exists($route, $_SERVER["REQUEST_METHOD"])) {
        header('HTTP/1.1 405 Method not allowed');
        echo 'Method not allowed';
        exit(1);
    }
    
    // Otherwise, return the result of the action
    $action = new $route;
    $result = call_user_func(array($action, $_SERVER["REQUEST_METHOD"]));
    echo $result;

    Combiné avec la première configuration, il s'agit d'un script simple qui vous permet d'utiliser des URL comme domain.com/about. J'espère que cela vous aide à comprendre ce qui se passe ici.

    répondre
    0
  • Annulerrépondre