Мне нужно вызвать функцию, расположенную в классе, хранящемся в каталоге 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 в каждом модуле, и он будет работать нормально. Однако - у меня много модулей, и поскольку у меня есть набор действий, которые одинаковы для всех этих модулей, поэтому поместить их в одну процедуру и просто вызвать эту функцию было бы самым разумным способом... Особенно, когда речь идет о поддержке приложение - Это всего лишь одно место для изменения кода, а не дюжина...
Ответ 1 · рейтинг 1 · j0k
В вашем классе внутри вашей папки 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'];
}
Ответ 2 · Fabian Schmengler
Вы не можете изменить значение $this в методе. Никогда.
Вместо этого посмотрите на класс, как вы можете получить доступ к $articles извне, там должно быть что-то вроде getArticles(). Похоже, что класс является моделью Propel, они сгенерировали такие геттеры.
В зависимости от вашей конечной цели могут быть лучшие решения, чем создание экземпляра этой модели, вызов таинственного метода и последующее получение атрибута. В конце концов, классы - это не просто наборы функций, и с ними нельзя так обращаться. Не повторять код - это хорошо, но это нужно делать со смыслом.