成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Yii2時(shí)遇到的實(shí)際問(wèn)題

fnngj / 3313人閱讀

摘要:在使用這個(gè)的時(shí)候有的數(shù)據(jù)是需要加上的,因?yàn)椴蝗蝗绻麅?nèi)容里面帶有了這種就會(huì)出問(wèn)題。修改默認(rèn)的解析所使用的類(lèi)為新建的擴(kuò)展類(lèi)如果說(shuō)字符串需要使用的時(shí)候需要設(shè)置經(jīng)過(guò)本次的修改算是對(duì)如何修改和擴(kuò)展有了一定的認(rèn)識(shí)。

最近一直在學(xué)習(xí)Yii2框架,可能是一直以來(lái)對(duì)它的青睞,讓我難以對(duì)其它框架再產(chǎn)生興趣,學(xué)習(xí)中遇到了許多問(wèn)題,于是把問(wèn)題和解決辦法也記錄下來(lái),這樣方便以后復(fù)習(xí)和交流。

目錄

擴(kuò)展XmlResponseFormatter

在原有的Yii2框架上,新建一個(gè)api應(yīng)用

配置Yii2 request Parser使之可以通過(guò)Yii::$app->request->post()來(lái)接收 xml 和 json的數(shù)據(jù)

使用 TimestampBehavior 來(lái)自動(dòng)填充 created_at 和 updated_at

擴(kuò)展XmlResponseFormatter

在做微信接口測(cè)試的時(shí)候發(fā)現(xiàn),每次返回?cái)?shù)據(jù)的時(shí)候都是自己寫(xiě)的 xml 信息然后 echo 出來(lái),今天突然看到了 Yii::$app->response->format = Response::FORMAT_XML; 原來(lái)通過(guò)這個(gè)就可以設(shè)置返回的數(shù)據(jù)為 xml ,當(dāng)然 response 這個(gè)類(lèi)在 Controller 里面是沒(méi)有加載的,所以首先得加載一下 use yiiwebResponse; ,最后把需要返回的數(shù)據(jù)用數(shù)組的形式來(lái)返回即可:

response->format = Response::FORMAT_XML;
    return [
            "ToUserName"=>$postObject->FromUserName,
            "FromUserName"=>$postObject->ToUserName,
            "CreateTime"=>time(),
            "MsgType"=>"music",
            "Music"=>[
                "Title"=>$recognition,
                "Description"=>$decode,
                "MusicUrl"=>$musicurl,
                "HQMusicUrl"=>$musicurl,
            ]
        ];
}

這樣使用之后發(fā)現(xiàn)請(qǐng)求得到的結(jié)果是:



    
    
    1416207112
    music
    
        maps maroon5
        120976464.mp3?xcode=7ba3137f5fd742bcba7a6f5a2ffb7764172503013bacbdc8
        http://zhangmenshiting.baidu.com/data2/music/120976464/120976464.mp3?xcode=7ba3137f5fd742bcba7a6f5a2ffb7764172503013bacbdc8
        http://zhangmenshiting.baidu.com/data2/music/120976464/120976464.mp3?xcode=7ba3137f5fd742bcba7a6f5a2ffb7764172503013bacbdc8
    

問(wèn)題就來(lái)了,微信需要的格式是前外層以 ... 來(lái)定義的,后來(lái)終于在 Response 里面的 formatters 發(fā)現(xiàn)了信息,它里面定義了每個(gè)類(lèi)相應(yīng)的信息,我們可以通過(guò)手動(dòng)指定一些信息來(lái)覆蓋掉系統(tǒng)默認(rèn)的。

Yii::$app->response->formatters = [Response::FORMAT_XML=> ["class"=>yiiwebXmlResponseFormatter", "rootTag"=>"xml"];

通過(guò)這樣設(shè)置之后,最外層的 response 終于變成了 xml,又發(fā)現(xiàn)了一個(gè)問(wèn)題,那就是我的內(nèi)容里面根本就沒(méi)有SimpleXMLElement相關(guān)的東西,這個(gè)怎么會(huì)多出來(lái)?回看了一下邏輯代碼發(fā)現(xiàn)有:

$postObject = simplexml_load_string($postStr, "SimpleXMLElement", LIBXML_NOCDATA);

最后只能在return的時(shí)候加上類(lèi)型轉(zhuǎn)換為字符串,這下終于恢復(fù)正常了。

return [
    "ToUserName"=>(string)$postObject->FromUserName,
    "FromUserName"=>(string)$postObject->ToUserName,
    // ...
]

在使用這個(gè)的時(shí)候有的數(shù)據(jù)是需要加上 CDataSection() 的,因?yàn)椴蝗蝗绻麅?nèi)容里面帶有了 < 這種就會(huì)出問(wèn)題。這個(gè)確實(shí)讓我頭疼了很久,首先看了一下源代碼原來(lái)的類(lèi) XmlResponseFormatter, 確實(shí)無(wú)法滿足相應(yīng)的需求,滿足不了需求就只能擴(kuò)展了

step1. 在應(yīng)用下創(chuàng)建一個(gè) component 目錄
step2. 在component目錄下新建一個(gè) MyXmlResponseFormatter.php 的文件
step3. 實(shí)現(xiàn)這個(gè)類(lèi)

 $value) {
                if (is_int($name) && is_object($value)) {
                    $this->buildXml($element, $value);
                } elseif (is_array($value) || is_object($value)) {
                    $child = new DOMElement(is_int($name) ? $this->itemTag : $name);
                    $element->appendChild($child);
                    // 主要就是修改這一個(gè)點(diǎn),如果值是一個(gè)數(shù)組,并且含有 CDATA 的,那么就直接創(chuàng)建一個(gè) CdataSection 節(jié)點(diǎn),
                    // 而不把它本身當(dāng)作列表再回調(diào)。
                    if(array_key_exists(self::CDATA, $value)){
                        $child->appendChild(new DOMCdataSection((string) $value[0]));
                    }else{
                        $this->buildXml($child, $value);
                    }
                } else {
                    $child = new DOMElement(is_int($name) ? $this->itemTag : $name);
                    $element->appendChild($child);
                    $child->appendChild(new DOMText((string) $value));
                }
            }
        } else {
            $element->appendChild(new DOMText((string) $data));
        }
    }
}

step4. 修改默認(rèn)的 xml 解析所使用的類(lèi)為新建的擴(kuò)展類(lèi)

Yii::$app->response->formatters = [
    Response::FORMAT_XML=> ["class"=>"weixincomponentMyXmlResponseFormatter"]
];

step5. 如果說(shuō)字符串需要使用 CDATA 的時(shí)候需要設(shè)置

use weixincomponentMyXmlResponseFormatter as MXRF;

return [
    "ToUserName"=>[$postObj->FromUserName,MXRF::CDATA=>true],
    "FromUserName"=>[$postObj->ToUserName,MXRF::CDATA=>true],
    "CreateTime"=>time(),
    "MsgType"=>"music",
    "Music"=>[
        "Title"=>[$recognition,MXRF::CDATA=>true],
        "Description"=>[$decode,MXRF::CDATA=>true],
        "MusicUrl"=>[$musicurl,MXRF::CDATA=>true],
        "HQMusicUrl"=>[$musicurl,MXRF::CDATA=>true],
    ]
];

經(jīng)過(guò)本次的修改算是對(duì)如何修改和擴(kuò)展Yii2 有了一定的認(rèn)識(shí)。

在原有的Yii2框架上,新建一個(gè)api應(yīng)用

在做東西的時(shí)候需要清晰的結(jié)構(gòu)和邏輯,這樣做出來(lái)的東西相對(duì)來(lái)說(shuō)會(huì)比較漂亮,所以為了api我們可能得新建一個(gè)應(yīng)用,這里面全是api相關(guān)的程序,我通過(guò)Google “yii2 create new application”,“yii2 add new application”,都沒(méi)有找到相要的答案,于是只能開(kāi)動(dòng)自己的腦筋了。

$ cp -a environments/dev/frontend environments/dev/api

$ cp -a environments/prod/frontend environments/prod/api

# file: environments/index.php
 [
        "setWritable" => [
            // ... 在原來(lái)的后面添加上
            "api/runtime",
            "api/web/assets"
        ],
        "setCookieValidationKey" => [
            // ... 在原來(lái)的后面添加上
            "api/config/main-local.php",
        ],
    ],
    "Production" => [
        // 這里和上面一樣的添加
    ],
];

創(chuàng)建相應(yīng)的目錄:

$ mkdir -p api/{assets,config,controllers,models,runtime,web/assets}

$ touch api/{assets,config,controllers,models,runtime,web/assets}/.gitkeep

復(fù)制配置文件:

$ cp -a frontend/config/params.php frontend/config/main.php frontend/config/bootstrap.php frontend/config/.gitignore api/config

$ cp frontend/runtime/.gitignore api/runtime/

$ cp frontend/web/.gitignore api/web

# file api/config/main.php

return [
    "id" => "app-api",
    // ...
    "controllerNamespace" => "apicontrollers",
]

# file common/config/bootstrap.php
Yii::setAlias("api", dirname(dirname(__DIR__)) . "/api");

// 配置的其它信息看自己的需求而定

$ ./init

新建一個(gè)Controller來(lái)測(cè)試一下:

# file: api/controllers/SiteController.php


然后通過(guò)瀏覽器訪問(wèn)相應(yīng)的地址 http://hostname/api/web/index.php?r=site/index 能出來(lái) test 則代表 ok 啦,以上步驟都是一步步的嘗試和查看源代碼得來(lái)的,可能會(huì)有不規(guī)范的地方,若有不對(duì)的地方請(qǐng)到 Github (yii2-usage)上留言。

配置Yii2 request Parser使之可以通過(guò)Yii::$app->request->post()來(lái)接收 xml 和 json的數(shù)據(jù)

大家都知道 Yii2 接收 POST 數(shù)據(jù)是使用 Yii::$app->request->post();,但是如果發(fā)送過(guò)來(lái)的數(shù)據(jù)格式是 jsonxml 的時(shí)候,通過(guò)這個(gè)方法就無(wú)法獲取到數(shù)據(jù)了,Yii2 這么強(qiáng)大的組件型框架肯定想到了這一點(diǎn)。

對(duì)于 json 的解析 Yii2 已經(jīng)寫(xiě)好了 [[JsonResponseFormatter]] ,在配置文件里面配置一下即可使用。

# file app/config/main.php

"components" =>[
    "request" => [
        "parsers" => [
            "application/json" => "yiiwebJsonParser",
            "text/json" => "yiiwebJsonParser",
        ],
    ],
],

配置好之后訪問(wèn)提交過(guò)來(lái)的數(shù)據(jù)就太簡(jiǎn)單啦

# json raw data
{"username": "bob"}

# access data
$post_data = Yii::$app->request->post();
echo $post_data["username"];

# or
echo Yii::$app->request->post("username");

可以通過(guò) composer 添加依賴:bobchengbin/yii2-xml-request-parser 來(lái)完成

# file app/config/main.php

"components" =>[
    "request" => [
        "parsers" => [
            "text/xml" => "bobchengbinYii2XmlRequestParserXmlRequestParser",
            "application/xml" => "bobchengbinYii2XmlRequestParserXmlRequestParser",

            "application/json" => "yiiwebJsonParser",
            "text/json" => "yiiwebJsonParser",
        ],
    ],
],

經(jīng)過(guò)上面的三步之后,就可以直接訪問(wèn)提交過(guò)來(lái)的 xml 數(shù)據(jù)了。

# raw data


# access data
Yii::$app->request->post("username");

這樣不管別人傳過(guò)來(lái)的數(shù)據(jù)是 html、json、xml 格式都可以非常方便的獲取了,在和各種接口打交道的時(shí)候用上這個(gè)可以方便太多了。

使用 TimestampBehavior 來(lái)自動(dòng)填充 created_at 和 updated_at

Yii2 官方默認(rèn)提供了一個(gè) TimestampBehavior 來(lái)方便我們來(lái)自動(dòng)填充 created_atupdated_at ,它會(huì)自動(dòng)在你插入新數(shù)據(jù)的時(shí)候幫你填充這兩個(gè)值為當(dāng)前時(shí)間,當(dāng)然你也可以設(shè)置成別的時(shí)間,當(dāng)你更新數(shù)據(jù)的時(shí)候它會(huì)自動(dòng)把 updated_at 改成最后更新的時(shí)間。

我創(chuàng)建了一個(gè) user_weixin 表,然后設(shè)置 created_atupdated_at 兩個(gè)字段為 datetime 類(lèi)型,并在相應(yīng)的 Model 里面使用上 TimestampBehavior

# file app/models/UserWeixin.php



然后正常的調(diào)用保存數(shù)據(jù),發(fā)現(xiàn)那兩個(gè)字段的值均為 "0000-00-00 00:00:00",看到這個(gè)感覺(jué)甚是奇怪,去看了一下默認(rèn)生成的用戶模型,common/models/User.php,發(fā)現(xiàn)它也沒(méi)有做其它的別的操作就可以的啊,我這樣為什么不行呢,去看了一下表結(jié)構(gòu),發(fā)現(xiàn)系統(tǒng)創(chuàng)建的 user 表的兩個(gè)字段是使用的 int 類(lèi)型,而不是 datetime,于是把 user_weixin 表的兩個(gè)字段也改成了 int 類(lèi)型,再測(cè)試一次發(fā)現(xiàn)好了。

不甘心的我去看了一下 TimestampBehavior 類(lèi)的注釋,發(fā)現(xiàn)確實(shí)沒(méi)有說(shuō)明這個(gè)問(wèn)題,所以大家在聲明 created_at 和 updated_at 字段類(lèi)型的時(shí)候需要注意一下。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/20881.html

相關(guān)文章

  • YII2通過(guò)composer優(yōu)化vendor

    摘要:本文討論通過(guò)工具安裝框架并優(yōu)化過(guò)程中遇到的問(wèn)題,約定讀者對(duì)基本原理有一定了解,并且有安裝框架的實(shí)際經(jīng)驗(yàn)。這個(gè)命令是優(yōu)化包的關(guān)鍵一環(huán)。命令要謹(jǐn)慎使用。 本文討論通過(guò)composer工具安裝Yii2框架并優(yōu)化Vendor過(guò)程中遇到的問(wèn)題,約定讀者對(duì)composer基本原理有一定了解,并且有安裝Yii2框架的實(shí)際經(jīng)驗(yàn)。 在Yii2社區(qū)里經(jīng)常會(huì)遇到一類(lèi)問(wèn)題,那就是 安裝完官方推薦的版本后1 ...

    dcr309duan 評(píng)論0 收藏0
  • codeception (6) Yii2中安裝codeception時(shí)遇到問(wèn)題及解決方法

    摘要:版本這個(gè)原因是因?yàn)榻昧撕瘮?shù),所以我們需要更改找到的配置文件輸入命令會(huì)出現(xiàn)兩個(gè)相關(guān)的地址配置文件在中找到,打開(kāi)之后搜索將去掉,保存處理這個(gè)問(wèn)題有兩種方式,第一種是修改在中加上,應(yīng)該是禁用的意思還有一種方式就是將升級(jí)到以上,這個(gè)錯(cuò)誤就不會(huì)出現(xiàn) codeception版本 v2.1.8 shell_exec PHP Warning: shell_exec() has been disabl...

    Lionad-Morotar 評(píng)論0 收藏0
  • Yii2select2使用

    摘要:新手,不擅長(zhǎng)寫(xiě),純粹只是分享一下自己遇到的問(wèn)題供大家參考一下這個(gè)插件,就是帶搜索功能的下拉選擇框效果如圖使用前先確定自己的項(xiàng)目安裝了,如果沒(méi)有的話就用安裝一下使用的時(shí)候先在頭部引用插件如果表單是,可以使用下面代碼是鍵值對(duì)數(shù)組,下面所聲明的 新手,不擅長(zhǎng)寫(xiě)js,純粹只是分享一下自己遇到的問(wèn)題供大家參考一下 select2這個(gè)插件,就是帶搜索功能的下拉選擇框效果如圖:showImg(ht...

    Cristic 評(píng)論0 收藏0
  • Yii2select2使用

    摘要:新手,不擅長(zhǎng)寫(xiě),純粹只是分享一下自己遇到的問(wèn)題供大家參考一下這個(gè)插件,就是帶搜索功能的下拉選擇框效果如圖使用前先確定自己的項(xiàng)目安裝了,如果沒(méi)有的話就用安裝一下使用的時(shí)候先在頭部引用插件如果表單是,可以使用下面代碼是鍵值對(duì)數(shù)組,下面所聲明的 新手,不擅長(zhǎng)寫(xiě)js,純粹只是分享一下自己遇到的問(wèn)題供大家參考一下 select2這個(gè)插件,就是帶搜索功能的下拉選擇框效果如圖:showImg(ht...

    pingink 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<