دیتابیس و مدل ها:
خب تا اینجا ماژول خودمون رو درست کردیم و رابط ها را ایجاد نمودیم الآن وقتشه بریم سراغ مدل.
مدل قسمتی که با هدف هسته اصلی برنامه در ارتباطه و منظور، منطق کار ما بوده که در اینجا دیتابیس هستش.
ما برای انجام عمل های اصلی بر روی دیتابیس از ویژگی Zend\Db\TableGateway\TableGateway استفاده خواهیم کرد مثل insert، select، delete، update.
برای ساخت دیتابیس مورد نظر به قسمت ساخت دیتابیس در فریمورک ZEND رجوع کنید.
خب حالا ما در دیتابیس خودمون یکسری اطلاعات و جدول داریم و قصد داریم که یک مدل برای اون ایجاد کنیم.
فایل های مدل :
فریمورک ما برای مدل هیچ کامپوننت مشخصی نداره و دلیل اون اینه که مدل منطق کسب و کار شما هست و این کاملاً به شما بستگی داره که مدل شما چه جوری کار کنه. شما از کامپوننت های زیادی می تونید برای نیازهای خودتون استفاده کنید. یک روش اینه که شما کلاس های مدل داشته باشید و که هر موجودیت رو در برنامه شما تعریف کنه و از شی های مسیریاب برای ذخیره و لود کردن موجودیت ها استفاده کنید. روش دیگر استفاده از تکنولوژی ORM(Object-Relational Mapping) هستش مثل Doctorine و Propel.
برای این فایل آموزشی ما قصد ساخت مدلی با ساخت یک کلاس به نام AlbumTable داریم که از کامپوننت
Zend\Db\TableGateway\TableGateway  استفاده خواهیم کرد و هر آلبوم داخل آن به عنوان  یک شی Album (شناخته شده بعنوان یک موجودیت) معرفی خواهد شد. این روش به کارگیری الگوی طراحی Table Data Gateway بوده برای اینکه به ما این اجازه رو بده با دیتا در دیتابیس ارتباط داشته باشیم.
در ابتدا با ساختن فایلی به نام Album.php  در زیر شاخه module/Album/src/Model شروع می کنیم.

<?php

namespace Album\Model;

class Album 
{
    public $id;
    public $artist;
    public $title;

    public function exchangeArray(array $data)
    {
        $this->id     = !empty($data['id']) ? $data['id'] : null;
        $this->artist = !empty($data['artist']) ? $data['artist'] : null;
        $this->title  = !empty($data['title']) ? $data['title'] : null;
    }
    }

Album یک کلاس php هستش که برای ارتباط با کلاس TableGateway واقع در Zend-db باید از تابع exchangeArray استفاده کنیم. این تابع دیتا هایی که از طریق آرایه  data$ به اون داده می شود رو در متغیرهای کلاس ما کپی می کنه. بعداً ما محدودیت هایی رو اعمال می کنیم تا این فایل ها در ابتدا تایید شوند و بعداً ذخیره شوند.
خب در ادامه فایل به نام AlbumTable.php را در دایرکتوری module/Album/src/Model می سازیم.

<?php
/**
 * Created by PhpStorm.
 * User: domino
 * Date: 7/17/17
 * Time: 5:27 PM
 */
namespace Album\Model;

use RuntimeException;
use Zend\Db\TableGateway\TableGatewayInterface;

class AlbumTable
{
    private $tableGateway;

    public function __construct(TableGatewayInterface $tableGateway)
    {
        $this->tableGateway = $tableGateway;
    }

    public function fetchAll()
    {
        return $this->tableGateway->select();
    }

    public function getAlbum($id)
    {
        $id = (int) $id;
        $rowset = $this->tableGateway->select(['id' => $id]);
        $row = $rowset->current();
        if (! $row) {
            throw new RuntimeException(sprintf(
                'Could not find row with identifier %d',
                $id
            ));
        }

        return $row;
    }

    public function saveAlbum(Album $album)
    {
        $data = [
            'artist' => $album->artist,
            'title'  => $album->title,
        ];

        $id = (int) $album->id;

        if ($id === 0) {
            $this->tableGateway->insert($data);
            return;
        }

        if (! $this->getAlbum($id)) {
            throw new RuntimeException(sprintf(
                'Cannot update album with identifier %d; does not exist',
                $id
            ));
        }

        $this->tableGateway->update($data, ['id' => $id]);
    }

    public function deleteAlbum($id)
    {
        $this->tableGateway->delete(['id' => (int) $id]);
    }
}

خب کد های زیادی رو وارد کردیم پس یه توضیحی در موردشون عرض کنم. در ابتدا ما یک متغیر به نام tableGateway$ ایجاد می کنیم و مقدار اون رو با مثال tableGateway$ از TableGatewayInterface پاس داده شده در تابع construct__ ست می کنیم. ما از این متغیر برای انجام عملیات بر روی جدول های دیتابیس برای آلبوم های خودمون استفاده کنیم.
در ادامه یکسری از توابع کمکی استفاده می کنیم تا با table gateway ارتباط داشته باشیم.
تابع ()fetchAll تمام ردیف های موجود در دیتابیس رو بعنوان نتیجه برمی گردونه، تابع ()getAlbum یک ردیف را بعنوان شی Album برمی گردونه، ()saveAlbum برای آپدیت کردن و ساختن یک ردیف جدید استفاده می شود و ()deleteAlbum  برای پاک کردن یک ردیف به کار میرود. خدا رو شکر خود این کد ها خودشون رو توضیح می دن.