вызов функции из действия в symfony 1.4

Мне нужно вызвать функцию, расположенную в классе, хранящемся в каталоге app/lib, перед каждым действием (т.е. в действии preExecute)

В этой функции мне нужен указатель $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 в действие preExecute в каждом модуле, и он будет работать нормально. Однако - у меня много модулей, и поскольку у меня есть набор действий, которые одинаковы для всех этих модулей, поэтому поместить их в одну процедуру и просто вызвать эту функцию было бы самым разумным способом... Особенно, когда речь идет о поддержке приложение - Это всего лишь одно место для изменения кода, а не дюжина...


person khartvin    schedule 22.02.2013    source источник
comment
В этой функции мне нужен указатель $this из действия. - Не могли бы вы уточнить, что вы имеете в виду здесь? Может быть, показать эту функцию, расположенную в классе? Если бы мне пришлось угадывать, я бы сказал, что вы ищете $obj = new Classname(); $obj->functionname();   -  person Fabian Schmengler    schedule 22.02.2013
comment
Как говорит @fab, нам нужно больше информации: что эта функция делает в app/lib? Зачем вам $this внутри этого действия?   -  person j0k    schedule 22.02.2013
comment
спасибо за ваш отзыв, я поместил пример использования указателя $this. Я пробовал подход, предложенный @fab, до того, как разместил здесь свой вопрос - не удалось присвоить $articles $this->articles. Вот почему я сделал акцент на том, что мне нужно иметь доступ к этому указателю в моей процедуре.   -  person khartvin    schedule 22.02.2013


Ответы (2)


В вашем классе внутри вашей папки 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'];
}
person j0k    schedule 22.02.2013
comment
Я знал, что ответ будет простым, но не то чтобы он был настолько простым... Большое спасибо! - person khartvin; 22.02.2013

Вы не можете изменить значение $this в методе. Никогда.

Вместо этого посмотрите на класс, как вы можете получить доступ к $articles извне, там должно быть что-то вроде getArticles(). Похоже, что класс является моделью Propel, они сгенерировали такие геттеры.

В зависимости от вашей конечной цели могут быть лучшие решения, чем создание экземпляра этой модели, вызов таинственного метода и последующее получение атрибута. В конце концов, классы — это не просто наборы функций, и с ними нельзя так обращаться. Не повторять код — это хорошо, но это нужно делать со смыслом.

person Fabian Schmengler    schedule 22.02.2013