0

Doctrineを使用するZend-Frameworkプロジェクト。データはオブジェクトの形式で提供されます。私のZendViewでは、次のようにアクセスします

$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

オブジェクト以外のプロパティやNULLの関連付けによって発生する可能性のあるエラーを無視して、すべての値を出力するZend View Helperを実装することで、この問題を自分で解決しました。これは、Zend Framework +Doctrine2を使用するすべての人に役立つはずです。

使用法

それ以外の

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

使用(設定されていない場合は、値またはデフォルト(0、3番目のパラメーター)を提供します)

$ 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 に答える
0

HYDRATE_ARRAYを使用して、マップされたオブジェクトの代わりに配列を返すようにDoctrineに指示できます。

そうすれば、isset()を直接呼び出すことができます。

于 2012-09-24T09:28:07.457 に答える
-2

チェーンの前に@を付けると、エラー出力が抑制されます。そうすれば、チェーンをチェックする必要はまったくありません。存在しない場合は、何も出力されません。

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

通常、@演算子を使用することはお勧めしませんが、この場合は適切な解決策のようです。(欠点は、この行から発生する可能性のある他のエラーを見逃してしまうことです)

于 2012-09-24T12:40:50.030 に答える