Zend Framework3の始め方4

スポンサーリンク

自分なりにわかった、Zend Framework3の始め方をメモしていきます。

何度でも何度でも何度でも口酸っぱく言うよ

ここで紹介している方法はあくまで一つの方法です。
これ以外にもよりよい方法があるかもしれません。

 

ここでは、データベースに接続することを考えます。
つまりはモデルのことです。
またモデルは、作成するウェブサイトの根幹部分となるので、
それなりに行数が必要になることが多いと考えられます。
見やすさやコメントを意識しましょう。

 

モデルの作成

データベースに接続するモデルを作成するとき、私の知る限り二つほど方法があります

  • テーブルごとにクラスを作成し、クラス単位で操作する
  • データベースに接続するアダプターを作成し、sqlを記述する。

です。

今回は、データベースに接続するアダプターを作成する方法でいきたいと思います。
理由は、joinやら複数テーブル操作が、前者よりも簡単にできそうだなって思ったからです。

前提

今回は、データベースを使用します。データベースを準備してください。
私が使用しているものは、MySQLなので、MySQLに沿った書き方をします。
postgresql等を使用するときはその都度、アダプターのdb接続情報を変更してください。

また、セキュリティに関する説明を省略しています。
Sqlインジェクションなどの対策については、検索にてお願いします。
その理由は、データベースのセキュリティ関連のお話を理解しきれていないので説明できないからです。

手順

ここで紹介する、
データベースに接続するアダプターを用いたモデル作成、使用の手順は以下の通りです。

  • モデル用のファイル作成
  • Controller側からモデル呼び出し

正直に言います。割とめっちゃシンプルにできました。やったね
チュートリアルの方法見てたけど、
これただクラス呼び出すだけっしょ?これでよくね?
ってやってみたらできました。
動くからいいやというスタンスなので、公式にはだめかもしれませんが。

 

モデル用ファイルの作成

ファイルを作成します。
ファイルは
作成したモジュール/src/Model
内に作成します。
名前はモデル名+Model.php
クラス名と同一にします。私はこれで数時間奪われた。

 

例として、MemoModel.phpを作成しました。namespace等は適宜変更してください。
namespace 作成したモジュール名\Model;
等。

<?php
namespace Memo\Model;


use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Sql;
use Zend\Db\ResultSet\ResultSet;

class MemoModel
{
        //データベースアダプター+sqlをプログラムちっくに書くクラス
	public $Sql;

	public function __construct(){
                //db接続情報の記述
		$adapter = new Adapter([
		'dsn' => 'mysql:host=localhost;dbname=hoge',
    		'driver'   => 'PDO_Mysql',
    		'database' => 'hoge',
    		'username' => 'hoge',
	        'password' => 'hogehogehoge',
		]);
		$this->Sql = new Sql($adapter); 
	}

        //すべてのメモを取得する関数
	public function getAllMemo(){
                //select文の作成
		$select = $this->Sql->select();
		$select->columns(['id','time','title','detail'])->from('memo');

		//sqlの準備
		$stmt = $this->Sql->prepareStatementForSqlObject($select);

		//sql実行、保存
		$ret = new ResultSet;
		$ret->initialize($stmt->execute());

                //配列にして返す
		return $ret->toArray();
	}
}

記述の通り、すべてのメモを取得する関数を持つMemoModelを作成しました。
また、普通にsql文を書くこともできるのですが、それだとなんか味気ないので、
zendframeworkの中にある、Sqlクラスを使用しました。
このクラスを使用すると、上述の通り、プログラムっぽくSql文を構築することができます。

select文以外はどうするんだとお考えの皆様に、公式サイトのリンクを張っておきます
英語ですが、プログラム部分を見れば、大体何をしているのかがわかるので、
自分のしたいことに合わせて利用しましょう。

SQL Abstraction - zend-db - Zend Framework Docs
Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations

 

また、私はSql文を書いて練習したい!
という方もいると思うので、その時の書き方を説明します。
こうします。

<?php
namespace Memo\Model;


use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Sql;
use Zend\Db\ResultSet\ResultSet;

class MemoModel
{
        //データベースアダプター
	public $adapter;

	public function __construct(){
                //db接続情報の記述
		$this->adapter = new Adapter([
		'dsn' => 'mysql:host=localhost;dbname=hoge',
    		'driver'   => 'PDO_Mysql',
    		'database' => 'hoge',
    		'username' => 'hoge',
	        'password' => 'hogehogehoge',
		]);
	}

        //すべてのメモを取得する関数
	public function getAllMemo(){

                $stmt = $this->adapter->query('select * from memo');
                //sql実行、保存
		$ret = new ResultSet;
		$ret->initialize($stmt->execute());

                //配列にして返す
		return $ret->toArray();
	}
}

こうすることで、同様の結果が得られます。
sqlは文字列として記述すればよいです。
より高度な使い方については、インターネットで検索してください。

 

 

Controller側から呼び出し

作成したモデルを呼び出します。
MemoModelクラスを呼び出したときの例を載せます。

<?php
namespace Memo\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

//追加
use Memo\Model\MemoModel;

class MemoController extends AbstractActionController{
  
  public $model;

  public function __construct(){
    $this->model = new MemoModel();
  }


  public function indexAction(){

    //show all memo
    return new ViewModel(['memos' => $this->model->getAllMemo()]);
  }
}

$this->modelは、constructで最初に設定されます。MemoModelクラスになります。
$this->model->getAllMemo()で、少し上で作成したgetAllMemo関数を呼び出し、
その結果を連想配列に入れ、その連想配列をViewModelに入れてreturnします。

ビュー側では
こんな感じで呼び出すことができます。
今回は例なので、ただ単に配列を表示するphpの関数を使いました。
本来は、php文のfor文等をつかって記述します。

<div>
	this is index action<br />
	<a href="<?= $this->url('memo', ['action' => 'add']) ?>">add</a><br />
	<a href="<?= $this->url('memo', ['action' => 'edit']) ?>">edit</a><br />
	<a href="<?= $this->url('memo', ['action' => 'delete']) ?>">delete</a><br />

	<?= print_r($this->memos)?>
</div>

実行結果です。

print_r関数の結果が出ます。

 

まとめ

これで、データベースに接続することができるようになりました。
これで、認証系を除くたいていのウェブアプリを作成することができます。

今更ですが、
ここでは自分の作成したいウェブサイトを作成する手順の一つを紹介しているにすぎません。
なので、最低限の説明しかありませんし、
○○の時はどうやるの?
△△なら?
とか、そういうのには対応していません。

自分の持っているアイデアを実現するのは基本自分自身ですので
試行錯誤は避けられないことを知っておきましょう。
すべて教えてくれる教科書なんてそう簡単には見つかりません。

 

なんか変に力はいりましたが、
次は認証系です。
ACLや、ログイン関連を勉強してきます。

コメント

タイトルとURLをコピーしました