0

すべてのアクションの前に (つまり、preExecute アクションで) app/lib ディレクトリに格納されているクラスにある関数を呼び出す必要があります。

$thisその関数では、アクションからのポインターが必要です。

静的な方法で実行できますが、Classname::functionname()回避したい PHP 警告が表示されます。

今のところ、私はそれを処理します

ini_set('display_errors', '0');     # don't show any errors...
error_reporting(E_ALL | E_STRICT);  # ...but do log them

しかし、それは醜い方法です..

どうすれば動的な方法でそれを行うことができますか?

===============

編集:

$this要求に応じて - そのポインターで実際に何をしているかを示すコードを追加します

...
$c = new Criteria();
$c->add(ArticlePeer::PUBLISHED, true);
$articles = ArticlePeer::doSelect($c);
$this->articles = $articles;
...

はい、この Select in preExecute アクションをすべてのモジュールに配置でき、正常に動作することはわかっています。ただし、私には多くのモジュールがあり、それらすべてのモジュールですべて同じアクションのセットがあるため、それらを 1 つの手順に入れてその関数を呼び出すだけが最も賢明な方法です...特にメンテナンスに関してはアプリ - コードを変更する場所は 1 か所だけで済みます。

4

2 に答える 2

1

フォルダー内のクラスでapp/libは、次を返すだけです$articles

$c = new Criteria();
$c->add(ArticlePeer::PUBLISHED, true);
return ArticlePeer::doSelect($c);

次に、あなたの中にpreExecute()

public function preExecute()
{
  $this->articles = Classname::functionname();
}

複数の値を返す必要がある場合は、配列を使用してそれを行うことができます。

$c = new Criteria();
$c->add(ArticlePeer::PUBLISHED, true);
$articles =  ArticlePeer::doSelect($c);

$c = new Criteria();
$c->add(BookPeer::PUBLISHED, true);
$books =  BookPeer::doSelect($c);

return array(
  'articles' => $articles,
  'books'    => $books,
);

次に、この配列を使用して、アクション内に変数を設定します。

public function preExecute()
{
  $data = Classname::functionname();

  $this->articles = $data['articles'];
  $this->books    = $data['books'];
}
于 2013-02-22T12:41:01.923 に答える
0

メソッド内の の値を変更することはできません$this。一度もない。

代わりに、外部からアクセスできるクラスを見てください。$articlesのようなものがあるはずですgetArticles()。クラスは Propel モデルのように見えますが、そのようなゲッターが生成されています。

最終目標によっては、このモデルをインスタンス化し、不思議なメソッドを呼び出してから属性を取得するよりも良い解決策があるかもしれません。結局のところ、クラスは関数の単なるコレクションではなく、そのように扱われるべきではありません。コードを繰り返さないことは良いことですが、それにはある程度の注意が必要です。

于 2013-02-22T12:07:22.920 に答える