GVKun编程网logo

php – 如何使Codeigniter中的分页类与AJAX一起使用?(ajax做分页)

13

对于php–如何使Codeigniter中的分页类与AJAX一起使用?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解ajax做分页,并且为您提供关于codeigniter-php的ci框架

对于php – 如何使Codeigniter中的分页类与AJAX一起使用?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解ajax做分页,并且为您提供关于codeigniter - php的ci框架中的分页类应该怎样使用?、CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms、CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite、CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms的宝贵知识。

本文目录一览:

php – 如何使Codeigniter中的分页类与AJAX一起使用?(ajax做分页)

php – 如何使Codeigniter中的分页类与AJAX一起使用?(ajax做分页)

我有一个通过 AJAX加载的表,以及表格,也通过AJAX加载分页.该表包含我网站上所有用户的列表,一次限制为30个.

这就是我从控制器返回对JavaScript的响应的方式:

$users = $this->users_m->get_users($type,$offset);
    $num_rows = $this->users_m->user_stats($type);

    $config['per_page'] = 30;
    $config['num_links'] = 5;
    $config['total_rows'] = $num_rows[0];
    $this->pagination->initialize($config);

    echo json_encode(array(
        'users' => $users,'pagination' => $this->pagination->create_links()
    ));

一切都很好,除了分页永远不正确.它是第一次,但在随后的请求中却没有.

在非AJAX页面中使用分页类时,我单击的页码将成为活动页面.此处第1页始终处于活动状态(由< strong>标记包围而不是链接).其次,数字永远不会改变.我明白了:

[1] [2] [3] [4] [5] [6] [>] [Last >]

每次.即使我点击最后我得到相同的数字,它也不会改变.

如何让分页类与AJAX一起使用?

解决方法

好的我想出了一个可行的解决方案,我会在这里发布,以防其他人遇到同样的问题.

我使用了这里找到的分页类:

http://www.catchmyfame.com/2007/07/28/finally-the-simple-pagination-class/

但修改它既可以作为CI库,也可以使用我特定的javascript.创建一个名为的新文件

Pagination_ajax.PHP

并将其放在与默认分页类相同的位置

/系统/库.

这是修改后的类:

<?PHP if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
 * PHP Pagination Class
 * @author admin@catchmyfame.com - http://www.catchmyfame.com
 * @version 2.0.0
 * @date October 18,2011
 * @copyright (c) admin@catchmyfame.com (www.catchmyfame.com)
 * @license CC Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) - http://creativecommons.org/licenses/by-sa/3.0/
 */

class Pagination_ajax {

    var $items_per_page;
    var $items_total;
    var $current_page;
    var $num_pages;
    var $mid_range;
    var $low;
    var $limit;
    var $return;
    var $default_ipp;
    var $querystring;
    var $ipp_array;

    function Paginator()
    {
        $this->current_page = 1;
        $this->mid_range = 7;
        $this->ipp_array = array(10,25,50,100,'All');
        $this->items_per_page = (!empty($_GET['ipp'])) ? $_GET['ipp']:$this->default_ipp;
    }

    function paginate()
    {
        if(!isset($this->default_ipp)) $this->default_ipp=25;
        if($_GET['ipp'] == 'All')
        {
            $this->num_pages = 1;
//          $this->items_per_page = $this->default_ipp;
        }
        else
        {
            if(!is_numeric($this->items_per_page) OR $this->items_per_page <= 0) $this->items_per_page = $this->default_ipp;
            $this->num_pages = ceil($this->items_total/$this->items_per_page);
        }
        $this->current_page = (isset($_GET['page'])) ? (int) $_GET['page'] : 1 ; // must be numeric > 0
        $prev_page = $this->current_page-1;
        $next_page = $this->current_page+1;
        if($_GET)
        {
            $args = explode("&",$_SERVER['QUERY_STRING']);
            foreach($args as $arg)
            {
                $keyval = explode("=",$arg);
                if($keyval[0] != "page" And $keyval[0] != "ipp") $this->querystring .= "&" . $arg;
            }
        }

        if($_POST)
        {
            foreach($_POST as $key=>$val)
            {
                if($key != "page" And $key != "ipp") $this->querystring .= "&$key=$val";
            }
        }
        if($this->num_pages > 10)
        {
            $this->return = ($this->current_page > 1 And $this->items_total >= 10) ? "<a data-page=\"$prev_page\" class=\"paginate\" href=\"#\">&laquo; PrevIoUs</a> ":"<span class=\"inactive\" href=\"#\">&laquo; PrevIoUs</span> ";

            $this->start_range = $this->current_page - floor($this->mid_range/2);
            $this->end_range = $this->current_page + floor($this->mid_range/2);

            if($this->start_range <= 0)
            {
                $this->end_range += abs($this->start_range)+1;
                $this->start_range = 1;
            }
            if($this->end_range > $this->num_pages)
            {
                $this->start_range -= $this->end_range-$this->num_pages;
                $this->end_range = $this->num_pages;
            }
            $this->range = range($this->start_range,$this->end_range);

            for($i=1;$i<=$this->num_pages;$i++)
            {
                if($this->range[0] > 2 And $i == $this->range[0]) $this->return .= " ... ";
                // loop through all pages. if first,last,or in range,display
                if($i==1 Or $i==$this->num_pages Or in_array($i,$this->range))
                {
                    $this->return .= ($i == $this->current_page And $_GET['page'] != 'All') ? "<a class=\"current\" href=\"#\">$i</a> ":"<a data-page=\"$i\" class=\"paginate\" href=\"#\">$i</a> ";
                }
                if($this->range[$this->mid_range-1] < $this->num_pages-1 And $i == $this->range[$this->mid_range-1]) $this->return .= " ... ";
            }
            $this->return .= (($this->current_page < $this->num_pages And $this->items_total >= 10) And ($_GET['page'] != 'All') And $this->current_page > 0) ? "<a data-page=\"$next_page\" class=\"paginate\" href=\"#\">Next &raquo;</a>\n":"<span class=\"inactive\" href=\"#\">&raquo; Next</span>\n";
            $this->return .= ($_GET['page'] == 'All') ? "<a class=\"current\" style=\"margin-left:10px\" href=\"#\">All</a> \n":"<a data-page=\"1\" data-all=\"true\" class=\"paginate\" style=\"margin-left:10px\" href=\"#\">All</a> \n";
        }
        else
        {
            for($i=1;$i<=$this->num_pages;$i++)
            {
                $this->return .= ($i == $this->current_page) ? "<a class=\"current\" href=\"#\">$i</a> ":"<a data-page=\"$i\" class=\"paginate\" href=\"#\">$i</a> ";
            }
            $this->return .= "<a data-page=\"1\" data-all=\"true\" class=\"paginate\" href=\"#\">All</a> \n";
        }
        $this->low = ($this->current_page <= 0) ? 0:($this->current_page-1) * $this->items_per_page;
        if($this->current_page <= 0) $this->items_per_page = 0;
        $this->limit = ($_GET['ipp'] == 'All') ? "":" LIMIT $this->low,$this->items_per_page";
    }
    function display_items_per_page()
    {
        $items = '';
        if(!isset($_GET[ipp])) $this->items_per_page = $this->default_ipp;
        foreach($this->ipp_array as $ipp_opt) $items .= ($ipp_opt == $this->items_per_page) ? "<option selected value=\"$ipp_opt\">$ipp_opt</option>\n":"<option value=\"$ipp_opt\">$ipp_opt</option>\n";
        return "<span class=\"paginate\">Items per page:</span><select class=\"paginate\" onchange=\"window.location='$_SERVER[PHP_SELF]?page=1&ipp='+this[this.selectedindex].value+'$this->querystring';return false\">$items</select>\n";
    }
    function display_jump_menu()
    {
        for($i=1;$i<=$this->num_pages;$i++)
        {
            $option .= ($i==$this->current_page) ? "<option value=\"$i\" selected>$i</option>\n":"<option value=\"$i\">$i</option>\n";
        }
        return "<span class=\"paginate\">Page:</span><select class=\"paginate\" onchange=\"window.location='$_SERVER[PHP_SELF]?page='+this[this.selectedindex].value+'&ipp=$this->items_per_page$this->querystring';return false\">$option</select>\n";
    }
    function display_pages()
    {
        return $this->return;
    }
}

您可以在此与原始下载之间进行区分,以查看我更改的内容.

控制器代码:

public function get_users() {

        // pagination
        $this->load->library('pagination_ajax');
        $pages = new Pagination_ajax;
        $num_rows = $this->users_m->user_stats(); // this is the COUNT(*) query that gets the total record count from the table you are querying
        $pages->items_total = $num_rows[0];
        $pages->mid_range = 10; // number of links you want to show in the pagination before the "..."
        $pages->paginate();

        $users = $this->users_m->get_users($pages->limit); // your query

        echo json_encode(array(
            'users' => $users,'pagination' => $pages->display_pages()
        ));

    }

型号代码:

public function get_users($limit) {

    $sql = "SELECT *
            FROM `users`
            $limit";

    $query = $this->db->query($sql);

    $users = array();
    foreach ($query->result() as $row) {
        $users[] = array(
            'user_id'   => $row->user_id,'username'  => $row->username,'email'     => $row->email
        );
    }

    return $users;
}

JQuery的:

// pagination
$('#pagination a').live('click',function() {
    var $this = $(this);
    var page = $this.data('page');
    var ipp = ($this.data('all')) ? 'All' : 30; // I am returning 30 results per page,change to what you want

    $.ajax({
        url: '/admin/users/get_users?page=' + page + '&ipp=' + ipp,dataType: 'json',success: function(response) {

            for(var i=0; i<response.users.length; i++) {
                var user = response.users[i];
                var tr = '<tr>' +
                            '<td>' + user.user_id + '</td>' +
                            '<td>' + user.username + '</td>' +
                            '<td>' + user.email + '</td>' +
                        '</tr>';

                $('table tbody').append(tr);
            }

            // pagination
            $('#pagination').html(response.pagination);             
        },error: function() {
            alert('An error occurred');
        }
    });

    return false;
});

HTML

<h1>Users</h1>

    <table>
        <thead>
            <th>ID</th>
            <th>Username</th>
            <th>Email</th>
        </thead>
        <tbody></tbody>
    </table>                        

    <div id="pagination"></div>

CSS

#pagination { overflow: hidden; margin-bottom: 10px; text-align: center; }
#pagination a { display: inline-block; padding: 3px 5px; font-size: 14px; color: #333; border-radius: 3px; text-shadow: 0 0 1px #fff;  border: 1px solid #ccc;

    background: #ffffff;
    background: -moz-linear-gradient(top,#ffffff 0%,#f6f6f6 47%,#ededed 100%);
    background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#ffffff),color-stop(47%,#f6f6f6),color-stop(100%,#ededed));
    background: -webkit-linear-gradient(top,#ededed 100%);
    background: -o-linear-gradient(top,#ededed 100%);
    background: -ms-linear-gradient(top,#ededed 100%);
    background: linear-gradient(to bottom,#ededed 100%);
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff',endColorstr='#ededed',GradientType=0 );
}
#pagination a:hover { border: 1px solid #333; }
#pagination a.current { color: #f00; }

希望有人觉得这很有用.

codeigniter - php的ci框架中的分页类应该怎样使用?

codeigniter - php的ci框架中的分页类应该怎样使用?

新手,不太懂。现在假设在一个news控制器中通过article_list方法取得了总共50条记录,应怎样通过分页类来显示呢?

news 控制器 varticle_list`方法

phppublic function article_list()
{
    $query = $this-&gt;db-&gt;get(''article'');
    $result = $query-&gt;result_array();
    $data[''articles''] = $result;

    $this-&gt;load-&gt;view(''news.php'',$data);
}
登录后复制
登录后复制

view文件:news.php

php<?php foreach($articles as $article):?><div>
    ...   
</div>
<?php endforeach; ?>
登录后复制
登录后复制

ci框架给的示例代码是这样的:

php$this-&gt;load-&gt;library(''pagination'');
$config[''base_url''] = ''http://example.com/index.php/test/page/'';
$config[''total_rows''] = 200;
$config[''per_page''] = 20; 
$this-&gt;pagination-&gt;initialize($config); 
echo $this-&gt;pagination-&gt;create_links();
登录后复制
登录后复制

这样只是创建了一个 1 2 3 4 这样的翻页链接而已,不知道怎样和那些数据记录联系在一起。

立即学习“PHP免费学习笔记(深入)”;

前面取得的文章都在一个页面通过 foreach 完全显示出来了,不知道怎样将分页和文章的显示联系在一起,感觉我没说清,但是也不知道怎么描述这个问题。

回复内容:

新手,不太懂。现在假设在一个news控制器中通过article_list方法取得了总共50条记录,应怎样通过分页类来显示呢?

news 控制器 varticle_list`方法

phppublic function article_list()
{
    $query = $this-&gt;db-&gt;get(''article'');
    $result = $query-&gt;result_array();
    $data[''articles''] = $result;

    $this-&gt;load-&gt;view(''news.php'',$data);
}
登录后复制
登录后复制

view文件:news.php

php<?php foreach($articles as $article):?><div>
    ...   
</div>
<?php endforeach; ?>
登录后复制
登录后复制

ci框架给的示例代码是这样的:

php$this-&gt;load-&gt;library(''pagination'');
$config[''base_url''] = ''http://example.com/index.php/test/page/'';
$config[''total_rows''] = 200;
$config[''per_page''] = 20; 
$this-&gt;pagination-&gt;initialize($config); 
echo $this-&gt;pagination-&gt;create_links();
登录后复制
登录后复制

这样只是创建了一个 1 2 3 4 这样的翻页链接而已,不知道怎样和那些数据记录联系在一起。

立即学习“PHP免费学习笔记(深入)”;

前面取得的文章都在一个页面通过 foreach 完全显示出来了,不知道怎样将分页和文章的显示联系在一起,感觉我没说清,但是也不知道怎么描述这个问题。

你需要自己在查询里面加上 offset 和 limit 限制

phppublic function article_list($limit,$offset)
{
    $query = $this-&gt;db-&gt;get(''article'',$limit,$offset);
    $result = $query-&gt;result_array();
    $data[''articles''] = $result;
   $this-&gt;load-&gt;view(''news.php'',$data);
}
登录后复制

CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms

CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms

data-id="1190000004868218">

我们综合考虑了社区的愿望和意见后,也对什么样的未来对 ci 是最合适的做了一些思考,然后,ci 理事会对框架的未来做出了一些决策。预告一下,未来将会有重大变化,但我们相信他们不仅为我们的未来做准备,也会保持 codeigniter 的一贯特点 - 简洁、快速和灵活。

这篇文章是对未来的一个简单概述。请记住,这仅仅是最初的计划。任何信息都可能会随着开发的进行而发生变化。

核心变化

从 CodeIgniter 第一版发布以来,PHP 社区发生了巨大变化。CodeIgniter 的许多核心要素在当时是必须的,但当 PHP5 发布后,CodeIgniter 的核心几乎没有任何变化。如果未来 CodeIgniter 想要继续保持高水准并巩固其在 PHP 框架中的地位,则必须进行大改变。

这意味着系统必须全部重写。新的 CI 将在独立的代码库中开发以保持代码的清晰。我们设想会复用一些以前的代码,但重点是 现代的 清晰的代码。

立即学习“PHP免费学习笔记(深入)”;

自从我们以 PHP 7 为目标以来,PHP 5.6 已进入安全维护模式,并将在几个月后完全停止支持。CI 暂时不会为一个即将停止支持的 PHP 版本发布新版本。我们知道主机的环境千差万别,那么一些程序可能就无法完全支持 PHP 7,所以 3.x 分支将继续维护一段时间 - 将远远长于 3.x 发布后的 2.x 分支的 EOL 时限。

application 和 system 目录都将支持 PSR-4 自动加载。CodeIgniter 将使用自己的自动加载器,并将会整合 Composer。

我们将封装一些组件,以便在大多数情况下可以用于 CodeIgniter 以外的项目。

包/模块

我们将丢弃应用程序包和模块的概念。不必惊慌!因为你可以用名字空间来处理大多数情况 - 至少控制器和模型是这样的。对于其他的例如视图、配置文件和 Helper 等,我们相信可以让这些东东支持名字空间。你也可以把所有包的功能和模块的路由能力放到任意目录中,只需告诉自动加载器如何找到他们。

路由

路由功能将被更新。URI 直接映射到控制器/方法这个『魔术路由』功能将可关闭,以便让你选择自己喜欢的路由方式。在路由配置文件中你可以选择使用『魔术路由』或者单独指定每个路由。

改进的日志系统

日志系统将被改进,但具体细节尚未确定。

测试

我们将继续使用 PHPUnit 做测试。这也意味着你需要自己测试应用程序,但我们将为你准备好所需的工具。

向后兼容性

正如上面讲到的那样,这一定是一个和老版本不兼容的版本。我们认为这应该是框架最好的未来。对于这次的重大变化,我们已经做了很多年的基础工作,我们将尽可能的使过渡更平滑,但是对于我们能提供一个怎样的现代化的基础代码仍有待观察。

我们将尽最大努力保持让 CodeIgniter 多年来流行的特性,即快速、简洁和『优雅』。

开发时间表

整个开发过程将分为三个阶段。

下列类库将从内核删除,改为按需下载:排版类、FTP 类、ZIP 类和 XML-RPC 类。

购物车类、Javascript 类、单元测试类和 Trackback 类将被删除。

我们期望在一年内能完成一个内核基本成型的 Alpha 版本。之后,我们将把重点放在改进内核与开发剩余软件包的工作中。确切的时间表可能会有所不同,因为,与大多数开源项目一样,这取决于社区贡献的数量与质量,以及核心开发者的时间和精力。

第一阶段

第一阶段将侧重于抓住框架最重要的部分。这将是框架其他部分的基础。他们包括:

  • 自动加载器

  • 依赖注入

  • 日志

  • 异常处理

  • HTTP 请求/响应层(或输入/输出)

  • 路由

  • 控制器

  • 模型

  • 数据库层

  • 配置

  • 安全

第二阶段

第二阶段的重点是完善一些 CodeIgniter 用户喜闻乐见的类和特性。他们包括:

  • Helper

  • 语言/国际化特性

  • 缓存

  • Email

  • 加密

  • 表单验证

  • 图像处理类库

  • 分页

  • 上传类

  • Session

  • 视图

  • 调试和分析工具

第三阶段 - 可选类库

第三阶段将主要用来扩充可选软件包。在这个时间点,框架应该可以发布了,不需要等到所有类库都准备就绪。

  • FTP

  • XML-RPC

  • Zip

  • 排版类

  • 模板解析器

框架迎来了新的机遇使我们很兴奋,并迫不及待的希望框架为新版迈出第一步。不要在一旁围观了,赶快来构筑框架的未来吧。

以上就介绍了CodeIgniter 4 建议路线图,包括了codeigniter方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite

CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite

data-id="1190000004868343">

当我关注到 http 层的时候,发现很多 cier 对内容协商还不是很了解,下面我们一起来探讨一下什么是内容协商,以及如何在即将到来的 codeigniter 4 中使用他。

什么是内容协商?

简而言之,内容协商是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、图片类型和编码方式等作为判断的基准(包含在请求头中的某些 Accept 字段就是判断的基准)。

举个例子,我用 Chrome 访问 Mozilla 的站点,可以看到下面的 HTTP 请求头信息:

  • accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

  • accept-encoding:gzip, deflate, sdch

  • accept-language:en-US,en;q=0.8

这些 accept 信息告诉我们浏览器所支持的格式,并提供这些格式的优先级信息(通过 q 的值来确定优先级)。以上信息说明浏览器在所有支持的内容类型中更希望接收 text/html 类型的内容。由于我的浏览器的语言设置是英语,所以 accept-language 请求头表示我更喜欢美式英语(en-US)的页面。

很显然,即使我们不提供任何内容协商信息,Web 站点还是可以照常运行,并且我们已经这样做了很多年。然而事实上 Web 服务器可以帮我们处理某些形式的内容协商,我们通常不太善于利用这一点,但并不意味着服务器不能处理这些信息。

内容协商有两个很吸引人的用处,一个是用于那些支持多国语言的站点,另一个是用于返回特定格式数据的 API 接口。

是不是必须要使用内容协商呢?可能不一定,他也许是把双刃剑,有些人提议不要使用他,也有些人认为他就像切片面包一样令人喜爱。但如果你想用,那在 CodeIgniter 中使用内容协商也是很容易的。

一个简单的例子

这里我不会对内容协商作过多详细的介绍(详细介绍将写到用户手册中),这个例子简单介绍了内容协商是如何确定输出语言的。

class BaseController extends \CodeIgniter\Controller
{
    protected $language;

    public function __construct(...$params)
    {
        parent::__construct(...$params);

        $supportedLangs = [''en-US'', ''en'', ''fr''];

        $this-&gt;language = $this-&gt;request-&gt;negotiate(''language'', $supportedLangs);
    }
}
登录后复制

这个例子表示该站点可以支持英语和法语,我们将支持的语言赋值到 $supportedLangs 数组里,预示着默认语言是美式英语,但也支持普通英语和法语,然后简单调用 $negotiate->language() 方法,传递支持的语言类型,解析时就能识别正确的 HTTP 头,然后按照数组里定义的优先级顺序,返回最匹配的结果。如果两种语言都无法匹配,就会使用数组中的第一个语言。

Negotiate 类中的 4 个协商方法分别为:

  • media() 不同于通常的 Accept 请求头,他可以用来请求不同版本的 html/text,或者音频支持,图像支持,等等。

  • charset() 不同于 Accept-Charset 请求头,如果没有匹配的话,默认值为 UTF-8。

  • encoding() 不同于 Accept-Encoding 请求头,可以决定任何客户端支持使用的压缩类型。

  • language() 不同于 Accept-Language 请求头。

并不是所有场景都用得着内容协商,但他却是构建高质量 API 的一个有力工具,并且也能够创造性的应用于其他地方。

以上就介绍了CodeIgniter 4 的内容协商,包括了codeigniter方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms

CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms

data-id="1190000004868315">

codeigniter 4 对输入和输出的处理方式做了一个较大的改变。在上一个版本中,包括最新的 v3 版,输入和输出分别是用两个包含相关函数的类来处理的。这样的处理方式背后虽然没有什么高深的技术,但却能简单直接的实现功能。在 v4 版中,我们将更加模块化 http 层,并构建全新的类结构来同时处理 http 的请求和响应。

概览

在开发 Web 应用时(不同于 CLI 程序),你只需关心两个类:IncomingRequest 和 Response。

IncomingRequest 类

IncomingRequest 类包含了 HTTP 请求和该请求附带的数据,包括:

立即学习“PHP免费学习笔记(深入)”;

  • GET、POST、SERVER 和 ENV 等环境变量

  • HTTP 请求头

  • Cookie

  • 当前请求的 URL 对象

  • 上传的文件

并且还包括常见的请求信息比如:

  • 客户端的 IP 地址

  • 是否为 Ajax 请求

  • 是否为 CLI 请求

  • 是否为 HTTPS

如果你对 IncomingRequest 这个类名感到奇怪,或者说 IncomingRequest 是不是可以简单的称为 Request?答案是否定的,因为已经有另一个包含 GET 和 POST 等变量的更为通用的 Request 类,但这个类不包括详细的 HTTP 请求信息。一个请求通常只做两件事:一个是浏览器客户端发送请求到服务器(连入),或者是当前服务器发送请求到外部服务器(连出)。

Response 类

Response 类用于把程序的执行结果返回给客户端。你可以设置 HTTP 响应头,或直接发送内容到客户端,等等。Response 类提供了一些便捷方法比如:

  • 设置适当的 no-cache 头信息

  • 处理 HTTP 缓存头信息

  • 重定向页面

一个简单的例子

上面说的这些看起来好像很有科技含量,但其实很简单。这些类的实例已作为属性放到每个控制器中,如果你觉得很麻烦,则无需直接使用这些属性。Response 类会捕获控制器的输出,并自动设置为响应的主体。一个简单的 Hello World 看起来像这样:

class Home extends \CodeIgniter\Controller
{
    public function index()
    {
        echo "Hello World!";
    }
}
登录后复制

易如反掌。

在需要的时候,框架为你提供了精确控制响应的能力。你可以创建复杂的 HTTP 缓存策略,并与 IncomingRequest 类一起通过内容协商定制响应内容。

下面是一个稍微复杂一点的例子,你会发现代码很容易看明白,并且处理的很简单。

class Home extends \CodeIgniter\Controller
{
    public function __construct(...$params)
    {
        parent::__construct(...$params);

        // This controller is only accessible via HTTPS
        if (! $this-&gt;request-&gt;isSecure())
        {
            // Redirect the user to this page via HTTPS, and set the Strict-Transport-Security
            // header so the browser will automatically convert all links to this page to HTTPS
            // for the next year.
            force_https();
        }
    }

    public function index()
    {
        $data = [
            ...
        ];

        // Set some HTTP cache rules for this page.
        $this-&gt;response-&gt;setCache([
            ''max-age'' =&gt; 300,
            ''s-max-age'' =&gt; 900,
            ''etag'' =&gt; ''foo''
        ]);

        // Return JSON
        $this-&gt;response-&gt;setContentType(''application/json'')
                       -&gt;setOutput(json_encode($data));
    }
}
登录后复制

在这个例子中,我们主要做了三件事。首先,通过将当前 URL 重定向到 HTTPS URL,并设置一个 Strict-Transport-Security 响应头(这种方式已被很多主流浏览器所支持,在发送请求前通过浏览器自动将 HTTP 请求转换成 HTTPS 请求),来强制这个页面以 HTTPS 的方式访问;然后,我们通过设置一些 HTTP 缓存规则来帮助浏览器正确处理缓存,这意味着能减少 HTTP 请求量,减轻服务器负担,提高性能;最后,我们输出 JSON 数据给用户,并确保内容类型是正确的。

希望这篇文章能有助于大家粗略的了解 CodeIgniter 的未来,让大家意识到改变并不可怕。:) 未来将敲定框架更多的细节,直到形成一个相对稳定的架构,并且会撰写更多的文章来讲述这些内容。

以上就介绍了CodeIgniter 4 的请求和响应,包括了codeigniter方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

我们今天的关于php – 如何使Codeigniter中的分页类与AJAX一起使用?ajax做分页的分享就到这里,谢谢您的阅读,如果想了解更多关于codeigniter - php的ci框架中的分页类应该怎样使用?、CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms、CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite、CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms的相关信息,可以在本站进行搜索。

本文标签: