Project

General

Profile

Bug(バグ) #3510

Updated by Youichi Kimura about 11 years ago

h3. Overview (現象) 

 sns_config.yml には下記のようにデフォルト値を設定する項目があり、例えば @opConfig::get('sns_name')@ とした場合に sns_config テーブルに該当する値が存在しない場合は @'MySNS'@ が返るようになっている。また、sns_config.yml でデフォルト値が定義されていない項目については opConfig::get() の第二引数 $default の値が返る。 

 <pre><code class="yaml"> 
 general: 
   sns_name: 
     Name:       "sns_name" 
     Caption:    "SNS名" 
     FormType: "input" 
     ValueType: "text" 
     Default:     "MySNS" 
     IsRequired: true 
 </code></pre> 

 しかし opConfig::get() の第二引数 $default に null 以外の値を指定すると、sns_config テーブルに存在しない設定項目について sns_config.yml に記述されている Default の値は無視され $default の値が返ってしまう。 

 h3. Causes (原因) 

 <pre><code class="php"> 
   public static function get($name, $default = null) 
   { 
     $setting = self::getConfigurationSetting(); 
     $result = null; 

     $result = Doctrine::getTable('SnsConfig')->get($name, $default); 
     if (isset($setting[$name])) 
     {    
       if (is_null($result)) 
       {    
         $result = self::getDefaultValue($name); 
       }    
     }    

     return $result; 
   } 
 </code></pre> 

 SnsConfigTable::get() の第二引数に $default を指定しているため、sns_config テーブル内に該当するレコードが存在しない場合に sns_config.yml の Default の値が使われるか否かは @is_null($result)@ によって判定されており、$defaultfalse となり、$result が sns_config から取得された値なのか区別ができなくなってしまうことが原因。 null であることを前提に記述されていることが原因。 

 h3. Way to fix (修正内容) 

 SnsConfigTable::get() の第二引数には null を指定し、最後の @return $result;@ の箇所で $default を使用するか否かの判定を行う。 @is_null($result)@ の代わりに @$default === $result@ を判定に使用する。 

Back