Seasar DI Container with AOP

セットアップ

S2Dao.PHP5には最新版のS2Container.PHP5が必要です。
S2Container.PHP5のセットアップを終えてからS2Dao.PHP5の設定をしてください。
また、S2Dao.PHP5ではPDOを利用しています。 利用前にPDOのインストールも終えておいてください。

S2Dao.PHP5のインストール

PEARパッケージからのインストール

S2Dao.version.tgzを取得し、pear install を実施して下さい。

% pear install /path/to/S2Dao.{version}.tgz
install ok: channel://pear.php.net/S2Dao-{version}

% pear list
・・・
S2Container             {version}       status
S2Dao                   {version}       status
・・・
%

S2Container.php と S2Dao.php を読み込み、__autoload関数を次のように定義して下さい。S2Dao.PHP5が使用可能となります。

<?php
require_once 'S2Container/S2Container.php';
require_once 'S2Dao/S2Dao.php';

function __autoload($class = null){
    if($class != null){
        include_once("$class.class.php");
    }
}
?>

S2ContainerClassLoaderを利用する場合は、__autoload関数を次のように定義して下さい。

<?php
require_once 'S2Container/S2Container.php';
require_once 'S2Dao/S2Dao.php';

S2ContainerClassLoader::import(S2CONTAINER_PHP5);
S2ContainerClassLoader::import(S2DAO_PHP5);
function __autoload($class = null){
    S2ContainerClassLoader::load($class);
}
?>

開発中のアプリケーションや使用しているフレームワークで既に__autoload関数が定義されている場合は、上記の __autoload関数内容を定義済み __autoload関数に追記して下さい。

S2Dao.PHP5をアンインストールする場合は、pear uninstall を実施して下さい。

% pear uninstall S2Dao
uninstall ok: channel://pear.php.net/S2Dao-{version}

ソースからのインストール

s2dao.php5.version.tar.gz をダウンロード後、解凍すると以下のようなディレクトリが展開されます。

s2dao.php5/
  +-- docs/                     ----- ドキュメント ディレクトリ
  +-- examples/                 ----- examples ディレクトリ
  +-- src/                      ----- ソース ディレクトリ
  +-- test/                     ----- test case ディレクトリ
  +-- s2dao.inc.php             ----- S2Dao.PHP5 設定ファイル
  +-- S2Dao.php                 ----- S2Dao.PHP5 設定ファイル
  +-- Apache_Software_License_2.0.txt
  +-- ChangeLog

S2Container.php と S2Dao.php を読み込み、__autoload関数を次のように定義して下さい。S2Dao.PHP5が使用可能となります。

<?php
require_once '/path/to/s2container.php5/S2Container.php';
require_once '/path/to/s2dao.php5/S2Dao.php';
function __autoload($class = null){
    if($class != null){
        include_once("$class.class.php");
    }
}
?>

S2ContainerClassLoaderを利用する場合は、__autoload関数を次のように定義して下さい。

<?php
require_once '/path/to/s2container.php5/S2Container.php';
require_once '/path/to/s2dao.php5/S2Dao.php';

S2ContainerClassLoader::import(S2CONTAINER_PHP5);
S2ContainerClassLoader::import(S2DAO_PHP5);
function __autoload($class = null){
    S2ContainerClassLoader::load($class);
}
?>

開発中のアプリケーションや使用しているフレームワークで既に__autoload関数が定義されている場合は、上記の __autoload関数内容を定義済み __autoload関数に追記して下さい。

S2Dao.PHP5の設定

通常 S2Dao.php を読み込むだけでS2Dao.PHP5の利用が可能です。

S2Dao.php の設定は以下の通りです。

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
// +----------------------------------------------------------------------+
// | PHP version 5                                                        |
// +----------------------------------------------------------------------+
// | Copyright 2005-2006 the Seasar Foundation and the Others.            |
// +----------------------------------------------------------------------+
// | Licensed under the Apache License, Version 2.0 (the "License");      |
// | you may not use this file except in compliance with the License.     |
// | You may obtain a copy of the License at                              |
// |                                                                      |
// |     http://www.apache.org/licenses/LICENSE-2.0                       |
// |                                                                      |
// | Unless required by applicable law or agreed to in writing, software  |
// | distributed under the License is distributed on an "AS IS" BASIS,    |
// | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,                        |
// | either express or implied. See the License for the specific language |
// | governing permissions and limitations under the License.             |
// +----------------------------------------------------------------------+
// | Authors: nowel                                                       |
// +----------------------------------------------------------------------+
// $Id: $
//
/**
 * @author nowel
 *
 * S2Dao System Definition
 *   SDao define these definitions.
 *   - S2DAO_PHP5 : S2DAO.PHP5 ROOT Directory
 *     [ string default /src/s2dao.php5 ]
 *
 * User Definition
 *   User could define these definitions.
 *   - S2DAO_PHP5_USE_COMMENT : constant or comment annotation usage
 *     [ boolean: default false ]
 *
 * Autoload function must be defined
 *   sample : use S2ContainerClassLoader
 *     S2ContainerClassLoader::import(S2CONTAINER_PHP5);
 *     S2ContainerClassLoader::import(S2DAO_PHP5);
 *     function __autoload($class = null){
 *         S2ContainerClassLoader::load($class);
 *     }
 *
 *   sample : use include_once directly
 *     function __autoload($class=null){
 *         if($class != null){
 *             include_once("$class.class.php");
 *         }
 *     }
 *
 */

require_once dirname(__FILE__) . '/build/s2dao.php5/S2Dao.php';
?>

DICONの設定

S2Dao.PHP5を利用するには src/s2dao.php5/dao.dicon を読み込んでください。
DataSourceとしてPDOを必要とするので、pdo.diconの設定をしておいてください。

dao.diconは以下のように記述されています。

<components namespace="dao">

    <include path="%PDO_DICON%" />

    <component class="S2Dao_BasicResultSetFactory" />
    <component class="S2Dao_BasicStatementFactory" />
    <component class="S2Dao_FieldAnnotationReaderFactory" />
    <component class="S2Dao_DaoMetaDataFactoryImpl" />
    <component name="interceptor" class="S2DaoInterceptor" />

</components>

また、読み込むべきdiconの例です。

<components namespace="example">

    <include path="dao.dicon" />

    <component class="Cd1Dao">
        <aspect>dao.interceptor</aspect>
    </component>

    <component class="Cd2DaoImpl">
        <aspect>dao.interceptor</aspect>
    </component>

</components>

詳細は /examples/s2dao/resource/example.dicon.xml に記述しているので参考にしてください。

Dao,Entityの読み込みの例(S2ContainerClassLoader::importを用いて)

/examples/example.inc.php では 以下のように記述し、複数個生成された dao 及び entity(bean)の読み込みを自動化しています。

if(class_exists("S2ContainerClassLoader")){
    S2ContainerClassLoader::import(dirname(__FILE__) . "/dao");
    S2ContainerClassLoader::import(dirname(__FILE__) . "/entity");
    S2ContainerClassLoader::import(dirname(__FILE__) . "/impl");

    function __autoload($class = null){
        if( S2ContainerClassLoader::load($class) ){
            return;
        }
    }
}

PDOの設定

S2Dao.PHP5ではPDOを利用しています。
PDO で利用できる DSN については、PHP: PDO Functions - Manualを参考に設定してください。
多くの場合は /examples/pdo.dicon が参考になると思います。

dao.dicon を読み込む前に pdo.dicon を読み込むように設定してください。

/examples/pdo.dicon には以下のように記述されています。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="pdo">

    <component name="dataSource" class="S2Container_PDODataSource">
        <property name="dsn">"mysql:host=localhost; dbname=s2con"</property>
        <property name="user">"root"</property>
        <property name="password">"pass"</property>
        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING);
        </property>
    </component>

    <!--
    <component name="dataSource" class="S2Container_PDODataSource">
        <property name="dsn">"sqlite:/path/to/s2con.db"</property>
        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING);
        </property>
    </component>
    -->

    <!--
    <component name="dataSource" class="S2Container_PDODataSource">
        <property name="dsn">"pgsql:host=localhost; dbname=s2con"</property>
        <property name="user">"root"</property>
        <property name="password">"pass"</property>
        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING);
        </property>
    </component>
    -->

    <!--
    <component name="dataSource" class="S2Container_PDODataSource">
        <property name="dsn">"firebird:host=localhost; dbname=/path/to/s2con.fdb"</property>
        <property name="user">"root"</property>
        <property name="password">"pass"</property>
        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING);
        </property>
    </component>
    -->

    <!--
    <component name="dataSource" class="S2Container_PDODataSource">
        <property name="dsn">"oci:dbname=//localhost/s2con"</property>
        <property name="user">"root"</property>
        <property name="password">"pass"</property>
        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING);
        </property>
    </component>
    -->

    <!-- freetds dsn sybase|mssql
    <component name="dataSource" class="S2Container_PDODataSource">
        <property name="dsn">"dblib:host=localhost; dbname=s2con"</property>
        <property name="user">"root"</property>
        <property name="password">"passpass"</property>
        <property name="option">
            array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING);
        </property>
    </component>
    -->

    <component name="requiredTx" class="S2Dao_RequiredInterceptor" />
    <component name="requiresNewTx" class="S2Dao_RequiresNewInterceptor" />
    <component name="mandatoryTx" class="S2Dao_MandatoryInterceptor" />
    <component name="neverTx" class="S2Dao_NeverInterceptor" />
    <component name="notSupportedTx" class="S2Dao_NotSupportedInterceptor" />

</components>