extends CakeRequest,isメソッドの書き換え

9936 ワード

背景:Cakephp開発環境バージョンは2.3.8、サーバーのcakephpバージョンは2.3.5で、テストしたコードがサーバーにアップロードされた後、総爆発は以下の警告を発見した.
Warning (2) : strtolower() expects parameter 1 to be string, array given [CORE\Cake\Network\CakeRequest.php, line 478]
2.3.8と2.3.5の比較から、2.3.8は2.3.5のfunction isより以下のコードが多いことが分かった.
        if (is_array($type)) {
            $result = array_map(array($this, 'is'), $type);
            return count(array_filter($result)) > 0;
        }

libのファイルを直接修正することで問題が解決するのですが、後でアップグレードするなどの問題を考えてこのCakeRequestをカスタマイズしてis関数を書き換えることにしました.プロセスは次のとおりです.
app/config/bootstrap.phpには、次のコードが追加されます.
require APP . 'Lib' . DS . 'Network' . DS . 'CakeRequest.php';// , Error:  Class 'CakeRequest' not found 
require
APP . 'Lib' . DS . 'Network' . DS . 'AppCakeRequest.php';

app/Lib/ディレクトリの下にNetworkディレクトリを新規作成し、ライブラリのCakeRequest.phpをこのディレクトリにコピーし、
そしてこのディレクトリにAppCakeRequestを追加します.php:
<?php
/**
 * A class that helps wrap Request information and particulars about a single request.
 * Provides methods commonly used to introspect on the request headers and request body.
 *
 * Has both an Array and Object interface. You can access framework parameters using indexes:
 *
 * `$request['controller']` or `$request->controller`.
 *
 * @package       Cake.Network
 */
class AppCakeRequest extends CakeRequest {

/**
 * Check whether or not a Request is a certain type. Uses the built in detection rules
 * as well as additional rules defined with CakeRequest::addDetector(). Any detector can be called
 * as `is($type)` or `is$Type()`.
 *
 * @param string $type The type of request you want to check.
 * @return boolean Whether or not the request is the type you are checking.
 */
    public function is($type) {
        //add str
        if (is_array($type)) {
            $result = array_map(array($this, 'is'), $type);
            return count(array_filter($result)) > 0;
        }
        //add end
        $type = strtolower($type);
        if (!isset($this->_detectors[$type])) {
            return false;
        }
        $detect = $this->_detectors[$type];
        if (isset($detect['env'])) {
            if (isset($detect['value'])) {
                return env($detect['env']) == $detect['value'];
            }
            if (isset($detect['pattern'])) {
                return (bool)preg_match($detect['pattern'], env($detect['env']));
            }
            if (isset($detect['options'])) {
                $pattern = '/' . implode('|', $detect['options']) . '/i';
                return (bool)preg_match($pattern, env($detect['env']));
            }
        }
        if (isset($detect['param'])) {
            $key = $detect['param'];
            $value = $detect['value'];
            return isset($this->params[$key]) ? $this->params[$key] == $value : false;
        }
        if (isset($detect['callback']) && is_callable($detect['callback'])) {
            return call_user_func($detect['callback'], $this);
        }
        return false;
    }
    
}

app/webroot/indexを編集します.php:
/*
$Dispatcher->dispatch(
    new CakeRequest(),
    new CakeResponse()
);
*/
$Dispatcher->dispatch(
    new AppCakeRequest(),
    new CakeResponse(array('charset' => Configure::read('App.encoding')))
);

大功は成し遂げて、間違いはもう爆発しなくて、私はcakephpの初心者で、レンガを撮ることを歓迎します.
参照:http://stackoverflow.com/questions/8554536/extending-the-cakerequest-object
 
最后にツッコミを入れて、今日やっとこのプロジェクトを终えて、半年前に友达の招待に応じて、このCakephpのウェブサイトのプロジェクトを引き継いで、
工期はとても楽ですが、十分に半年の时間をくれました.そして、友达の需要も断続的にくれました.
以前phpに接触したことがなくて、更にcakephpは言うまでもなくて、その上国内のcakephpの資料は比較的に少なくて、多くの問題はすべて英語あるいは日本語のヤフーの上で答えを探さなければなりません.
时には本当にshiの心があると思います.
これは本当に自分の破片の時間を浪費しすぎて、二度とこのような私活を受けません.
暇があれば、自分の興味のある知識を勉強したほうがいいのではないでしょうか.