我正在 Zend Framework 中制作一个 Web 应用程序。我已经到了清理的阶段。由于事情经常发生,我有一些杂乱无章的视图脚本已经变得完全不可读(大量的(v)sprintf
's 和循环)。
有一种观点绝对是一场噩梦......(没有/不准确的评论,速记......所有事情都被认为是致命的罪过)。只是一个例子:
$rows[$c] .= '<div>'.sprintf('<select id="%s" name="%1$s">',$t.'['.$ref->getCode().']').str_replace('>'.$ref->getCValue().'<',' selected="selected">'.$ref->getCValue().'<','<option>'.implode('</option><option>',$this->vals['P']).'</option>').'</select></div>';
在这种特殊情况下,我有一组看起来像这样的模型:
$arr = array('FOO'=> $Mylib_Model_Person,'BAR'=> $Mylib_Model_Person2);//1~50 mdls
我想使用部分循环,但是有一个问题:
$this->partialLoop('controller/_myPartial.phtml',array('model'=>$arr));
//in the partial loop:
Zend_Debug::dump($this->m);
我正确地看到了我所有的模型,但是它们的键都已经变成了属性。
$this->FOO->someMethod();//works fine
Bur 我希望它是:
<span><?php echo $key; ?></span><span><?php echo $model->someMethod(); ?></span>
我也尝试过使用$this->partialLoop()->setObjectKey('Mylib_Model_Person');
,但这似乎没有任何区别,然后让我感到困惑。
我看到的唯一解决方案是array_map
,但这会破坏这一点(我试图以一个干净的视图脚本结束);或重写我的服务层的一部分,以返回准备好的结构化数据,并保留在array_map
那里。
我不禁想到我想做的事情,基本上使用 partialLoop 作为array_map
回调,是可能的。如果不是,是否有替代方案?有什么想法吗?
我已经尝试过get_object_properties($this)
,并遍历对象属性,但无济于事,循环根本没有被执行(?!)
事实证明$this->partialLoop()->setObjectKey('Mylib_Model_Person');
应该是$this->partialLoop()->setObjectKey('model');
。如果我确实改变了这一点,并通过 dump 开始部分循环$this->model
,我会看到我的模型。然而:
echo $this->model->someMethod(); //throws error: method on non-object
Zend_Debug::dump(get_class_methods($this->model));//shows all methods, including someMethod()
并且雪上加霜,眼泪和混乱。该模型实现了 toArray-thing,所以我尝试了:
echo $this->model['someData'];//Error: cannot use object of type Mylib_Model_Person as array!!
因此,当我尝试使用方法时它不是一个对象,当我尝试以数组的形式访问数据时它是一个对象,而当使用魔术 getter 方法 ( $this->model->some_Data
) 时它什么也不做。没有错误,但也没有输出。视图按原样呈现。
我想我遇到了一个错误。我会报告的。考虑一下:
$methods = get_class_methods($this->model);
while($m = array_shift($methods))
{
if (substr($m,0,3) === 'get')
{
Zend_Debug::dump($m);//e.g getName
Zend_Debug::dump($this->model->{$m}());//'Foobar'
$m = 'someMethod';//copy-paste, so typo's aren't to blame
Zend_Debug::dump($this->model->{$m}());//'the data I was after'
}
}
所以这行得通,但是,如果我尝试:
$this->model->{'someMethod'}();//Error again
//or even:
$m = 'someMethod';
echo $this->model->{$m}();//Error...
这不可能