BEAR.Sunday 学習記録(3) いろいろな作法

前回まで、データベース接続であれこれやっていましたが、結局、Zend\Db はやめて Idiorm というPDOベースの軽量なライブラリを使おうかなと ^ ^;;

で、今回はデータベースは一旦おいておいて、BEAR.Sunday のいろいろな作法についてまとめてみることにしました。ちょこちょこ追加すると思います。

なお、主にデモアプリを調べた結果なので、以下が唯一の正解というわけでは無いと思います。

# 各種設定値と取得

各種パスやアプリケーション名などは、@Named アノテーションを使うか Trait を使って取得できます。

## @Named アノテーションで取得する

パッケージのルートディレクトリなどは、以下のように @Named アノテーションを使って取得できます。

```php

use Ray\Di\Di\Inject;
use Ray\Di\Di\Named;

class Sample
{
    /**
     * @param string $dir
     *
     * @Inject
     * @Named("package_dir")
     */
    public function __construct($dir)
    {
        $this->package_dir = $dir;
        parent::__construct();
    }
```

* "package_dir" ex) "/var/www/bear"
* "app_dir"
* "app_name" ex) "Foo\Bar"
* "lib_dir" ex) "/var/www/bear/apps/Foo.Bar/var/lib"
* "log_dir" ex) "/var/www/bear/apps/Foo.Bar/var/log"
* "tmp_dir" ex) "/var/www/bear/apps/Foo.Bar/var/tmp"

## Traitで取得する
`\BEAR\Sunday\Inject` 以下に、各種値をインジェクトする Trait が用意されています。
たぶん、他に引数があるメソッドでこれらの値を取得したい場合に使うんだと思います。他に引数がないメソッドの場合は、@Named アノテーションで取得する方が手軽、かな。

これらの Trait を使うと、@Named アノテーションを使って private プロパティにそれぞれの値をセットしてくれるので、`$this->appDir`などで値にアクセスできます。

* AppDirInject // `$this->appDir`
* AppNameInject // `$this->appName`
* LibDirInject // `$this->libDir`
* LogDirInject // `$this->logDir`
* TmpDirInject // `$this->tmpDir`

```php
<?php
namespace Foo\Bar\...;
use BEAR\Sunday\Inject\TmpDirInject;

class Sample extends ResourceObject
{
    use TmdDirInject;

    public function onGet()
    {
        $tmpDir = $this->tmpDir; // ex) "/var/www/bear/apps/Foo.Bar/var/tmp"
        // ...
    }
```

## コンテキスト
prod, dev などのコンテキストを取得します。
以下のように、コンストラクタインジェクションで `@Named("app_context")` を指定して取得できます。

```php:{Vendor.Application}/Module/AppModule.php
    /**
     * @param string $context
     *
     * @Inject
     * @Named("app_context")
     */
    public function __construct($context = 'prod')
    {
        $this->context = $context;
        parent::__construct();
    }
```

## 設定値

DI の instance バインディングで定数をバインドし、 @Named アノテーションで取得するんだと思います。

### constants.php

`{Vendor.Application}/var/conf/constants.php` に書いた連想配列の値は、 StandardPackageModule から PackageModule を経て、BEAR\Sunday\Module\Constant\NamedModule にて、instance バインディングされています。

これによって、 @Named アノテーションを使って取得できます。
あるいは、Inject 用の Trait を用意します。


## データベース関連の設定

### データベースの指定
sqlite, mysql などの指定。

- `{Vendor.Application}/var/conf/constants.php`

### データベース接続情報
データベース名、ユーザ、パスワードなどの指定

- `{Vendor.Application}/var/conf/db/sqlite.php`
- `{Vendor.Application}/var/conf/db/mysql.php`


# ディレクトリ
ディレクトリ名は、原則単数形で、CamelCase。

## View 関連のファイル

### サイト全体の html レイアウトテンプレート
- Twig : `{Vendor.Application}/var/lib/twig/template/layout`
- Smarty : `{Vendor.Application}/var/lib/smarty/template/layout`

### スタイルシート, 画像などの置き場
- `{Vendor.Application}/var/www/`

### リソース用のテンプレートの置き場
- `{Vendor.Application}/src/Resource/Page/`
- `{Vendor.Application}/src/Resource/App/`

`{phpファイル名}.twig`（Twigの場合）、`{phpファイル名}.tpl`（Smartyの場合）という名前で php ファイルと同じディレクトリに設置するようです。


## データベース

### ファイルベースのデータベース
SQLite などのデータベースファイル置き場。

- `{Vendor.Application}/var/db/`

### アプリケーション用のテーブル作成 SQL 置き場
- `{Vendor.Application}/var/db/sql/`

# デフォルトのパッケージ

主に `{bear}/src/Module/Package/StandardPackageModule.php` でインストールしている。

## テンプレートエンジン
Twig

## フォーム
AuraForm