メニュー

ドキュメント

dao コマンド

説明

 S2Dao で必要な dao インタフェース、entity クラス、テストクラスを生成します。

実行例

 dao コマンドの説明では、S2DaoのExampleで使用されているサンプルデータを用いて説明します。

mysql> desc CD;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| ID      | int(11)      | NO   | PRI |         |       |
| TITLE   | varchar(100) | YES  |     |         |       |
| CONTENT | varchar(200) | YES  |     |         |       |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from CD;
+----+----------+---------+
| ID | TITLE    | CONTENT |
+----+----------+---------+
| 1  | S2Dao!!! | hello!! |
+----+----------+---------+
1 row in set (0.00 sec)

mysql>

s2base.php5 ディレクトリで s2base コマンドを実行します。

% s2base
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 1     <--- 1 : dao を選択

[ Module list ]
0 : (exit)
1 : Default
choice ? : 1     <--- 1 : Default モジュールを選択

use database ? (y/n) : n                       <--- データベースに接続してテーブル情報を取得
                                                    するかどうかを選択します。
dao interface name ? : CdDao                   <--- 英数字 [_a-zA-Z0-9] が使用可能です。

entity class name ? : CdEntity                 <--- 英数字 [_a-zA-Z0-9] が使用可能です。

table name ? [CdEntity] : CD                   <--- データベースのテーブル名を設定。

columns ? [id,name,--, , ] : id,title,content  <--- カンマ区切りでカラム名を入力

[ generate information ]
  module name         : Default
  dao interface name  : CdDao
  dao test class name : CdDaoTest
  entity class name   : CdEntity
  table name          : CD
  columns             : id, title, content

confirm ? (y/n) : y                                 <--- 表示される情報を確認
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/dao/CdDao.class.php
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default/dao/CdDaoTest.class.php
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/entity/CdEntity.class.php

[ Command list ]
0 : (exit)
1 : command
・・・

%
daoコマンドにより、PHPUnitを用いたUnitTestクラスが作成されます。s2base コマンドに test 引数を付けて実行すると、UnitTestが実行されます。
% s2base test .+Test     <--- 第3引数に正規表現で実行したいテストを指定できます。
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : test
[INFO ] test target       : .+Test

PHPUnit 3.1.7 by Sebastian Bergmann.

CdDaoTest::testA

.

Time: 0 seconds


OK (1 test)
%
dao コマンドにより生成されるDaoインタフェースは、デフォルトでいくつかのメソッドが定義済みです。
% more app/modules/Default/dao/CdDao.php
<?php
interface CdDao {
    const BEAN = "CdEntity";

    public function findAllList();
    //public function findAllArray();
    //public function update(CdEntity $entity);
    //public function insert(CdEntity $entity);
    //public function delete(CdEntity $entity);
}
%
例として、findAllListメソッドを実行してみます。まず、テストクラスにテストメソッドを追加します。
% more test/modules/Default/dao/CdDaoTest.php
<?php
class CdDaoTest extends PHPUnit_Framework_TestCase {
    private $module = "Default";
    private $container;                      <--- 各テストの前処理でS2Containerオブジェクトが設定されます。
    private $dao;                            <--- 各テストの前処理でDaoオブジェクトが設定されます。

    public function __construct($name) {
        parent::__construct($name);
        S2ContainerApplicationContext::init();
    }

    public function testFindAllList() {            <--- 追加テストメソッド
        $rows = $this->dao->findAllList();
        $entity = $rows[0];
        $this->assertTrue($entity instanceof CdEntity);
        $this->assertEquals($entity->getId(),'1');
        $this->assertEquals($entity->getTitle(),'S2Dao!!!');
        $this->assertEquals($entity->getContent(),'hello!!');
        print_r($entity);
    }

    public function setUp(){
        print __CLASS__ . '::' . $this->getName() . PHP_EOL;
        $moduleDir = S2BASE_PHP5_ROOT . "/app/modules/{$this->module}";
        require_once($moduleDir . "/{$this->module}.inc.php");
        $this->container = S2ContainerApplicationContext::create();
        $this->dao = $this->container->getComponent("CdDao");
    }

    public function tearDown() {
        print PHP_EOL;
        $this->container = null;
        $this->dao = null;
    }
}
%
テストを実行すると、データベースから取得したデータを格納したEntitiyオブジェクトが表示されます。
% s2base test .+Test

[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : test
[INFO ] test target       : .+Test

PHPUnit 3.1.7 by Sebastian Bergmann.

CdDaoTest::testFindAllList
CdEntity Object                          <--- print_r($entity) でデバッグとして表示しています。
(
    [id:protected] => 1
    [title:protected] => S2Dao!!!
    [content:protected] => hello!!
)

.

Time: 0 seconds


OK (1 test)
%

dicon コマンド

説明

 XML形式のdiconファイルを生成します。

実行例

 s2base.php5 ディレクトリで s2baseコマンド を実行します。

% s2base
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 2     <--- 2 : dicon を選択

[ Module list ]
0 : (exit)
1 : Default
choice ? : 1     <--- 1 : Default モジュールを選択

dicon name ? : sample    <--- 英数字 [_a-zA-Z0-9] が使用可能です。

[ generate information ]
  module name     : Default
  dicon file name : sample.dicon

confirm ? (y/n) : y      <--- 表示される情報を確認
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/dicon/sample.dicon

[ Command list ]
0 : (exit)
1 : command
・・・

%
sample.dicon は空のダイコンファイルです。
% more app/modules/Default/dicon/sample.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>

</components>
%

entity コマンド

説明

 S2Dao で用いる Entity クラスを作成します。columns でカンマ区切りのカラム名を入力すると、対応するプロパティとアクセッサメソッドを追加します。

実行例

 s2base.php5 ディレクトリで s2baseコマンド を実行します。

% s2base
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 3     <--- 3 : entity を選択

[ Module list ]
0 : (exit)
1 : Default
choice ? : 1     <--- 1 : Default モジュールを選択

use database ? (y/n) : n                       <--- データベースに接続してテーブル情報を取得
                                                    するかどうかを選択します。
entity class name ? : DvdEntity                <--- 英数字 [_a-zA-Z0-9] が使用可能です。

table name ? [DvdEntity] : DVD                 <--- データベースのテーブル名を設定

columns ? [id,name,--, , ] : id,title,content  <--- カンマ区切りでカラム名を入力

[ generate information ]
  module name       : Default
  entity class name : DvdEntity
  table name        : DVD
  columns           : id, title, content

confirm ? (y/n) : y                               <--- 表示される情報を確認
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/entity/DvdEntity.php

[ Command list ]
0 : (exit)
1 : command
・・・

%
columns で、id、title、content を指定したので、3つのプロパティとそれぞのアクセッサメソッドが実装されます。
% more app/modules/Default/entity/DvdEntity.php
<?php
class DvdEntity {
    const TABLE = "DVD";
    public function __construct(){}

    protected $id;
    const id_COLUMN = "id";
    public function setId($val){$this->id = $val;}
    public function getId(){return $this->id;}

    protected $title;
    const title_COLUMN = "title";
    public function setTitle($val){$this->title = $val;}
    public function getTitle(){return $this->title;}

    protected $content;
    const content_COLUMN = "content";
    public function setContent($val){$this->content = $val;}
    public function getContent(){return $this->content;}

    public function __toString() {
        $buf = array();
        $buf[] = 'id => ' . $this->getId();
        $buf[] = 'title => ' . $this->getTitle();
        $buf[] = 'content => ' . $this->getContent();
        return '{' . implode(', ',$buf) . '}';
    }
}
%

service & dao コマンド

説明

 service & dao コマンドはサービス名を決めると、命名規則に従ってサービス、dao、enitity、ダイコンファイル、テストクラスを生成します。 service コマンド dao コマンドを同時に実行することとほぼ同じ処理になります。
例えば、サービス名を「 emp 」とすると、サービスは EmpService、dao は EmpDao、entity は EmpEntitiy となります。

実行例

 s2base.php5 ディレクトリで s2baseコマンド を実行します。

% s2base
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 4             <--- 4 : service & dao を選択

[ Module list ]
0 : (exit)
1 : Default
choice ? : 1             <--- 1 : Default モジュールを選択

service name ? : emp     <--- 英数字 [_a-zA-Z0-9] が使用可能です。

use database ? (y/n) : n                      <--- データベースに接続してテーブル情報を取得
                                                   するかどうかを選択します。
table name ? [emp] : EMP                      <--- データベースのテーブル名を設定

columns ? [id,name,--, , ] : id,name,dept     <--- カンマ区切りでカラム名を入力

[ generate information ]
  module name             : Default
  service name            : emp
  service class name      : EmpService
  service test class name : EmpServiceTest
  dao interface name      : EmpDao
  dao test class name     : EmpDaoTest
  entity class name       : EmpEntity
  entity class extends    : none
  table name              : EMP
  columns                 : id, name, dept

confirm ? (y/n) : y                           <--- 表示される情報を確認
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/service/EmpService.php
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default/service/EmpServiceTest.php
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default/dao/EmpDaoTest.php
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/dao/EmpDao.php
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/entity/EmpEntity.php

[ Command list ]
0 : (exit)
1 : command
・・・
%
EmpServiceクラスでは EmpDao へのセッターメソッドが定義済みなので、サービスに dao が自動インジェクションされます。
% more app/modules/Default/service/EmpService.php
<?php
class EmpService {
    private $empDao;

    public function __construct(){}

    public function setEmpDao(EmpDao $dao){
        $this->empDao = $dao;
    }
}
%

interceptor コマンド

説明

 S2Aop の MethodInterceptor を実装するクラスを生成します。

実行例

 s2base.php5 ディレクトリで s2base コマンドを実行します。

% s2base
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 5     <--- 5 : interceptor を選択

[ Module list ]
0 : (exit)
1 : Default
choice ? : 1     <--- 1 : Default モジュールを選択

interceptor class name ? : HogeInterceptor     <--- 英数字 [_a-zA-Z0-9] が使用可能です。

[ generate information ]
  module name            : Default
  interceptor class name : HogeInterceptor

confirm ? (y/n) : y                            <--- 表示される情報を確認
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/interceptor/HogeInterceptor.php

[ Command list ]
0 : (exit)
1 : dao
・・・

%
S2Container_AbstractInterceptor を継承した interceptor を生成します。参照:独自実装によるInterceptor
% more app/modules/Default/interceptor/HogeInterceptor.php
<?php
class HogeInterceptor
    extends S2Container_AbstractInterceptor {

    /**
     * @param S2Container_MethodInvocation $invocation
     *    - $invocation->getThis()      : return target object
     *    - $invocation->getMethod()    : return ReflectionMethod of target method
     *    - $invocation->getArguments() : return array of method arguments
     */
    public function invoke(S2Container_MethodInvocation $invocation) {
        return $invocation->proceed();
    }
}
%

module コマンド

説明

 app/modules ディレクトリと test/modules ディレクトリにモジュールディレクトリを作成します。 app/modules/モジュールディレクトリには、dao、dicon、entity、interceptor、serviceディレクトリが作成されます。

実行例

 s2base.php5 ディレクトリで s2baseコマンド を実行します。

% s2base

[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 6               <--- 6 : module を選択

module name ? : Default    <--- モジュール名を入力。英数字 [_a-zA-Z0-9] が使用可能です。

[ generate information ]
  module name : Default    <--- モジュール情報を確認

confirm ? (y/n) : y
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/dao
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/dicon
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/entity
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/interceptor
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/service
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default/dao
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default/service
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/Default.inc.php

[ Command list ]
0 : (exit)
1 : command
・・・

%
app ディレクトリと test ディレクトリ以下にDefaultモジュールが作成されます。
% ls app/modules/Default
Default.inc.php  dao  dicon  entity  interceptor  service
% ls test/modules/Default
dao  service
%

service コマンド

説明

 サービスクラス、テストクラスを生成します。

実行例

 s2base.php5 ディレクトリで s2base コマンドを実行します。

% s2base
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : command

[ Command list ]
0 : (exit)
1 : dao
2 : dicon
3 : entity
4 : service & dao
5 : interceptor
6 : module
7 : service
choice ? : 7     <--- 7 : service を選択

[ Module list ]
0 : (exit)
1 : Default
choice ? : 1     <--- 1 : Default モジュールを選択

service interface name ? : CulcService     <--- 英数字 [_a-zA-Z0-9] が使用可能です。

[ generate information ]
  module name             : Default
  service class name      : CulcService
  service test class name : CulcServiceTest

confirm ? (y/n) : y                        <--- 表示される情報を確認
[INFO ] create : /seasar.php/workspace/s2base.php5/app/modules/Default/service/CulcService.php
[INFO ] create : /seasar.php/workspace/s2base.php5/test/modules/Default/service/CulcServiceTest.php

[ Command list ]
0 : (exit)
1 : command
・・・

%
service コマンドにより PHPUnit を用いた UnitTest クラスが作成されます。 s2base コマンドに test 引数を付けて実行すると UnitTest を実行できます。
% s2base test CulcService
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : test
[INFO ] test target       : CulcService

PHPUnit 3.1.7 by Sebastian Bergmann.

CulcServiceTest::testA

.

Time: 0 seconds


OK (1 test)
%
例として、サービスクラスに add メソッドを追加します。
% more app/modules/Default/service/CulcService.php
<?php
class CulcService {
    public function __construct(){}

    public function add($a, $b) {         <--- 足し算メソッドを追加
        return $a + $b;
    }
}
テストクラスに add メソッドをテストするテストメソッドを追加します。
% more test/modules/Default/service/CulcServiceTest.php
<?php
class CulcServiceImplTest extends PHPUnit_Framework_TestCase {
    private $module = "Default";
    private $container;                       <--- 各テストの前処理でS2Containerオブジェクトが設定されます。
    private $service;                         <--- 各テストの前処理でサービスオブジェクトが設定されます。

    public function __construct($name) {
        parent::__construct($name);
    }

    public function testAdd() {               <--- テストメソッドを追加
        $a = 2;
        $b = 3;
        $c = $this->service->add($a,$b);
        $this->assertEquals($c,5);
        print "$a + $b = $c" . PHP_EOL;
    }

    public function setUp(){
        print __CLASS__ . '::' . $this->getName() . PHP_EOL;
        $moduleDir = S2BASE_PHP5_ROOT . "/app/modules/{$this->module}";
        include_once($moduleDir . "/{$this->module}.inc.php");
        $this->container = S2ContainerApplicationContext::create();
        $this->service = $this->container->getComponent('CulcService');
    }

    public function tearDown() {
        $this->container = null;
        $this->service = null;
    }
}
%
s2base コマンドに test 引数を付けて実行すると UnitTest を実行できます。
% s2base test CulcService
[INFO ] s2base  directory : /seasar.php/workspace/s2base.php5/lib/S2Base/build/s2base.php5
[INFO ] project directory : /seasar.php/workspace/s2base.php5
[INFO ] project type      : command
[INFO ] command type      : test
[INFO ] test target       : CulcService

PHPUnit 3.1.7 by Sebastian Bergmann.

CulcServiceTest::testAdd
2 + 3 = 5                     <--- デバッグとして、足し算式を表示します。
.

Time: 0 seconds


OK (1 test)
%