実践Laravel 基本編9 データベースアクセス(モデル)3

Posted: 2014-06-19 23:11 |  laravel 
前回のエントリーに続き、クラスを継承してデータベースアクセスの簡略化を計ってみましょう。
ソースコードはこちらを参照して下さい
queryBuilderを用いていますが、
Eloquentでも今回紹介する様なパターン(リポジトリーパターンに近いもの)を使用する事で、
Eloquentを用いたものでもテストがしやすくなります。
下記の様に記述してみると、シンプルなクエリーはほぼクエリを書かなくても済む様になります

class UserRepository extends AbstractFluent
{

    protected $cacheKey = "user:";
    /** @var string */
    protected $table = 'users';
    /** @var */
    protected $primary = 'user_id';

    /**
     * @param $id
     * @return mixed
     */
    public function getUser($id)
    {
        return $this->find($id);
    }

    /**
     * @param $userName
     * @return mixed|static
     */
    public function getUserFromName($userName)
    {
        return $this->getConnection('sqlite')->where('user_name', $userName)->first();
    }
}
テスト時にIocコンテナを使って入れ替えができる様に(Stub)、
また実際の開発の時に拡張性がある様にinterfaceを継承する様にします。
 
/**
 * Interface UserRepositoryInterface
 * @package App\Repositories
 */
interface UserRepositoryInterface
{
    /**
     * @param $id
     * @return mixed
     */
    public function getUser($id);

    /**
     * @param $userName
     * @return mixed
     */
    public function getUserFromName($userName);
}
こうする事で、現在のqueryBuilderから、お好みでEloquentに変更する場合でも、
RDBMSではなく、mongoDBやriak等に変更する場合も単純に入れ替えるだけです。
class UserRepository extends AbstractFluent implements UserRepositoryInterface
{

    protected $cacheKey = "user:";
    /** @var string */
    protected $table = 'users';
    /** @var */
    protected $primary = 'user_id';

    /**
     * @param $id
     * @return mixed
     */
    public function getUser($id)
    {
        return $this->find($id);
    }

    /**
     * @param $userName
     * @return mixed|static
     */
    public function getUserFromName($userName)
    {
        return $this->getConnection('sqlite')->where('user_name', $userName)->first();
    }
}
先ほどのものにinterfaceを用います。
それではコントローラーからモデルを使ってみましょう。
protected $user;

/**
 * @param UserRepositoryInterface $user
 */
public function __construct(UserRepositoryInterface $user)
{
    $this->user = $user;
}
コントローラーのコンストラクタに、インターフェースをタイプヒントで記述しました。
このままでは当然ですが、インターフェースはインスタンスを生成しないので実行できませんが、
このインターフェースを実装しているものは、何であっても動作するという保証になります。
LaravelのIocコンテナ(DI)を使用して、
インターフェースと実際に使用したいクラスを結びつけます。
app/start/global.php に下記の様に追記してみましょう。
\App::bind('App\Repositories\UserRepositoryInterface', 'App\Repositories\Fluent\UserRepository');
これだけで、インターフェースとクラスのひも付け(依存の解決)ができます。
依存解決の方法は他にもいくつかパターンがあります。
次回はバリデーションなどを使用してみます

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014