ادغام Eloquent ORM بر روی کدایگنایتر 3

علی شریفی نیستانی

می 14, 2020

کدایگنایتر توی ایران یه فریم ورک کاملا محبوب حساب میشه. و دوستانی دارم که به شدت روی این فریم ورک تعصب دارن. اما به نظرم ORM کدایگنایتر در مقابل Eloquent ORM حرفی برای گفتن نداره. من اولین پروژه ی خودم رو با کدایگنایتر نوشتم. اما به دلیل آشنایی با yii2 و لاراول خیلی وقت بود که ازش استفاده نکرده بودم. بهرحال همکاری با یک شرکت مجبور شدم بعد از شش سال کار رو دوباره باهاش شروع کنم. کار کردن با همه جاش برام شیرین بود جز کار با مدل، برای همین مجبور شدم eloquent رو باهاش ادغام کنم. فریم ورک کدایگنایتر خیلی سریع، سبک و ساده است. و به خوبی از MVC پیشتیانی می کنه. برای پروژه های کوچیک واقعا چیز خوبیه و به pure PHP خیلی نزدیک تره. و خلاصه طرفداران خودش رو داره. اما فکرش رو بکنید بتونیم ORM لاراول رو باهاش ادغام کنیم. واقعا باحال میشه نه؟ پس این آموزش رو دنبال کنید.

مراحل ادغام Eloquent در کدایگنایتر

  1. نصب پکیج Illuminate/Database از طریق composer
  2. پیکربندی Hook در کدایگنایتر
  3. تست کار با Laravel Eloquent و شروع کوئری زدن

نصب پکیج Illuminate/Database از طریق composer

فرض رو بر این میزاریم که composer رو روی سیستمتون نصب دارید. در روت پروژه ی کدایگنایتری خودتون، ترمینال رو باز کنید. و دستور زیر رو اجرا کنید.

composer require illuminate/database 5.1.16

دستور بالا پکیج دیتابیس لاراول رو از سایت packagist بر روی پروژه ی کدایگنایتر ما نصب می کنه. بنابر این نیاز داریم برای فایل مدلمون یک autoload درست کنیم. برای این منظور فایل composer.json رو باز کنید و تغییرات زیر رو اعمال کنید.

{
    "autoload": {
    "classmap": [
    "application/models"
    ]
}

الان یه همچین چیزی داریم:

{
"require": {
     "illuminate/database": "5.1.16"
   },
   "autoload": {
   "classmap": [
        "application/models"
    ]
    }
 }

در نهایت خط زیر رو به فایل index.php در روت پروژه ی خودتون اضافه کنید.

require_once 'vendor/autoload.php';

در ترمینال خودتون دستور زیر رو اجرا کنید تا تغییرات دامپ بشه.

composer dump-autoload

پیکربندی Hook در کدایگنایتر

اولا بدونید که hook یه ویژگی در کدایگنایتر هست که این امکان رو به ما می ده که بدون دستکاری هسته ی اصلی فریم ورک، پیکربندی خودمون رو اعمال کنیم.

اول از همه ما باید به کدایگنایتر بفهمونیم که میخوایم از Hook استفاده کنیم. بنابراین فایل کانفیگ رو باز کنید.

application/config/config.php

$config['enable_hooks'] = TRUE;

حالا فایل hook.php رو باز کنید و تغییرات زیر رو توش اعمال کنید.

application/config/hooks.php

$hook['post_controller_constructor'][] = [
    'class'    => 'EloquentHook',
    'function' => 'bootEloquent',
    'filename' => 'EloquentHook.php',
    'filepath' => 'hooks'
   ];

توی این فایل گفتیم که بعد از اینکه constructor کدایگنایتر اجرا شد فایل EloquentHook.php رو اجرا کن. بنابر این این فایل رو در مسیر application/hooks می سازیم.

<?php
use Illuminate\Database\Capsule\Manager as Capsule;
class EloquentHook {
    protected $instance;
    private function setInstance() {
        $this->instance =& get_instance();
    }
    private function loadDatabase() {
        $this->instance->load->database(); 
    }
    private function getDB() {
        return $this->instance->db;
    }
    public function bootEloquent() {
        $this->setInstance();
        $this->loadDatabase();
        $config = $this->getDB();
        $capsule = new Capsule;
        $capsule->addConnection([
            'driver'    => 'mysql',
            'host'      => $config->hostname,
            'database'  => $config->database,
            'username'  => $config->username,
            'password'  => $config->password,
            'charset'   => $config->char_set,
            'collation' => $config->dbcollat,
            'prefix'    => $config->dbprefix,
        ]);
        $capsule->setAsGlobal();
        $capsule->bootEloquent();
    }

}

توجه داشته باشید متغیر $config در واقع کانفیگ دیتابیس رو در خودش نگه می داره که قبلا در فایل application/config/database.php توسط شما مقدار دهی شده.

استفاده از Laravel Eloquent و کوئری زدن

خب ما همه ی کارهایی که باید رو، انجام دادیم. پس بیاید تست کنیم. از این به بعد مدل هامون رو از کلاس Eloquent اکستند می کنیم.

<?php 
use \Illuminate\Database\Eloquent\Model as Eloquent;
class User extends Eloquent {
        protected $table = "users"; // table name
}

توجه:
فراموش نکنید بعد از ایجاد هر مدل باید دستور زیر رو در ترمینال خودتون وارد کنید.

composer dump-autoload

حالا برای تست موارد بالا، کافیه در کنترلر پروژتون به صورت زیر کوئری بزنید.

User::all(); // will fetch all users
User::find(1); // will fetch user with id 1
User::where('id', '>', 1)->get(); // will fetch users with id > 1

تبریک میگم شما به راحتی موفق شدید از ORM لاراول در پروژه ی کدایگنایتری خودتون استفاده کنید.