請(qǐng)求模塊

從零開始編寫一個(gè)PHP框架 系列的《請(qǐng)求模塊》

項(xiàng)目地址:terse

前言

當(dāng)我們打開一個(gè)網(wǎng)頁弥臼,瀏覽器會(huì)發(fā)出很多請(qǐng)求兔沃,有的是請(qǐng)求文件脖祈,有的是請(qǐng)求接口乙墙。

在編寫和處理接口相關(guān)問題的時(shí)候逻谦,難免會(huì)需要分析請(qǐng)求相關(guān)的事情掌实,比如:請(qǐng)求類型、請(qǐng)求頭邦马、請(qǐng)求相關(guān)的數(shù)據(jù)等潮峦。

需求分析

主要從幾個(gè)大的方面來區(qū)分。

  • 服務(wù)器相關(guān)變量的獲取
  • 請(qǐng)求類型的獲取
  • 請(qǐng)求參數(shù)的獲取

文件結(jié)構(gòu)

├── Interfaces
│   └── Request.php    [接口]
└── Request.php        [請(qǐng)求類]

為了規(guī)范一點(diǎn)勇婴,以后的模塊盡量都加上相關(guān)接口忱嘹。

由于這里接口的函數(shù)和子類的函數(shù)一致,這里就不重復(fù)寫了耕渴。

服務(wù)器相關(guān)變量的獲取

眾所周知拘悦,服務(wù)端相關(guān)的變量都是從 $_SERVER 里獲取的。所以我們需要對(duì)外提供一個(gè) getServer 的接口橱脸。

為了使用方便础米,我們要將一些經(jīng)常用到的參數(shù),封裝好方法給暴露給外界添诉。

<?php
class Request implements RequestInterface
{
    /**
     * 獲取 $_SERVER 參數(shù)
     *
     * @param string $name
     * @return mixed
     */
    public function getServer($name)
    {
        if (isset($_SERVER[$name])) {
            return $_SERVER[$name];
        }
        return null;
    }

    /**
     * 獲取 Header 信息
     *
     * @param string $name
     * @return string
     */
    public function getHeader($header)
    {
        $name = strtoupper(strtr($header, "-", "_"));
        $result = $this->getServer($name);
        if ($result) {
            return $result;
        }
        return $this->getServer('HTTP_' . $name);
    }

    /**
     * 獲取 HTTP schema (http/https)
     *
     * @return string
     */
    public function getScheme()
    {
        $https = $this->getServer('HTTPS');
        return $https && $https != 'off' ? 'https' : 'http';
    }

    /**
     * 獲取服務(wù)器IP
     *
     * @return string
     */
    public function getServerAddress()
    {
        $serverAddress = $this->getServer('SERVER_ADDR');
        return $serverAddress ? $serverAddress : gethostbyname('localhost');
    }

    /**
     * 獲取服務(wù)器名稱
     *
     * @return string
     */
    public function getServerName()
    {
        $serverName = $this->getServer('SERVER_NAME');
        return $serverName ? $serverName : 'localhost';
    }

    /**
     * 獲取請(qǐng)求頭中 Host: 項(xiàng)的內(nèi)容
     *
     * @return string
     */
    public function getHttpHost()
    {
        return $this->getServer('HTTP_HOST');
    }

    /**
     * 獲取端口
     *
     * @return int
     */
    public function getPort()
    {
        return $this->getServer('SERVER_PORT');
    }

    /**
     * 獲取URI
     * 
     * @return string
     */
    public final function getURI()
    {
        return $this->getServer('REQUEST_URI');
    }

    /**
     * 獲取客戶端IP
     *
     * @return string
     */
    public function getClientAddress()
    {
        return $this->getServer('REMOTE_ADDR');
    }

    /**
     * 獲取 UA
     *
     * @return string
     */
    public function getUserAgent()
    {
        return $this->getServer('HTTP_USER_AGENT');
    }

    /**
     * 獲取 http referer
     *
     * @return string
     */
    public function getHttpReferer()
    {
        return $this->getServer('HTTP_REFERER');
    }

    /**
     * 獲取請(qǐng)求方式
     *
     * @return string
     */
    public function getMethod()
    {
        $method = $this->getServer('REQUEST_METHOD');
        // 判斷 是否存在
        return $this->isValidMethod($method) ? $method : self::METHOD_GET;
    }
}

請(qǐng)求類型的獲取

關(guān)于請(qǐng)求類型屁桑,除了我們常用的 GETPOST 之外,還有一些像 OPTIONS栏赴、PUT蘑斧、DELETEPATCH须眷、HEAD 等竖瘾。

<?php
class Request implements RequestInterface
{
    const METHOD_GET     = 'GET';
    const METHOD_POST    = 'POST';
    const METHOD_PUT     = 'PUT';
    const METHOD_DELETE  = 'DELETE';
    const METHOD_HEAD    = 'HEAD';
    const METHOD_OPTIONS = 'OPTIONS';
    const METHOD_PATCH   = 'PATCH';
}

為了辨別請(qǐng)求是不是相關(guān)類型,我們需要有個(gè)函數(shù)作為判斷花颗,比如 is*捕传。

<?php
class Request implements RequestInterface
{
    ...

    /**
     * 判斷是否 GET
     *
     * @return bool
     */
    public function isGet()
    {
        return $this->getMethod() === self::METHOD_GET;
    }

    /**
     * 判斷是否 POST
     *
     * @return bool
     */
    public function isPost()
    {
        return $this->getMethod() === self::METHOD_POST;
    }

    /**
     * 判斷是否 PUT
     *
     * @return bool
     */
    public function isPut()
    {
        return $this->getMethod() === self::METHOD_PUT;
    }

    /**
     * 判斷是否 DELETE
     *
     * @return bool
     */
    public function isDelete()
    {
        return $this->getMethod() === self::METHOD_DELETE;
    }

    /**
     * 判斷是否 HEAD
     *
     * @return bool
     */
    public function isHead()
    {
        return $this->getMethod() === self::METHOD_HEAD;
    }

    /**
     * 判斷是否 OPTIONS
     *
     * @return bool
     */
    public function isOptions()
    {
        return $this->getMethod() === self::METHOD_OPTIONS;
    }

    /**
     * 判斷是否 PATCH
     *
     * @return bool
     */
    public function isPatch()
    {
        return $this->getMethod() === self::METHOD_PATCH;
    }

    /**
     * 獲取請(qǐng)求方式
     *
     * @return string
     */
    public function getMethod()
    {
        $method = $this->getServer('REQUEST_METHOD');
        // 判斷 是否存在
        return $this->isValidMethod($method) ? $method : self::METHOD_GET;
    }

    /**
     * 檢查方法
     *
     * @param string $method
     * @return bool
     */
    protected function isValidMethod($method)
    {
        switch ($method) {
            case self::METHOD_GET:
            case self::METHOD_POST:
            case self::METHOD_PUT:
            case self::METHOD_DELETE:
            case self::METHOD_HEAD:
            case self::METHOD_OPTIONS:
            case self::METHOD_PATCH:
            case self::METHOD_PURGE:
            case self::METHOD_TRACE:
            case self::METHOD_CONNECT:
                return true;
        }
        return false;
    }
}

請(qǐng)求參數(shù)的獲取

關(guān)于請(qǐng)求參數(shù),這里有幾種類型:REQUEST扩劝、GET庸论、POST职辅、PUTRAW INPUT聂示、FILES罐农。

<?php
class Request implements RequestInterface
{
    /**
     * 獲取 $_REQUEST 參數(shù)
     *
     * @param string       $name
     * @param string|array $filters
     * @param mixed        $default
     * @return mixed
     */
    public function get($name = null, $filters = null, $default = null)
    {
        return $this->getHelper($_REQUEST, $name, $filters, $default);
    }

    /**
     * 獲取 $_POST 參數(shù)
     *
     * @param string       $name
     * @param string|array $filters
     * @param mixed        $default
     * @return mixed
     */
    public function getPost($name = null, $filters = null, $default = null)
    {
        return $this->getHelper($_POST, $name, $filters, $default);
    }

    /**
     * 獲取 $_GET 參數(shù)
     *
     * @param string       $name
     * @param string|array $filters
     * @param mixed        $default
     * @return mixed
     */
    public function getQuery($name = null, $filters = null, $default = null)
    {
        return $this->getHelper($_GET, $name, $filters, $default);
    }

    /**
     * 獲取上傳的文件
     *
     * @return boolean
     */
    public function getFiles()
    {
        return $_FILES;
    }

    /**
     * Gets HTTP raw request body
     *
     * @return string
     */
    public function getRawBody()
    {
        if (!$this->_rawBody) {
            $this->_rawBody = @file_get_contents('php://input');
        }
        return $this->_rawBody;
    }

    /**
     * Gets HTTP raw request body
     *
     * @return string
     */
    public function getJsonRawBody()
    {
        $rawBody = $this->getRawBody();
        return @json_decode($rawBody, true);
    }

    /**
     * 判斷參數(shù)是否存在,并啟用過濾
     * 
     * @param  array  $source
     * @param  string $name
     * @param  array  $filters
     * @param  mixed  $default
     * @return mixed
     */
    protected final function getHelper(array $source, $name, $filters, $default)
    {
        if (!$name) {
            return $source;
        }

        $value = $default;
        if (isset($source[$name])) {
            $value = $source[$name];
        }

        // 本來想寫filter的催什,這個(gè)放到第二期再做吧
        if (!!$filters) {
            # filter
        }

        return !$value && $default ? $default : $value;
    }
}

有時(shí)候,我們需要判斷某個(gè)參數(shù)是否存在宰睡,所以我們需要提供 has* 方法蒲凶。

<?php
class Request implements RequestInterface
{
    /**
     * 檢查 $_REQUEST 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function has($name)
    {
        return isset($_REQUEST[$name]);
    }

    /**
     * 檢查 $_POST 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function hasPost($name)
    {
        return isset($_POST[$name]);
    }

    /**
     * 檢查 $_GET 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function hasQuery($name)
    {
        return isset($_GET[$name]);
    }

    /**
     * 檢查 $_SERVER 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function hasServer($name)
    {
        return isset($_SERVER[$name]);
    }

    /**
     * 判斷是否存在上傳文件
     *
     * @return boolean
     */
    public function hasFiles()
    {
        return !!$_FILES;
    }
}

其它

由于我們經(jīng)常使用 Ajax,所以請(qǐng)求里面也提供了 isAjax 的接口供外界調(diào)用拆内。

<?php
class Request implements RequestInterface
{
    /**
     * 判斷是否 AJAX
     *
     * @return bool
     */
    public function isAjax()
    {
        $httpXRequest = $this->getServer('HTTP_X_REQUESTED_WITH');
        return strtoupper($httpXRequest) == "XMLHTTPREQUEST";
    }
}

完整代碼

目前考慮的就是這些方法旋圆,在實(shí)際應(yīng)用中,如果不夠麸恍,則會(huì)不斷的添加方法灵巧。

<?php
namespace Terse\Http;

use Terse\Http\Interfaces\Request as RequestInterface;
/**
* Terse\Http\Request
* 
* @link https://gitee.com/imjcw/terse
* @author imjcw <imjcw@imjcw.com>
*/
class Request implements RequestInterface
{
    const METHOD_GET = 'GET';
    const METHOD_POST = 'POST';
    const METHOD_PUT = 'PUT';
    const METHOD_DELETE = 'DELETE';
    const METHOD_HEAD = 'HEAD';
    const METHOD_OPTIONS = 'OPTIONS';
    const METHOD_PATCH = 'PATCH';
    const METHOD_PURGE = 'PURGE';
    const METHOD_TRACE = 'TRACE';
    const METHOD_CONNECT = 'CONNECT';

    protected $_rawBody;

    /**
     * 獲取 $_REQUEST 參數(shù)
     *
     * @param string       $name
     * @param string|array $filters
     * @param mixed        $default
     * @return mixed
     */
    public function get($name = null, $filters = null, $default = null)
    {
        return $this->getHelper($_REQUEST, $name, $filters, $default);
    }

    /**
     * 獲取 $_POST 參數(shù)
     *
     * @param string       $name
     * @param string|array $filters
     * @param mixed        $default
     * @return mixed
     */
    public function getPost($name = null, $filters = null, $default = null)
    {
        return $this->getHelper($_POST, $name, $filters, $default);
    }

    /**
     * 獲取 $_GET 參數(shù)
     *
     * @param string       $name
     * @param string|array $filters
     * @param mixed        $default
     * @return mixed
     */
    public function getQuery($name = null, $filters = null, $default = null)
    {
        return $this->getHelper($_GET, $name, $filters, $default);
    }

    /**
     * 獲取上傳的文件
     *
     * @return boolean
     */
    public function getFiles()
    {
        return $_FILES;
    }

    /**
     * Gets HTTP raw request body
     *
     * @return string
     */
    public function getRawBody()
    {
        if (!$this->_rawBody) {
            $this->_rawBody = @file_get_contents('php://input');
        }
        return $this->_rawBody;
    }

    /**
     * Gets HTTP raw request body
     *
     * @return string
     */
    public function getJsonRawBody()
    {
        $rawBody = $this->getRawBody();
        return @json_decode($rawBody, true);
    }

    /**
     * 檢查 $_REQUEST 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function has($name)
    {
        return isset($_REQUEST[$name]);
    }

    /**
     * 檢查 $_POST 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function hasPost($name)
    {
        return isset($_POST[$name]);
    }

    /**
     * 檢查 $_GET 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function hasQuery($name)
    {
        return isset($_GET[$name]);
    }

    /**
     * 檢查 $_SERVER 中是否存在指定參數(shù)
     *
     * @param string $name
     * @return bool
     */
    public function hasServer($name)
    {
        return isset($_SERVER[$name]);
    }

    /**
     * 判斷是否存在上傳文件
     *
     * @return boolean
     */
    public function hasFiles()
    {
        return !!$_FILES;
    }

    /**
     * 獲取 $_SERVER 參數(shù)
     *
     * @param string $name
     * @return mixed
     */
    public function getServer($name)
    {
        if (isset($_SERVER[$name])) {
            return $_SERVER[$name];
        }
        return null;
    }

    /**
     * 獲取 Header 信息
     *
     * @param string $name
     * @return string
     */
    public function getHeader($header)
    {
        $name = strtoupper(strtr($header, "-", "_"));
        $result = $this->getServer($name);
        if ($result) {
            return $result;
        }
        return $this->getServer('HTTP_' . $name);
    }

    /**
     * 獲取 HTTP schema (http/https)
     *
     * @return string
     */
    public function getScheme()
    {
        $https = $this->getServer('HTTPS');
        return $https && $https != 'off' ? 'https' : 'http';
    }

    /**
     * 獲取服務(wù)器IP
     *
     * @return string
     */
    public function getServerAddress()
    {
        $serverAddress = $this->getServer('SERVER_ADDR');
        return $serverAddress ? $serverAddress : gethostbyname('localhost');
    }

    /**
     * 獲取服務(wù)器名稱
     *
     * @return string
     */
    public function getServerName()
    {
        $serverName = $this->getServer('SERVER_NAME');
        return $serverName ? $serverName : 'localhost';
    }

    /**
     * 獲取請(qǐng)求頭中 Host: 項(xiàng)的內(nèi)容
     *
     * @return string
     */
    public function getHttpHost()
    {
        return $this->getServer('HTTP_HOST');
    }

    /**
     * 獲取端口
     *
     * @return int
     */
    public function getPort()
    {
        return $this->getServer('SERVER_PORT');
    }

    /**
     * 獲取URI
     * 
     * @return string
     */
    public final function getURI()
    {
        return $this->getServer('REQUEST_URI');
    }

    /**
     * 獲取客戶端IP
     *
     * @return string
     */
    public function getClientAddress()
    {
        return $this->getServer('REMOTE_ADDR');
    }

    /**
     * 獲取 UA
     *
     * @return string
     */
    public function getUserAgent()
    {
        return $this->getServer('HTTP_USER_AGENT');
    }

    /**
     * 獲取 http referer
     *
     * @return string
     */
    public function getHttpReferer()
    {
        return $this->getServer('HTTP_REFERER');
    }

    /**
     * 獲取請(qǐng)求方式
     *
     * @return string
     */
    public function getMethod()
    {
        $method = $this->getServer('REQUEST_METHOD');
        // 判斷 是否POST
        if ($method === self::METHOD_POST) {
            $method = $this->validPost();
        }
        // 判斷 是否存在
        return $this->isValidMethod($method) ? $method : self::METHOD_GET;
    }

    /**
     * 判斷是否 GET
     *
     * @return bool
     */
    public function isGet()
    {
        return $this->getMethod() === self::METHOD_GET;
    }

    /**
     * 判斷是否 POST
     *
     * @return bool
     */
    public function isPost()
    {
        return $this->getMethod() === self::METHOD_POST;
    }

    /**
     * 判斷是否 PUT
     *
     * @return bool
     */
    public function isPut()
    {
        return $this->getMethod() === self::METHOD_PUT;
    }

    /**
     * 判斷是否 DELETE
     *
     * @return bool
     */
    public function isDelete()
    {
        return $this->getMethod() === self::METHOD_DELETE;
    }

    /**
     * 判斷是否 HEAD
     *
     * @return bool
     */
    public function isHead()
    {
        return $this->getMethod() === self::METHOD_HEAD;
    }

    /**
     * 判斷是否 OPTIONS
     *
     * @return bool
     */
    public function isOptions()
    {
        return $this->getMethod() === self::METHOD_OPTIONS;
    }

    /**
     * 判斷是否 PATCH
     *
     * @return bool
     */
    public function isPatch()
    {
        return $this->getMethod() === self::METHOD_PATCH;
    }

    /**
     * 判斷是否 AJAX
     *
     * @return bool
     */
    public function isAjax()
    {
        $httpXRequest = $this->getServer('HTTP_X_REQUESTED_WITH');
        return strtoupper($httpXRequest) == "XMLHTTPREQUEST";
    }

    /**
     * 待寫
     */
    protected function validPost()
    {
        return self::METHOD_POST;
    }

    /**
     * 檢查方法
     *
     * @param string $method
     * @return bool
     */
    protected function isValidMethod($method)
    {
        switch ($method) {
            case self::METHOD_GET:
            case self::METHOD_POST:
            case self::METHOD_PUT:
            case self::METHOD_DELETE:
            case self::METHOD_HEAD:
            case self::METHOD_OPTIONS:
            case self::METHOD_PATCH:
            case self::METHOD_PURGE:
            case self::METHOD_TRACE:
            case self::METHOD_CONNECT:
                return true;
        }
        return false;
    }

    /**
     * 判斷參數(shù)是否存在,并啟用過濾
     * 
     * @param  array  $source
     * @param  string $name
     * @param  array  $filters
     * @param  mixed  $default
     * @return mixed
     */
    protected final function getHelper(array $source, $name, $filters, $default)
    {
        if (!$name) {
            return $source;
        }

        $value = $default;
        if (isset($source[$name])) {
            $value = $source[$name];
        }

        if (!!$filters) {
            # filter
        }

        return !$value && $default ? $default : $value;
    }
}

調(diào)用方式

<?php
$request = new Request();
$request->get();
$request->getPost();
$request->getQuery();
$request->getJsonRawBody();
$request->isGet();
$request->isPost();
$request->isAjax();

最后

通篇基本在貼代碼了抹沪,畢竟基本是判斷和獲取刻肄,沒有什么比較特別的東西在里面。

下一篇《路由模塊》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末融欧,一起剝皮案震驚了整個(gè)濱河市敏弃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噪馏,老刑警劉巖麦到,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欠肾,居然都是意外死亡瓶颠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門刺桃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粹淋,“玉大人,你說我怎么就攤上這事瑟慈±。” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵封豪,是天一觀的道長谴轮。 經(jīng)常有香客問我,道長吹埠,這世上最難降的妖魔是什么第步? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任疮装,我火速辦了婚禮,結(jié)果婚禮上粘都,老公的妹妹穿的比我還像新娘廓推。我一直安慰自己,他們只是感情好翩隧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布樊展。 她就那樣靜靜地躺著,像睡著了一般堆生。 火紅的嫁衣襯著肌膚如雪专缠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天淑仆,我揣著相機(jī)與錄音涝婉,去河邊找鬼。 笑死蔗怠,一個(gè)胖子當(dāng)著我的面吹牛墩弯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寞射,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渔工,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桥温?” 一聲冷哼從身側(cè)響起涨缚,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎策治,沒想到半個(gè)月后脓魏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡通惫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年茂翔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片履腋。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珊燎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遵湖,到底是詐尸還是另有隱情悔政,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布延旧,位于F島的核電站谋国,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏迁沫。R本人自食惡果不足惜芦瘾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一捌蚊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧近弟,春花似錦缅糟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至二鳄,卻和暖如春赴涵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泥从。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沪摄,地道東北人躯嫉。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像杨拐,于是被迫代替她去往敵國和親祈餐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這么久了哄陶,有什么堅(jiān)持做的事帆阳,我這樣問自己。 我以為我沒有屋吨,在飛馳的火車上蜒谤,我想了想,我有至扰。 至少做了有3年以上的事...
    鄭州鏈家芮培豪閱讀 284評(píng)論 1 1
  • 關(guān)于陽痿早泄鳍徽,統(tǒng)一解答:性命性命,先有性才有命敢课,反過來性沒命也不遠(yuǎn)矣阶祭,藏象密宗修為身體好轉(zhuǎn)的第一指標(biāo)就是性歸,男子...
    9c091b821d42閱讀 1,115評(píng)論 0 0
  • 看著寶貝一天天的長大直秆,每天自己獨(dú)立完成作業(yè)濒募,看到你的進(jìn)步,我媽媽為你感到驕傲圾结、自豪瑰剃,寶貝你是最棒的 加油 ??媽媽...
    小安宇閱讀 247評(píng)論 0 0
  • 不知不覺喜歡上了畫畫,有了繪畫筝野,我不在孤單培他,沒事的時(shí)候鹃两,拿起筆,一畫就是一兩個(gè)小時(shí)舀凛,不僅僅能度過沒事的時(shí)間俊扳,還能夠...
    夢想的翅膀_0bbf閱讀 214評(píng)論 0 0
  • 認(rèn)識(shí)你之前 我沉浸在一場夢中 一場美好卻虛假的幻夢 你如俠客 從天而降義無反顧 打碎那籠罩我的水晶球 為你我愿離開...
    雪霽爾歸閱讀 266評(píng)論 0 3