LLフレームワークBOOKS「Ethna×PHP」をやっています。

P163のデータベース作成のところで質問です。

データベースを最初から自動で呼び出しておくための以下の記述を
/ethnatask/app/Ethnatask_ActinClass.phpに記述する、
と書いてありますが、どの辺りに記述すればいいのでしょうか?
初歩的な質問ですいませんが、ご回答よろしくお願いします。

ーーーーーーーーーーーーーー
var $db;

function EthnaTask_ActionClass(&$backend)
{
$result = parent::Ethna_ActionClass($backend);
$this->db = $this->backend->getDB();
return $result;
}
ーーーーーーーーーーーーーーー

以下は変更前のethnatask_ActinClass.phpです。

class Ethnatask_ActionClass extends Ethna_ActionClass
{
function authenticate()
{
return parent::authenticate();
}

function prepare()
{
return parent::prepare();
}
}
class Ethnatask_ActionClass extends Ethna_ActionClass
{
function authenticate()
{
return parent::authenticate();
}

function prepare()
{
return parent::prepare();
}
}
?>

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/05/12 01:25:30
  • 終了:2012/05/19 01:30:03

回答(2件)

id:DQNEO No.1

DQNEO回答回数7ベストアンサー獲得回数12012/05/12 16:28:13

やるとすれば初期化処理に相当するので__construct内に実装するのが妥当でしょう。

ですが、私はこれはバッドノウハウだと考えています。
アクションクラスがDBインスタンスを保持するというのがMVCでない気がします。
さらに、このようなことをすると全アクションクラスで(SQLを投げないアクションでも)必ずDB接続してしまいます。


例えば、秒間数百~数千リクエストを処理するAPIを、このアクションクラスの子クラスとして実装すると、DBに多数のコネクションがはられて異常負荷になったりします。
(実サービスで経験済み)

id:DQNEO No.2

DQNEO回答回数7ベストアンサー獲得回数12012/05/13 02:19:47

「ただ動けばいい」というなら、例えばauthenticate()の中に書けばよいでしょう。

※__construct内に実装する方法がわからないということは、Ethnaがわからない以前にそもそもPHPの知識が足りていないと推測されます。
パーフェクトPHPなどを読まれることをお勧めします。

  • id:taityou3
    ご回答ありがとうございます。
    バッドノウハウなのですね。了解です。

    >やるとすれば初期化処理に相当するので__construct内に実装するのが妥当でしょう。
    というのはEthnatask_ActinClass.phpでいうと、何行目に記述すれば良いのでしょうか?

    とりあえず動きを確認して行きたいので、教えて頂けるれば嬉しいのですが。
  • id:taityou3
    DQNEO様

    前に質問させて頂いた、
    データベースを簡単に呼び出す方法ですが、
    「ただ動けばいい」ならauthenticate()の中にという事で以下の様に書いてみたのですが、
    これで良いのでしょうか?
    ーーーーーーーーーーーーーーーーーーーーーーーーー
    function authenticate()
    {
    var $db;
    function EthnaTask_ActionClass(&$backend)
    {
    $result = parent::Ethna_ActionClass($backend);
    $this->db = $this->backend->getDB();
    return $result;
    }

    return parent::authenticate();
    }
    ーーーーーーーーーーーーーーーーーーーーーーーーー
    ただ、その前にデータベース作成について、本ではSQLiteを利用しており、ここでも躓いています。
    まず、/home/ethna/projects/ethnatask
    にdbs/taskディレクトリを作成しdbsディレクトリとtaskディレクトリに書き込み権限を追加。
    そして以下のスクリプトを入力し、make_db.phpと名前を付け、dbsディレクトリに配置。
    ーーーーーーーーーーーーーーーーーーーーーーーー
    <?php
    $queries[] = <<<EOD
    CREATE TABLE task (
    id INTEGER PRIMARY KEY,
    user VARCHAR,
    name VARCHAR,
    rate INTEGER DEFAULT 0,
    comment VARCHAR,
    created_at INTEGER,
    updated_at INTEGER,
    deleted_at INTEGER DEFAULT 0,
    task_order INTEGER NOT NULL
    );
    EOD;

    $db = sqlite_open('./task/ethnatask.db', 0666);
    foreach ($queries as $query) {
    print("Execute query at\n{$query}\n");
    sqlite_query($db, $query);
    }
    ?>
    ーーーーーーーーーーーーーーーーーーーーーーー
    この後にWebブラウザからmake_db.phpを呼び出すと、taskディレクトリ内に「ethnatask.db」というデータベースが作成される。と書いてあるのですが、「Webブラウザから呼び出す」というのが意味わかりません。
    いろいろググってはみたのですが、未だ未解決なのです。何かわかりますか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません