Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Api Response Laravel Package

sm-sandy/api-response

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require sm-sandy/api-response
    

    Publish the config file (if needed):

    php artisan vendor:publish --provider="SmSandy\ApiResponse\ApiResponseServiceProvider"
    
  2. First Use Case Return a success response in a controller:

    use SmSandy\ApiResponse\Facades\ApiResponse;
    
    public function show($id)
    {
        $data = User::findOrFail($id);
        return ApiResponse::success($data, 'User retrieved successfully');
    }
    

    Return an error response:

    public function store(Request $request)
    {
        try {
            // Logic here
        } catch (\Exception $e) {
            return ApiResponse::error('Validation failed', $e->getMessage());
        }
    }
    
  3. Where to Look First

    • Facade: SmSandy\ApiResponse\Facades\ApiResponse
    • Config: config/api-response.php (for default messages)
    • Documentation: Check the README.md for built-in methods like success(), error(), validationError(), etc.

Implementation Patterns

Core Workflows

  1. Consistent Response Structure Use the facade to enforce a uniform response format across all endpoints:

    // Success with data
    ApiResponse::success($user, 'User created', 201);
    
    // Error without data
    ApiResponse::error('Unauthorized', 'Invalid credentials', 401);
    
    // Validation error
    ApiResponse::validationError($validator->errors());
    
  2. Dynamic Response Customization Override default messages or structure per endpoint:

    ApiResponse::setSuccessMessage('Custom success message');
    ApiResponse::setErrorMessage('Custom error message');
    
    // Reset to defaults
    ApiResponse::resetMessages();
    
  3. Integration with Laravel Features

    • API Resources: Combine with Resource classes for nested data:
      return ApiResponse::success(new UserResource($user));
      
    • Form Requests: Use validationError() in handle():
      public function handle()
      {
          $this->validate();
          // ...
      }
      
    • Middleware: Standardize responses in HandleIncomingRequest:
      public function handle($request, Closure $next)
      {
          try {
              return $next($request);
          } catch (\Exception $e) {
              return ApiResponse::error('Server error', $e->getMessage(), 500);
          }
      }
      
  4. Batch Processing Return paginated or collection responses:

    ApiResponse::success(User::paginate(10), 'Users list');
    

Advanced Patterns

  1. Custom Response Classes Extend the base ApiResponse class for project-specific needs:

    namespace App\Responses;
    
    use SmSandy\ApiResponse\ApiResponse as BaseResponse;
    
    class AppResponse extends BaseResponse
    {
        public function customSuccess($data, $message = null)
        {
            return $this->respond([
                'status' => 'custom_success',
                'data' => $data,
                'message' => $message ?? 'Custom operation succeeded',
            ], 200);
        }
    }
    
  2. Conditional Responses Dynamically choose response type based on logic:

    if ($user->exists) {
        return ApiResponse::success($user);
    } else {
        return ApiResponse::error('Not found', 'User does not exist', 404);
    }
    
  3. Localization Support Use Laravel’s localization with config:

    // config/api-response.php
    'messages' => [
        'success' => [
            'default' => 'lang::api.success.default',
        ],
    ],
    

    Then translate in your language files (resources/lang/en/api.php).


Gotchas and Tips

Common Pitfalls

  1. Overriding Config Too Late

    • Issue: Config changes (e.g., setSuccessMessage()) may not persist across requests if called after the response is sent.
    • Fix: Set defaults in a service provider’s boot() method:
      public function boot()
      {
          ApiResponse::setSuccessMessage(__('api.success.default'));
      }
      
  2. Nested Data Serialization

    • Issue: Complex nested objects may not serialize as expected (e.g., relationships, closures).
    • Fix: Use ->toArray() or ->resolve() on Eloquent models:
      ApiResponse::success($user->load('posts')->resolve());
      
  3. Status Code Conflicts

    • Issue: Custom status codes (e.g., 200 for success) may clash with Laravel’s defaults.
    • Fix: Explicitly pass the status code:
      ApiResponse::success($data, 'Message', 200); // Force 200 OK
      
  4. Facade vs. Class Instantiation

    • Issue: Direct instantiation (new ApiResponse) bypasses config.
    • Fix: Prefer the facade for consistency:
      // Avoid this (unless extending)
      $response = new \SmSandy\ApiResponse\ApiResponse();
      

Debugging Tips

  1. Inspect Response Structure Use dd() or dump() to verify the response format:

    $response = ApiResponse::success($data);
    dd($response->getData());
    
  2. Check Config Overrides Verify published config isn’t being overridden:

    php artisan config:clear
    
  3. Log Custom Messages Add debug logs for custom responses:

    \Log::debug('Custom response triggered', [
        'data' => $data,
        'message' => $message,
    ]);
    

Extension Points

  1. Custom Response Macros Add reusable methods to the facade:

    ApiResponse::macro('apiError', function ($message, $errors = null) {
        return $this->error('API Error', $message, 400, $errors);
    });
    
    // Usage:
    ApiResponse::apiError('Invalid input', $validator->errors());
    
  2. Event-Based Responses Trigger responses via Laravel events:

    // In EventServiceProvider
    protected $listen = [
        'user.created' => [\App\Listeners\HandleUserCreation::class],
    ];
    
    // Listener
    public function handle()
    {
        return ApiResponse::success('User created!');
    }
    
  3. Testing Helper Create a testing trait for consistent assertions:

    trait AssertsApiResponse
    {
        protected function assertSuccessResponse($response, $data = null)
        {
            $response->assertJsonStructure([
                'status' => 'success',
                'data' => $data ? $data : [],
            ]);
        }
    }
    

Performance Considerations

  1. Avoid Redundant Calls Cache repeated responses (e.g., for static errors):

    $errorResponse = ApiResponse::error('Not found');
    return $errorResponse; // Reuse
    
  2. Lazy-Load Data Defer data loading until response is needed:

    ApiResponse::success(function () use ($userId) {
        return User::find($userId)->load('posts');
    });
    
  3. Disable for Non-API Routes Use middleware to skip formatting for non-API routes:

    // app/Http/Kernel.php
    'web' => [
        \App\Http\Middleware\SkipApiResponse::class,
        // ...
    ],
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
sentix/ai-chatbot
terminal42/code-quality-tools
codifyo/ts-generator-bundle
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky