Laravel 5 - 在 Rest API 服务器上自定义 JSON 响应

Alb*_*rta 4 php json laravel-5

我是 Laravel 的新手,我正在将我的应用程序从 Slim Framework 迁移到 Laravel 5。谷歌搜索我没有找到太多关于如何自定义 JSON 响应的信息。假设我有:

模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $visible = [
        'username', 'posts',
    ]; 
}
Run Code Online (Sandbox Code Playgroud)

控制器

<?php

namespace App\Http\Controllers;

use [...]

/* *
 *  Implicit controller
 */
class UserController extends Controller
{
    public function getIndex()
    {
        return response()->json(User::all(), 200);
    }
}
Run Code Online (Sandbox Code Playgroud)

路线

Route::controller('users', 'UserController');
Run Code Online (Sandbox Code Playgroud)

如果我想在 JSON 对象中输出该数据,该怎么办:

{"success": bool, "message": string, "data": array} 
// in this case 'array' would be User::all()
Run Code Online (Sandbox Code Playgroud)

?

有谁知道是否有一个图书馆来处理这种东西?或者有人已经以某种方式在 laravel 中解决了这个问题吗?

NB我知道我可以编写一个中间件来“修改”响应,但我不确定这是正确的解决方案,而且检查中间件是否应该包含错误也很痛苦。

谢谢你。

小智 12

是一个有点晚的回应,但也许它会进一步帮助某人。

您可以使用 Response Factory 在您的项目中创建 Provider 来解决此问题,以下是成功错误响应的示例:

<?php
// Place this file on the Providers folder of your project
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\ResponseFactory;

class ResponseServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('success', function ($message = '', $data = null) use ($factory) {
            $format = [
                'status' => 'ok',
                'message' => $message,
                'data' => $data,
            ];

            return $factory->make($format);
        });

        $factory->macro('error', function (string $message = '', $errors = []) use ($factory){
            $format = [
                'status' => 'error', 
                'message' => $message,
                'errors' => $errors,
            ];

            return $factory->make($format);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 config/app.php 中的 providers 值上添加类:

'providers' => [
    ...

    App\Providers\ResponseServiceProvider::class,
]
Run Code Online (Sandbox Code Playgroud)

大功告成,因为提供者已经聚合,您只需使用传递相应属性的响应助手调用宏即可。例如:

$user = User::find(1); 

if($user) {
   return response()->success('Your custom success message', $user);
} else {
   return response()->error('Your custom error message', 'Validation errors or else');
}
Run Code Online (Sandbox Code Playgroud)


Yur*_*ich 8

你试过了吗

return response()->json([
    'success'=>true, 
    'message'=>'string', 
    'data'=>User::all()
]);
Run Code Online (Sandbox Code Playgroud)

?