定制 moaalaa/laravel-api-responder 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

moaalaa/laravel-api-responder

Composer 安装命令:

composer require moaalaa/laravel-api-responder

包简介

A Package For Easy And Structured Api Response

README 文档

README

Api Responder Is A Simple Package For Api Response Using Laravel Resources With Some Features With Some Useful Readable And Chainable Methods

This Package Was Made For My Personal Usage

Prerequisites

This Package Required Laravel 5.5 (or higher)

Getting Started

Remember This Package Not Perfect It's Just Like Some Helpers For Me During Development. You Can Visit Laravel Official Docs About Api Resources For Deeper Understanding All The Rest Of The Documentation Will Explain How To Install And Every Method Provided To You

Installation

Via Composer

$ composer require moaalaa/laravel-api-responder

If You Do Not Run Laravel 5.5 (Or Higher), Then Add The Service Provider In config/app.php:

MoaAlaa\ApiResponder\ApiResponderServiceProvider::class,

If you do run the package on Laravel 5.5+, package auto-discovery takes care of the magic of adding the service provider.

Usage

Using ApiResponder is Very Easy And Straights Forward Just Use ApiResponder Trait Anywhere (I Usually Use It In Controllers So The Usage And Examples Will Be Also).

<?php

namespace App\Http\Controllers;

use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {

    }
}

Basic Usage

By Using ApiResponder Trait You Will Have Access To Method Called api() and It Will Make All The Magic For You, It Give You Access For Many Useful Methods Important One Is response() That Will Send the Response For You

<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        return $this->api()->response(User::first());
    }
}

Response Usage

$this->api()->response(...) Is Responsible For Responding All The Data For You And It Accepts More Than One Parameter

Parameters Desc Accepts Defaults
$data Your Data That You Want To Send Laravel Collections, Laravel Models, Laravel Pagination, Array, String, Integer, Null None But If Null Is Passed It Will Return Empty Array []
$error Error Messages String, Array, Null Null
$code The Response Status Code Integer 200
$additional Additional Data To Send With Response Array, Closure []
$wrap Wrapping Key For Returned Response String "payload"
<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        // $this->api()->response($data, $error = null, int $code = 200, $additional = [], $wrap = 'payload');

        $this->api()->response(User::first(), null, 200, function () {
            return ['foo' => 'bar'];
        }, 'baz');

        return $this->api()->response(User::first());
    }
}

Response Alias

Response Has An Alias Called $this->api()->responseWith() For Clear Readability

<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        $users = User::where(...)->take(...)->get();
        return $this->api()->responseWith($users);
    }
}

Get Paginate Limit Usage

$this->api()->getPaginateLimit() Method $this->api()->getPaginateLimit() Used To Return The Pagination Limit When Using Pagination Default Is 10 If Not Using $this->api()->setPaginateLimit($limit) To Change It.

Parameters Desc Accepts Defaults
None None None None
<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        return $this->api()->response(User::paginate($this->api()->getPaginateLimit()));
    }
}

Set Paginate Limit Usage

$this->api()->setPaginateLimit(50)->response(...) Method $this->api()->setPaginateLimit(50) Used To Adjust The Pagination Limit When Using Pagination You Can Define It In Any Service Provider Like AppServiceProvider To Apply The Limit In All Places You Used $this->api()->getPaginationLimit() Also You Can Edit It On Runtime As Will

Parameters Desc Accepts Defaults
$limit Pagination Length ByDefault Pagination Length Is 10 Integer None

AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use MoaAlaa\ApiResponder\ApiResponder;

class AppServiceProvider extends ServiceProvider
{
    use ApiResponder;

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->api()->setPaginationLimit(20);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

HomeController

<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {   
        // Default Pagination Limit 
        return $this->api()->response(User::paginate($this->api()->getPaginateLimit()));
        
        // Run-Time Set Pagination Limit 
        return $this->api()->setPaginateLimit(50)->response(User::paginate($this->api()->getPaginateLimit()));
    }
}

Error Usage

$this->api()->error(...) Is Responsible For Responding Errors Messages

Parameters Desc Accepts Defaults
$error Error Messages String, Array None
$code The Response Status Code Integer 500
<?php

// Simple User Api Login Example
namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class LoginController extends Controller
{
    use ApiResponder;

    public function login(Request $request)
    {
        if (! $token = auth()->attempt($request->only(['email', 'password']))) {
            return $this->api()->error($token, Response::HTTP_NOT_FOUND)
        }

        return $this->api()->response(['token' => $token]);
    }
}

Safe Error Usage

$this->api()->safeError(...) When Validation Laravel Applications And Don't Want To Use Validator Class Manually And Use $this->validate() Or request()->validate() Or $this->api()->validate() Then This Method Is For You But You Must Put Your Code In A Try Catch Block, The Method Will Handle The Exception And Get The Message Event If It's Normal Or Custom Or Even Laravel Validation Errors ( The Most Method I Love :) )

Note $this->api()->validate() Will Be Described Below

Parameters Desc Accepts Defaults
$exception Exception Variable Exception None
$code The Response Status Code Integer 500
<?php

// Simple User Api Login Example
namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class LoginController extends Controller
{
    use ApiResponder;

    public function login(Request $request)
    {
        try {
            $request->validate(...);

            if (! $token = auth()->attempt($request->only(['email', 'password']))) {
                return $this->api()->error($token, Response::HTTP_NOT_FOUND)
            }

            return $this->api()->response(['token' => $token]);
        
        } catch(\Exception $ex) {
            return $this->api()->safeError($ex);
        }

    }
}

Validate Usage

$this->api()->validate(...Roles...) It Validate The Request Inputs And Return The Validated Inputs

Note It's Just A Wrapper On request()->validate() Function

Parameters Desc Accepts Defaults
$attribute Array Of Roles For Validation Array None
<?php

// Simple User Api Login Example
namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class LoginController extends Controller
{
    use ApiResponder;

    public function login(Request $request)
    {
        try {
            $validated = $this->api()->validate([
                'email' => 'required|email',
                'password' => 'required',
            ]);

            if (! $token = auth()->attempt($validated)) {
                return $this->api()->error($token, Response::HTTP_NOT_FOUND)
            }

            return $this->api()->response(['token' => $token]);
        
        } catch(\Exception $ex) {
            return $this->api()->safeError($ex);
        }

    }
}

With Usage

$this->api()->with(...)->response(...) This Method Is Very Useful When Sending Additional Data With The Response Or To Make The Code More Readable

Parameters Desc Accepts Defaults
$additional Array Of Additional Data Array None
<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        return $this->api()->with(['foo' => 'bar'])->response(User::first());
    }
}

You Can Also Make A Dynamic Naming

But It Still Had Some Issues Be Carful HWne Using It

<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        return $this->api()->withFoo('bar')->response(User::first()); // ->withFoo('bar') Will Convert To ['foo' => 'bar']
        return $this->api()->withFoo(['bar', 'baz'])->response(User::first()); // ->withFoo(['bar', 'baz']) Will Convert To ['foo' => ['bar', 'baz']]
    }
}

Get Wrapping Usage

$this->api()->getWrapping This Method Gets The Wrapping Key String Around Your Data

Parameters Desc Accepts Defaults
None None None None
<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        return $this->api()->getWrapping(); // "payload" is The Default
    }
}

Set Wrapping Usage

Method $this->api()->setWrapping('foo') Used To Adjust The Wrapping Key String Around Data Response You Can Define It In Any Service Provider Like AppServiceProvider To Apply The New Wrapping Key String In All Places You Used $this->api()->response() Method Also You Can Edit It On Runtime As Will

Note It Have An Alias Called $this->api()->wrapping('foo')

Parameters Desc Accepts Defaults
$wrapping The Wrapping Key String Around Data Response Default Is "payload" String None

AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use MoaAlaa\ApiResponder\ApiResponder;

class AppServiceProvider extends ServiceProvider
{
    use ApiResponder;

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->api()->setWrapping('foo');
        $this->api()->wrapping('foo');
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

HomeController

<?php

namespace App\Http\Controllers;

use App\User;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        // return $this->api()->getWrapping(); // "foo"

        return $this->api()->response(...); // Now All Response Data Will Be In "foo" Key String
        
        // Run-Time Set Wrapping
        return $this->api()->setWrapping('bar')->response(...); // Now All Response Data Will Be In "bar" Key String
        
        // Run-Time Set Wrapping
        return $this->api()->wrapping('baz')->response(...); // Now All Response Data Will Be In "baz" Key String
    }
}

Example

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\User;
use App\Post;
use App\Setting;
use MoaAlaa\ApiResponder\ApiResponder;

class HomeController extends Controller
{
    use ApiResponder;

    public function index()
    {
        $this->api()
        ->with(['posts'=> Post::all()])
        ->withSettings(Setting::all())
        ->wrapping('myData')
        ->response(User::paginate($this->api()->getPaginateLimit()), null, 200, function () {
            return ['token' => auth()->user()->token];
        });
    }
}

Todo

  • TestCases

moaalaa/laravel-api-responder 适用场景与选型建议

moaalaa/laravel-api-responder 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 806 次下载、GitHub Stars 达 37, 最近一次更新时间为 2019 年 03 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「package」 「api」 「laravel」 「resources」 「respond」 「responses」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 moaalaa/laravel-api-responder 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 moaalaa/laravel-api-responder 我们能提供哪些服务?
定制开发 / 二次开发

基于 moaalaa/laravel-api-responder 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 806
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 37
  • 点击次数: 6
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 37
  • Watchers: 1
  • Forks: 3
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2019-03-27