1

我正在 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...

这不可能

4

1 回答 1

0

我发现了问题所在。我们的开发服务器过去在错误报告方面设置得更好
: 我认为E_ALL | E_STRICT是 ,但我看了看才发现它变成了一个粗糙的E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR. 鉴于数组中的某些值可能false不是一个对象,因此在 partialLoop 脚本中的某个时间点,应该发出一个通知——当然,使用正确的 ini 设置。

这就是意外行为的原因;那,还有一两个愚蠢的错误。

于 2012-07-04T08:01:07.867 回答