为什么我的资源不 return 所有具有 "with" 方法的元数据?
Why my resource do not return all meta data having "with" method?
在 lumen 8 应用程序中,我在这里使用资源和阅读
https://laravel.com/docs/8.x/eloquent-resources
我尝试使用“with”方法,因为我想向任何请求添加一些元数据,但我没有
此元数据在 returned 数据中:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Page As PageModel;
use App\Http\Resources\User as UserResource;
class Page extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
...
'created_at' => $this->created_at,
];
}
public function with($request)
{
\Log::info( '-1 unction with ::' . print_r( 1, true ) ); // I DO NOT SEE THIS LOGGINHG line
return [
'meta' => [
'version'=>getAppVersion()
]
];
}
}
在引用的文档中,资源声明与 ResourceCollection 略有不同:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
public function toArray($request)
{
return parent::toArray($request);
}
public function with($request)
{
return [
'meta' => [
'key' => 'value',
],
];
}
}
这可能是问题吗?如何修复我的资源以获取所有元数据?
更新块:
UserCollection - 即 collection https://laravel.com/docs/8.x/eloquent-resources
我的 collection 是页面,我在控制器中使用它作为 :
namespace App\Http\Controllers;
use Carbon\Carbon;
use App\Models\Page;
use Illuminate\Http\Request;
use App\Http\Resources\Page as PageResource;
use Config;
use App\Http\Requests\PageRequest;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use Validator;
class PageController extends Controller
{
public function index()
{
$pages = Page
...
->get();
return $this->sendOkResponse(PageResource::collection($pages), '');
}
sendOkResponse 定义在Http/Controllers/Controller.php :
class Controller extends BaseController
{
protected $requestData;
public function __construct()
{
$request = request();
$this->requestData = $request->all();
}
public function sendOkResponse($responseResult, $message)
{
$response = [
'success' => true,
'data' => $responseResult,
'message' => $message,
];
return response()->json($response, HTTP_RESPONSE_OK);
}
我想 PageResource 在 PageController 控制器索引方法退出时被销毁...
更新块#2:
经过一些测试后,我发现如果 collection 被 returned 资源方法“with”不起作用
我需要在控制器中使用 ->additional ,例如:
return (PageResource::collection($pages))
->additional([
'meta' => [
'version' => getAppVersion()
]
]);
但在我 return sinopgle 元素(ex store 方法)喜欢
的情况下
return (new PageResource($page));
方法“with”工作正常。
这不包括使用像 sendOkResponse 这样的包装器。
这是唯一正确的方法吗?
提前致谢!
Laravel 资源旨在直接从控制器的操作方法返回,而不是作为表示 JSON.
的关联数组的一部分
使用 sendOkResponse
方法包装您的响应时,不会直接从该方法返回资源,因此会在您的资源上调用 toArray
。您的资源上的 with
方法被忽略。
尝试直接从控制器的方法返回资源。在构建资源时使用 additional
方法在响应中传递额外的属性。参见:https://laravel.com/docs/8.x/eloquent-resources#adding-meta-data-when-constructing-resources.
如果您可以控制 API 合同,我建议将它们更改为完全省略 success
,这可以从 HTTP 状态代码中得出。
在 lumen 8 应用程序中,我在这里使用资源和阅读 https://laravel.com/docs/8.x/eloquent-resources
我尝试使用“with”方法,因为我想向任何请求添加一些元数据,但我没有 此元数据在 returned 数据中:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Page As PageModel;
use App\Http\Resources\User as UserResource;
class Page extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
...
'created_at' => $this->created_at,
];
}
public function with($request)
{
\Log::info( '-1 unction with ::' . print_r( 1, true ) ); // I DO NOT SEE THIS LOGGINHG line
return [
'meta' => [
'version'=>getAppVersion()
]
];
}
}
在引用的文档中,资源声明与 ResourceCollection 略有不同:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
public function toArray($request)
{
return parent::toArray($request);
}
public function with($request)
{
return [
'meta' => [
'key' => 'value',
],
];
}
}
这可能是问题吗?如何修复我的资源以获取所有元数据?
更新块: UserCollection - 即 collection https://laravel.com/docs/8.x/eloquent-resources 我的 collection 是页面,我在控制器中使用它作为 :
namespace App\Http\Controllers;
use Carbon\Carbon;
use App\Models\Page;
use Illuminate\Http\Request;
use App\Http\Resources\Page as PageResource;
use Config;
use App\Http\Requests\PageRequest;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use Validator;
class PageController extends Controller
{
public function index()
{
$pages = Page
...
->get();
return $this->sendOkResponse(PageResource::collection($pages), '');
}
sendOkResponse 定义在Http/Controllers/Controller.php :
class Controller extends BaseController
{
protected $requestData;
public function __construct()
{
$request = request();
$this->requestData = $request->all();
}
public function sendOkResponse($responseResult, $message)
{
$response = [
'success' => true,
'data' => $responseResult,
'message' => $message,
];
return response()->json($response, HTTP_RESPONSE_OK);
}
我想 PageResource 在 PageController 控制器索引方法退出时被销毁...
更新块#2: 经过一些测试后,我发现如果 collection 被 returned 资源方法“with”不起作用 我需要在控制器中使用 ->additional ,例如:
return (PageResource::collection($pages))
->additional([
'meta' => [
'version' => getAppVersion()
]
]);
但在我 return sinopgle 元素(ex store 方法)喜欢
的情况下return (new PageResource($page));
方法“with”工作正常。
这不包括使用像 sendOkResponse 这样的包装器。 这是唯一正确的方法吗?
提前致谢!
Laravel 资源旨在直接从控制器的操作方法返回,而不是作为表示 JSON.
的关联数组的一部分使用 sendOkResponse
方法包装您的响应时,不会直接从该方法返回资源,因此会在您的资源上调用 toArray
。您的资源上的 with
方法被忽略。
尝试直接从控制器的方法返回资源。在构建资源时使用 additional
方法在响应中传递额外的属性。参见:https://laravel.com/docs/8.x/eloquent-resources#adding-meta-data-when-constructing-resources.
如果您可以控制 API 合同,我建议将它们更改为完全省略 success
,这可以从 HTTP 状态代码中得出。