すべてのアプリケーション定数変数を含むクラスを作成するのに最適な場所はどこですか?
それは: -ブートストラップ
-アプリケーション共通ライブラリ内
例:1-このレコードに画像がない場合にデータベースから画像名を取得するとき、モデルで使用できるようにデフォルト値をどこかに配置したい
**すべてのアプリケーションで使用する定数なので、変更した場合、コード内のすべてに戻ってどこでも変更したくありません
すべてのアプリケーション定数変数を含むクラスを作成するのに最適な場所はどこですか?
それは: -ブートストラップ
-アプリケーション共通ライブラリ内
例:1-このレコードに画像がない場合にデータベースから画像名を取得するとき、モデルで使用できるようにデフォルト値をどこかに配置したい
**すべてのアプリケーションで使用する定数なので、変更した場合、コード内のすべてに戻ってどこでも変更したくありません
application.ini は、たとえばそこで定数を定義するのに最適な場所です
constants.PUBLIC_PATH = APPLICATION_PATH "/../public/"
constants.THEME = blue
次に、ブートストラップで
protected function setConstants($constants)
{
foreach($constants as $name => $value)
{
if(!defined($name))
define($name, $value);
}
}
ZF は config から「constants」を取得し、ブートストラップで setConstants メソッドを呼び出して、定数で始まるすべての行を渡します。
私は定数を使用しないようにし、グローバル定数よりもクラス定数を好みます。ただし、何らかの理由で定数が避けられない場合は、.ini 構成ファイルと Bootstrap/library/model クラスの定数を使用します。
(デフォルトの zf プロジェクト構造を想定)
アプリケーション/設定/application.ini
constants.MESSAGE_1 = "Message 1"
constants.MESSAGE_2 = "Message 2"
Bootstap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initConstants()
{
$options = $this->getOption('constants');
if (is_array($options)) {
foreach($options as $key => $value) {
if(!defined($key)) {
define($key, $value);
}
}
}
}
// ...
}
コントローラーでの使用例:
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->message1 = MESSAGE_1;
$this->view->message2 = MESSAGE_2;
}
}
上記を拡張して、定数の定義方法を構成できるようにします。たとえば、すべての定数を大文字にするかどうか、および既に定義されている定数を許可または禁止することができます。
アプリケーション/設定/application.ini
constants.forceUppercase = 1
constants.allowAlreadyDefined = 1
constants.set.message_1 = "Message 1"
constants.set.message_2 = "Message 2"
ブートストラップ:
protected function _initConstants()
{
$options = $this->getOption('constants');
if (isset($options['set']) && is_array($options['set'])) {
if (isset($options['forceUppercase'])
&& (bool) $options['forceUppercase']) {
$options['set'] = array_change_key_case($options['set'], CASE_UPPER);
}
$allowAlreadyDefined = false;
if (isset($options['allowAlreadyDefined'])
&& (bool) $options['allowAlreadyDefined']) {
$allowAlreadyDefined = true;
}
foreach($options['set'] as $key => $value) {
if (!defined($key)) {
define($key, $value);
} elseif (!$allowAlreadyDefined) {
throw new InvalidArgumentException(sprintf(
"'%s' already defined!", $key));
}
}
}
}
独自のライブラリ、またはモデル クラスなどである可能性がありますが、場合によって異なります。
ブートストラップで:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
const MESSAGE_CONSTANT = "Hello World";
// ...
}
コントローラーでの使用例:
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->message = Bootstrap::MESSAGE_CONSTANT;
}
}