簡體   English   中英

API在自己網站上的內部請求?

[英]API Internal requests on own website?

我想為Android和Apple開發一個網站和一個應用程序。 一個應用程序將通過API從我們的域中獲取數據。

假設在我們的網站上,它將顯示產品列表或創建用戶帳戶; 在控制器中,我可以使用內部API請求,然后再通過MySQL而不是直接使用MySQL查詢方法來獲取數據。 這是普通做法還是不良做法?

這是dingo / api內部請求(Laravel)的示例:

Route::api(['version' => 'v1', 'prefix' => 'api'], function () {

    Route::get('users', function () {
        // fetch from database
        return User:all();
        });
});

在控制器中

class UsersController
{

    public function showUsers()
    {
        $users = API::get('users');

        return View::make('users-list')->with('users', $users);
    }
}

在此示例中,他們為users get方法和API::get('users');建立了API路由設置API::get('users'); 會向該終點發出內部請求,並向您返回該方法返回的結果

是的,我會考慮這種常見做法。 我個人甚至認為在內部使用自己的API是個好習慣。 這肯定有助於保持你的代碼DRY(d ONT [R EPEATŸ我們自己)。

當然,與直接方法調用相比,這會造成一些開銷,但是我懷疑它是否會引起注意。 無論如何,出於您的考慮,一種替代方法是使API控制器保持非常平坦,並將您的大多數邏輯放在其他地方(在模型,存儲庫或服務層中)。 我還是建議這樣做。 這意味着您可以像在API控制器中一樣輕松地在“常規”控制器中執行相同的操作,因為它基本上只是對另一個類的(很少)調用。

這是一個例子來說明我的意思

假設您的users端點更加復雜(其中包括一些急切的加載和過濾操作)

public function index(){
    return User::has('profile')
               ->with('profile', 'city')
               ->active()
               ->get();
}

當然,現在仍然不是很多代碼,您也可以在其他控制器中輕松地執行相同的操作。 但是想象一下,您想添加一個新的關系來增加負載。 您需要在兩個地方更改代碼。 (如果您忘記一個,您甚至可能不會注意到它...)

解決此問題的一種方法是創建一個存儲庫 我不會詳細介紹如何實現這種模式(Internet上有很多關於此的資源),但基本上到最后,您將擁有一個像這樣的類:

class UserRepository {
    public function getAll(){
        return User::has('profile')
               ->with('profile', 'city')
               ->active()
               ->get();
    }
}

(理想情況下,您還將有一個定義存儲庫的接口...)

然后使用依賴注入使該類的實例在您的控制器中可用:(同樣,這還不完整,您還需要一些其他東西來設置DI)

public function __construct(UserRepository $repo){
    $this->user = $repo;
}

public function index(){
    return $this->user->getAll();
}

在其他控制器中,您可以使用完全相同的調用getAll()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM