美文网首页
PHP 新手入门指南 - 简单路由

PHP 新手入门指南 - 简单路由

作者: chansey | 来源:发表于2017-06-23 16:50 被阅读3458次

    在之前我们的项目能够显示所有的 todo 清单。接下来我们要添加更多的页面,为此我们需要考虑其它页面的请求如何更好的处理,这里我们就来通过实现一个简单的路由来处理不同页面的显示。

    首先,我看看之前的项目目录下文件层次结构:

    目录结构

    开始实践

    新建一些文件,调整一下目录结构,如下:

    调整后的目录结构

    接下来,我们看看明细:

    根目录下 index.php 文件:

    // index.php
    <?php
    
    $database = require 'core/bootstrap.php';
    
    require Router::load('routes.php')
                ->direct(Request::uri());
    

    我们需要了解 bootstrap.php 有什么变化:

    <?php
    
    $app = [];
    
    $app['config'] = require 'config.php';
    
    require 'core/Router.php';
    require 'core/Request.php';
    require 'core/database/Connection.php';
    require 'core/database/QueryBuilder.php';
    
    $app['database'] = new QueryBuilder(
        Connection::make($app['config']['database'])
    );
    

    这里,定义了一个运行时变量 $app 启动时作为容器装载程序所依赖的内容,很明显这里将 database 以及 config 装载到了 $app 中。

    接下来一些新的新加入的代码:

    // core/Router.php
    <?php 
    
    class Router
    {
    
        protected $routes = [];
    
        public static function load($file)
        {
            $router = new static;
    
            require $file;
    
            return $router;
        }
    
        public function define($routes)
        {
            $this->routes = $routes;
        }
    
        public function direct($uri)
        {
            if (array_key_exists($uri, $this->routes)) {
                return $this->routes[$uri];
            }
    
            throw new Exception('No route defined for this URI.');
            
        }
    }
    

    定义了一个 Router 类,其中 load 方法用于加载路由文件,define 方法则是定义路由信息,direct 则是根据 uri 路径提取路由地址(请求最终的指向)。

    接下来看看 Request.php 的内容:

    <?php
    
    class Request
    {
        public static function uri()
        {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    

    Request 类提供了一个方法,用于从 url 中提取 uri 路径页面。

    比如 http://localhost:8000/about/cultureREQUEST_URI/about/culture

    $_SERVER — 服务器和执行环境信息。了解更多

    再来看看我们的路由信息是怎么定义的:

    // routes.php
    <?php 
    
    $router->define([
        '' => 'controllers/index.php',
        'about' => 'controllers/about.php',
        'about/culture' => 'controllers/about-culture.php',
        'contact-our-company' => 'controllers/contact.php'
    ]);
    

    路由文件中定义了 uri 所指向的 controllers 目录下特定的文件,请求会根据这个指向执行相应的程序文件。

    其中 /controllers/index.php 的内容如下:

    // controllers/index.php
    <?php
    
    // 读取数据
    $tasks = $app['database']->selectAll('todos');
    
    // 呈现页面
    require "views/index.view.php";
    

    显示页面 views.index.view.php

    // views/index.view.php
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <nav>
            <ul>
                <li><a href="/about">About Page</a></li>
                <li><a href="/contact-our-company">Contact Page</a></li>
            </ul>
        </nav>
    
        <h1>My Tasks</h1>
    
        <ul>
            <?php foreach ($tasks as $task) : ?>
                <li>
                    <?php if ($task->completed) : ?>
                        <strike><?= $task->description; ?></strike>
                    <?php else: ?>
                        <?= $task->description; ?>
                    <?php endif; ?>
                </li>
            <?php endforeach; ?>
        </ul>
    </body>
    </html>
    

    可以看到页面中导航链接 About PageContact Page 所链接的址已经在路由文件 routes.php 中定义。

    让我们看看 About Page 相关的页面 controllers/about.phpviews/about.view.php 的内容:

    // controllers/about.php
    <?php
    
    require 'views/about.view.php';
    
    // views/about.view.php
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
    </html>
    

    一个请求通过路由执行到 controllers/about.php 页面,渲染相应的视图 views/about.view.php,就这么回事。

    Contact PageAbout Page 的内容是类似的。

    总体来说,通过这个小实践我们定义了一个简单的路由,将不同的页面请求指向到相应的控制器脚本,同时保证了程序的层次结构(业务逻辑和内容展示分离) 清晰。

    相关文章

      网友评论

          本文标题:PHP 新手入门指南 - 简单路由

          本文链接:https://www.haomeiwen.com/subject/igxfcxtx.html