Return type string on extended controller
Basic Controller that extends to another controllers, for example usage global pagination responses.
Problem: When in extended Controller we use method from parent class to return response()->json(?) always returning string when using Resource or variable contained Resource data in (?) on parential class
app\Http\Controllers\BasicController.php
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ExampleResource;
use App\Services\ExampleService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as Controller;
class BasicController extends Controller
{
/**
* @param Request $request
* @return JsonResponse
*/
public function example3(Request $request): JsonResponse
{
$responseData = ExampleService::getResponse($request, 'example 3');
return $this->makeResponse($responseData);
}
/**
* @param mixed $responseData
* @return JsonResponse
*/
public function makeResponse(mixed $responseData): JsonResponse
{
// this doesn't work
return response()->json(new ExampleResource($responseData));
// this works
// return response()->json(['example' => 'response', 'test_data' => 123]);
}
}
Example Controller that extends from BasicController app\Http\Controllers\ExampleController.php
<?php
namespace App\Http\Controllers;
use App\Services\ExampleService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* @method JsonResponse makeResponse(mixed $responseData)
* @method JsonResponse example3(Request $request)
* @method JsonResponse example2(Request $request)
*/
class ExampleController extends BasicController
{
/**
* @param Request $request
* @return JsonResponse
*/
public function example(Request $request): JsonResponse
{
$responseData = ExampleService::getResponse($request, 'example');
return $this->makeResponse($responseData);
}
}
routes/api.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/example', [\App\Http\Controllers\ExampleController::class, 'example'])->name('example');
Same problem here, we also make heavy use of base Controllers and even a custom base JSONResponse class. Our Base Controller also holds the validation rules, which also don't get recognized. We neither get a Request Body nor a Response Body:
I found this part about extensions in the documentation https://scramble.dedoc.co/developers/extensions Should we write such an extension to get the logic to recognize our structure?
@Jens-dev can you show some examples of your code base as well?