0

私はlemonade-phpを使用しています。私のコードはhttps://github.com/sofadesign/limonadeにあります。

私が抱えている問題は、私が走ろうとするときです

class syscore {

    public function hello(){
        set('post_url',  params(0));
        include("./templates/{$this->temp}/fullwidth.tpl"); 
        return render('fullwidth');

    }

}

次に、fullwidth.tplをロードし、関数fullwidthを実行します。

fullwidth.tpl

<?php

global $post;
function fullwidth($vars){ 
    extract($vars);
    $post = h($post_url);

}

    print_r($this->post($post));    

?>

合格したようですが、$post_url二度と合格できませんprint_r($this->post($post));

ただし、全幅関数内で実行しようとすると、関数print_r($this->post($post))が見つからないと表示されますpost()

私は以下のような多くのことを試しました

function fullwidth($vars){ 
        extract($vars);
        $post = h($post_url);
    print_r(post($post));
}

でsyscoreに再接続してみました

$redi = new syscore();
$redi->connection() <-- this works
$redi->post($post) <-- this does not

これが私のフルクラスのsyscoreです

class syscore {

    // connect
    public function connect($siteDBUserName,$siteDBPass,$siteDBURL,$siteDBPort, $siteDB,$siteTemp){
        for ($i=0; $i<1000; $i++) {
         $m = new Mongo("mongodb://{$siteDBUserName}:{$siteDBPass}@{$siteDBURL}:{$siteDBPort}", array("persist" => "x", "db"=>$siteDB));
        }

        // select a database
       $this->db = $m->$siteDB;
       $this->temp = $siteTemp;
    }

    public function hello(){
        set('post_url',  params(0));
        include("./templates/{$this->temp}/fullwidth.tpl"); 
        return render('fullwidth');

    }

    public function menu($data)
    {

        $this->data = $data;
        $collection = $this->db->redi_link;
        // find everything in the collection
        //print $PASSWORD;
        $cursor = $collection->find(array("link_active"=> "1"));

        if ($cursor->count() > 0)
        {
            $fetchmenu = array();
            // iterate through the results
            while( $cursor->hasNext() ) {   
                $fetchmenu[] = ($cursor->getNext());
            }
            return $fetchmenu;
        }
        else
        {
            var_dump($this->db->lastError());
        }
    }

    public function post($data)
    {

        $this->data = $data;
        $collection = $this->db->redi_posts;
        // find everything in the collection
        //print $PASSWORD;
        $cursor = $collection->find(array("post_link"=> $data));

        if ($cursor->count() > 0)
        {
            $posts = array();
            // iterate through the results
            while( $cursor->hasNext() ) {   
                $posts[] = ($cursor->getNext());
            }
            return $posts;
        }
        else
        {
            var_dump($this->db->lastError());
        }
    }

}
4

1 に答える 1

0

テンプレートをレンダリングしようとしたときにPHPがたどる実行パスを理解するのに問題があるようです。もっと詳しく見てみましょう。

// We're going to call "syscore::hello" which will include a template and try to render it
public function hello(){
    set('post_url',  params(0));  // set locals for template
    include("./templates/{$this->temp}/fullwidth.tpl");  // include the template
    return render('fullwidth'); // Call fullwidth(array('post_url' => 'http://example.com/path'))
}

これを解決する秘訣は、PHPインクルードがどのように機能するかを理解することです。呼び出すinclude("./templates/{$this->temp}/fullwidth.tpl")と、コードの一部がsyscoreオブジェクトのスコープで実行されます。

global $post;

print_r($this->post($post));

fullwidthこの時点でグローバルスコープで作成されますが、まだ呼び出されていません。render呼び出しが発生するfullwidthと、スコープ内にいなくなります。そのため、エラーをトリガーせずに内部にsyscore入れることはできません。$this->post($post)

では、どうすれば解決できますか?よろしくお願いします。

  1. syscore::postおそらく静的メソッドにリファクタリングすることもできますが、その場合syscore::dbは静的である必要があり、常に同じmongodbインスタンス(シングルトンパターン)を返します。Mongoインスタンスごとに1000個のインスタンスを作成する必要はありませんsyscore

  2. フレームワークを悪用する可能性があります。はるかに貧弱な解決策ですが、それは仕事を成し遂げます。

fullwidth.tpl

<?php

function fullwidth($vars){ 
    $post_url = ''; // put the variables you expect into the symbol table
    extract($vars, EXTR_IF_EXISTS); // set EXTR_IF_EXISTS so you control what is added.
    $syscore_inst = new syscore; 
    $post = h($post_url);
    print_r($syscore->post($post)); // I think a puppy just died.    
}

2番目の方法は完全なハックであり、そのようなコードを書くことはおそらく昇進しないことを意味します。しかし、それは機能するはずです。

しかし、あなたが昇進したいとしましょう、あなたは良い、光沢のあるコードを作るでしょう。

// Note: Capitalized class name
class Syscore {
protected static $_db;

public static function db () {
    if (! static::$_db) {
        static::$_db = new Mongo(...);
    }
    return static::$_db;
}

// @FIXME rename to something more useful like "find_posts_with_link"
public static post($url) {
    $collection = static::db()->redi_posts;
    // find everything in the collection
    $cursor = $collection->find(array("post_link"=> $url));

    // Changed to a try-catch, since we shouldn't presume an empty find is
    // an error.
    try {
        $posts = array();
        // iterate through the results
        while( $cursor->hasNext() ) {   
            $posts[] = ($cursor->getNext());
        }
        return $posts;
    } catch (Exception $e) {
        var_dump($this->db->lastError());
    }
}

}

次に、全幅関数で、インスタンスメソッドを静的メソッドのように扱うという愚かなナンセンスを実行する必要はありません。

function fullwidth($vars){ 
    $post_url = ''; // put the variables you expect into the symbol table
    extract($vars, EXTR_IF_EXISTS); // set EXTR_IF_EXISTS so you control what is added.
    $post = h($post_url);
    print_r(Syscore::post($post)); // static method. \O/ Rainbows and unicorns.   
}
于 2012-09-06T06:56:03.130 に答える