0

一个使用 Doctrine 的 Zend-Framework 项目。数据以对象的形式出现。在我的 Zend View 中,我像访问它一样

$this->personData->getPersonAdress()->getPersonStreet();

由于 Person 可能没有关联的地址,因此我们必须检查 personadress 是否存在以及在回显之前是否填充了 personStreet,否则可能会出现回显 NULL 错误。

所以我们使用一些带有 isset 的 IF:

<? if($this->personData->getPersonaddress()) echo $this->personData->getPersonaddress()->getPersonstreet(); else echo "''"?>

示例(最坏情况):

<?
   if(isset($this->address[0]) && is_object($this->address[0]))
   {
      $help2=$this->address[0]->getAddress();
      if (isset($help2) && is_object($help2))
      {
         $help=$this->address[0]->getAddress()->getCountry();
         if (isset($help) && is_object($help) && $help->getCountryId())
         {
            echo $this->address[0]->getAddress()->getCountry()->getCountryId();
         }
      }
   }
?>

我们需要一个解决方案,或者最终需要一个 Zend_view 助手来简化回显这些值的过程。

任何想法将不胜感激..

4

3 回答 3

0

您可以使用 HYDRATE_ARRAY 告诉 Doctrine 返回一个数组,而不是映射的对象。

这样,可以直接调用isset()。

于 2012-09-24T09:28:07.457 回答
0

我自己解决了这个问题,实现了一个 Zend View Helper,它打印出每个值,忽略非对象属性或 NULL 关联可能发生的错误。这对使用 Zend Framework + Doctrine 2 的每个人都应该有用。

用法

代替

$this->address[0]->getAddress()->getCountry()->getCountryId()

使用(如果未设置,则提供值或默认值(0,第三个参数))

$this->Printsafe($this->address[0], "getAddress/getCountry/getCountryId", 0)

代码如下

class Printsafe extends Zend_View_Helper_Abstract {

    public function isObjectOrSet($data, $properties)
    {
        if ($data != null)
        {
            if(is_object($data))
            {
                if (isset($properties[0]))
                {
                    $actual_property = array_shift($properties);
                    return $this->isObjectOrSet($data->{$actual_property}(), $properties);
                }
            }
            elseif(isset($data))
            {
                return $data;
            }
            else
                return null;
        }
        else
            return null;
    }

    /**
    * Wants data and getters + properties
    * Tests if they are set and returns requested value
    * Returns empty value (instead of NULL) if any error occurs
    * 
    * @param  mixed $data - Example $this->personData
    * @param  string $properties - Example "getPersontype/getNotation"
    * @param  mixed $default - return value if not set. Default is empty string. 
    * 
    * @return mixed $value
    */
    public function printsafe($data = null, $properties='', $default = '') {

        $return = null;

        if ($data != null)
        {
            if ($properties != '')
            {
                $prop_array = explode("/", $properties);
                $return = $this->isObjectOrSet($data, $prop_array);
            }
        }

        if ($return == null)
            $return = $default;

        return $return;
    }
}
于 2012-09-25T15:11:43.877 回答
-2

您可以在链前面加上 @,这会抑制错误输出 - 然后您根本不需要检查它。如果它不存在,它就不会输出任何东西。

<?php echo @$this->personData->getPersonAdress()->getPersonStreet(); ?>

通常不建议使用 @ 运算符,但在这种情况下,它似乎是一个合适的解决方案。(缺点是您会错过可能来自此行的其他错误)

于 2012-09-24T12:40:50.030 回答