プロジェクト

全般

プロフィール

Bug(バグ) #3510

Youichi Kimura10年以上前に更新

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@ を判定に使用する。

戻る