9

我一直在开发一组要为移动应用程序公开的 REST API。我正在遵循 Laravel 项目开发的存储库模式。如何实现演示者和转换器以在我的所有 API 集中格式化恒定的 JSON 输出?

例如,我有以下用于登录的控制器

public function authenticate()
    {
        $request = Request::all();  
        try {
                // If authenticated, issue JWT token
                //Showing a dummy response
                return $token;
            }  catch (ValidatorException $e) {
                return Response::json([
                    'error'   =>true,
                    'message' =>$e->getMessageBag()
                ]);
            }
    }

现在变形金刚和主持人在哪里出现?我知道两者都用于通过转换 db 对象来格式化输出并生成格式化的 JSON,以便它在我的 API 中保持统一。

dingo API 和分形甚至框架(L5 存储库)都没有提供详细的文档,我也找不到这方面的任何教程。

我为另一个提供产品列表的 API创建了以下演示者和转换器

namespace App\Api\V1\Transformers;

use App\Entities\Product;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract {

    public function transform(\Product $product)
    {
        return [
            'id'     => (int) $product->products_id
        ];
    }
}

主持人

<?php

namespace App\Api\V1\Presenters;

use App\Api\V1\Transformers\ProductTransformer;
use Prettus\Repository\Presenter\FractalPresenter;

/**
 * Class ProductPresenter
 *
 * @package namespace App\Presenters;
 */
class ProductPresenter extends FractalPresenter
{
    /**
     * Transformer
     *
     * @return \League\Fractal\TransformerAbstract
     */
    public function getTransformer()
    {
        return new UserTransformer();
    }
}

我将如何在控制器中设置演示者并做出响应?试过了

$this->repository->setPresenter("App\\Presenter\\PostPresenter");

但它似乎不起作用,文档没有显示完整的步骤。

  1. 在上面的示例中,如何为可以在整个 API 中使用的错误响应制作模板,以及如何将错误异常传递给它?
  2. 似乎演示者和转换器可用于将数据库对象转换为可呈现的 JSON 而不是其他任何东西。那正确吗?
  3. 您如何使用演示者和转换器来进行成功响应和错误响应?通过将异常而不是 DB 对象传递给转换器?
4

4 回答 4

1

我刚刚在这里也看到了您的类似问题。因此,请在此处查看我对您的其他问题的回答:https ://stackoverflow.com/a/34430595/429719 。

从我得出的另一个问题中,您正在使用Dingo,因此将其用作结构化响应类。确保您是控制器扩展Dingo,然后您可以以结构化方式返回项目和集合,例如:

return $this->response->item($user, new UserTransformer);

return $this->response->collection($users, new UserTransformer);

如果您想要一个很好的错误处理,请在此处查找文档:https ://github.com/dingo/api/wiki/Errors-And-Error-Responses

基本上,您可以抛出任何核心异常或一些自定义异常Dingo。Dingo 层将捕获它们并返回结构化的 JSON 响应。根据 Dingo 文档:

throw new Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Nope, no entry today!');

会产生:

{
    "message": "Nope, no entry today!",
    "status_code": 403
}
于 2015-12-23T07:34:03.197 回答
1

我遇到了同样的问题,这就是我如何将野狗与变压器一起使用

控制器:

public function update(Request $request)
{

    $bus = new CommandBus([
        $this->commandHandlerMiddleware
    ]);

    $agency = $bus->handle(
        new UpdateAgencyCommand($request->user()->getId(), $request->route('id'), $request->only('name'))
    );

    return $this->response->item($agency, new AgencyTransformer());
}

变压器:

class AgencyTransformer extends TransformerAbstract
{
    public function transform(AgencyEntity $agencyEntity)
    {
        return [
            'id' => (int) $agencyEntity->getId(),
            'name' => $agencyEntity->getName(),
        ];
    }
}

这就是我处理错误的方式:

throw new UpdateResourceFailedException('Could not update agency.', $this->agencyUpdateValidator->errors());
于 2015-12-18T16:38:59.213 回答
0

您可以尝试使用,[Midresapi]: https ://github.com/oktorino/midresapi 。这将返回一致的成功或失败响应,在 laravel 7 和 8 中工作,处理验证响应,处理 500 响应:

$users=\App\User::latest()->limit(2)->get();

return response($users);
#or
return fractal()
        ->collection($users)
        ->transformWith(new \App\Transformers\UserTransformer)
        ->toArray();

回复 :

{
"status_code": 200,
"success": true,
"message": "ok",
"data": [
    {
        "username": "dany",
        "email": "jancuk@sabarbanget.com"
    },
    {
        "username": "scc-client-5150",
        "email": "dancuk@gmail.com"
    }
  ]
}
于 2021-02-15T05:05:49.597 回答
-1

Fractal 在这里有完整的记录:http: //fractal.thephpleague.com/ 我经常从 Phil Sturgeon 那里读到一本很棒的书https://leanpub.com/build-apis-you-wont-hate你可以找到大多数github https://github.com/philsturgeon/build-apis-you-wont-hate中提供的书籍代码。你可以在那里找到非常好的分形示例。

  1. 我会创建一个 Api 控制器并从我的控制器中扩展它。那里应该有所有的响应函数(respondWithError、respondWithArray 等)
  2. 转换器正在以一致的 json 格式转换对象,以便您的所有端点为每个实体返回相同的东西。

  3. 对此真的没有答案

  4. Fractal 文档中有足够的示例。
于 2015-12-16T10:49:07.850 回答