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

Posted: 2014-06-06 01:01 |  laravel 

今回はLaravelを使って開発していく上で、重要なポイントを紹介します。
チュートリアル用にも使いやすいApplication.BasicPackを用意しました。
 

■モデル?

Laravelでは他のMVCフレームワークのようにモデル、という言葉は適切ではないかもしれません。
モデルという言葉で、おそらく多くの方は、データベースのね、と思うかもしれません。
モデルはデータベース専用のものであれば、
それ以外の処理はどこに書くべきでしょうか?コントローラー?ビュー?
ファットなコントローラーや、ごちゃごちゃしたビューの誕生です。
そうならない為にも、モデルはデータベース専用ではなく、ビジネスロジックはここで良い!
という緩い括りで捉えてください。
これはLaravelに限らず、他のフレームワークでも同様です。
興味のある方は、ドメイン駆動関連の書籍等を読んでみると良いかもしれません。

■それはさておきLaravelでモデルを使うときはどうするんだろう?

よく見かける事が多い疑問です。
codeigniterの様な、

$this->load->model('Model');

の様なものも存在しません。それにリファレンスにも特にのっていません。
モデルに限らず、様々まクラス等を読み込んだりする場合は、
Iocコンテナ[制御の反転]というものを利用します。
*Iocコンテナについてはまた別の機会にミッチリやります。
が、今は簡単なものを2つ程紹介します。

■モデル等、他のクラスのインスタンスがほしい!

最も簡単に解決する方法は、new でしょうか?
それでもいいでしょう、ですがテスト(嫌な言葉ですね!)し辛く、
だいぶいまいちなものになってしまうでしょう。(これについてもまた別の機会に・・)
テストもしやすく、且つnewの様な使い心地がお望みであれば下記のものがいいでしょうか

\App::make('Model');
// namespace付きでも簡単です
\App::make("App\Model");

これでnewするより、遥かにクリーンなものになります。
makeを使用する場合は、下記のようにすると見通しがいいかもしれません。
 

namespace App\Controllers;

class AcmeController extends BaseController
{
    /** @var \Model */
    protected $model;

    public function __construct()
    {
        $this->model = \App::make('Model');
    }

    public function getIndex()
    {
        $this->model->hoge();
    }
}
codeigniterを使っていた方にとっては馴染みやすい記述方法ではないでしょうか?
ただし、makeはシングルトンではないため、
その場合はsingletonを使用しますがそれもまた別の機会に(
ただこれはまだ完璧ではありません。
より完璧な、テストのしやすいコントローラー、またはコントローラー以外の処理にも使用するには
次のように記述します。
 
namespace App\Controllers;

class AcmeController extends BaseController
{
    /** @var \Model */
    protected $model;

    public function __construct(\Model $model)
    {
        $this->model = $model;
    }

    public function getIndex()
    {
        $this->model->hoge();
    }
}
コントローラーのコンストラクタに、利用したいモデルをタイプヒントで指定します。
こうする事で、タイプヒントで指定されたクラスを自動的に探し、
$modelでインスタンスを取得します。
これで完璧までもう少しの所まできました。完璧を目指すにはまだ早すぎるので、ここまでにしましょう。
このようにして、モデル、と言わず様々なクラスをコンストラクタで指定して、
使用するクラス等を簡単に解決する事ができます。
モデルの前にまずはシンプルなクラスをコントローラーで利用してみましょう。
namespace App\Managers;

class SampleManager
{
    /**
     * @return string
     */
    public function get()
    {
        return 'hello';
    }
}

app/App/Managers/SampleManager.php としました。
psr等に変更していない場合は、クラス追加時に

$ composer dump-autoload

を実行してください。
次にHomeControllerから利用してみましょう。
 

namespace App\Controllers;

use App\Managers\SampleManager;

class HomeController extends BaseController
{
    protected $sample;

    public function __construct(SampleManager $sample)
    {
        $this->sample = $sample;
    }

    public function showWelcome()
    {
        return $this->sample->get();
    }

}

簡単です。
Modelは他のクラスと区別されるものではありませんので、こうやって使えばシンプルだ!と覚えておいてください。
引数が必要な他のパッケージはどうやって使うのか、等の疑問ももちろん後日べつの(
次回はいよいよ、やっとデータベースアクセスについてです

 

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