scramble icon indicating copy to clipboard operation
scramble copied to clipboard

Return type string on extended controller

Open terehov-space opened this issue 1 year ago • 2 comments

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');
image

terehov-space avatar Apr 08 '24 09:04 terehov-space

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:

Bildschirmfoto 2024-05-02 um 16 30 59

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 avatar May 02 '24 14:05 Jens-dev

@Jens-dev can you show some examples of your code base as well?

romalytvynenko avatar May 04 '24 02:05 romalytvynenko