Custom driver để kết nối tới API Server thay vì Database trong laravel

Chào mọi người,

Mình có một project sử dụng laravel 5.2, ở phần model thì mình sử dụng query bằng Eloquent ORM, tuy nhiên project của mình không kết nối trực tiếp đến database (mysql) mà nó sẽ kết nối đến một api server. Vì vậy hiện tại để có thể truy vấn theo kiểu eloquent thì mình phải dùng cheat (viết các static function như where, find,… trong model mới extends từ Eloquent Model) để khi truy vấn thì model sẽ kết nối tới api server chứ không kết nối đến db (Phần config database coi như bỏ).

Hiện tại thì project đã hoạt động ok, nhưng mình muốn sửa lại để phần model chạy theo đúng luồng của Eloquent model chứ không phải cheat như bây giờ, tức là khi truy vấn thì sẽ truy vấn đến database được khai báo trong config database.php (ở đây là api server). Muốn vậy thì mình nghĩ là phải tạo ra một custom driver (hiện tại laravel chỉ hỗ trợ 4 driver là mysql, sqlserver, SQLite và PostgreSQL).

Mình vẫn chưa hiểu được cách mà 1 driver trong laravel hoạt động, Anh/Chị/Bạn có thể cho mình xin ý kiến về vấn đề này hoặc các vấn đề có liên quan được không ạ? Mình cảm ơn :blush:

Bạn có thể đọc code của file
framework/Foundation/Database/Model.php

Và xem cách họ quản lí một abstraction Model

Trước tiên, ở config/database.php, bạn thêm một connection của api database đó vào.
Ví dụ “api_db”

Tại mỗi Eloquen Model File, bạn tạo một file có cấu trúc như sau:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TableNameOfApiDb extends Model
{
  protected $connection = 'api_db';

	protected $table = 'table_name_if_you_want_to_specify';

	public $timestamps = false; // nếu không có cột c/u_at

	public $primaryKey  = 'primary_key_column';
}

2 Likes

Ở phần model mình đã custom được và kết nối tới api ok hết rồi, nhưng ý mình là nó không đúng theo luồng đi chuẩn của Eloquent đó, bởi vì ở phần khai báo config trong database.php thì đã khai báo driver là một hqt như mysql chẳng hạn nhưng model thì lại kết nối tới api server (api mới kết nối đến database).

Vậy nên mình mới muốn tạo một custom driver để project hoạt động đúng với chuẩn của laravel và eloquent. :smile:

Mình chưa hiêủ cái Api server của bạn nó như thế nào. Nó là dạng restful api hay là cái gì?

Nếu được thì cho mình một ví dụ

1 Like

Đúng r, là restful api đó. :smile:

Nếu bạn dùng restful api thì theo mình biết bạn sẽ phải viết lại cái connector(có thể phải rewrite abstract model), tương tự driver của mongodb cho laravel (bạn có thể tham khảo trên github).

Phần này nó còn phức tạp hơn cả mongo vì nó không đơn giản chỉ là driver của db mà nó lại thông qua một api trung gian.

Mình vẫn khuyên nên tách api ra api, driver ra driver. Dù nó hơi vất vả khi maintance

2 Likes

ok thanks bạn, vì cái này là task công ty nên vẫn phải làm thôi :blush:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?