good code is self-documenting. Let’s make our APIs speak for themselves

Abdullah AlHabal
3 min readSep 1, 2024

--

Elevating Your PHP API: Naming Conventions, Design Tips, and Routing Best Practices

As a PHP developer, I’ve learned the critical importance of consistent naming, clean API design, and effective routing. These practices not only elevate your backend code but also significantly improve the developer experience for those maintaining or consuming your services. Let’s dive into some crucial practices that will transform your PHP APIs.

1. Naming Conventions: Clarity is Key

📊 Database Tables: Embrace the Plural

  • Rule: Use plural names for tables (e.g., users, orders, products)
  • Why? It reflects the collection nature of database tables.
  • Example:

CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255)
);

📘 Models: Singular for the Win

  • Rule: Name models in singular form (e.g., User, Order, Product)
  • Why? This aligns with OOP principles, representing a single instance of the entity.
  • Example:
class User extends Model
{
// Model definition
}

🔗 Foreign Keys: Be Specific and Consistent

  • Rule: Name foreign keys after the related model in singular form with _id suffix
  • Example: user_id, order_id, product_id
  • Why? Improves readability and maintains consistency across your database schema.

2. API Design: RESTful Principles

🌐 URLs: Embrace Simplicity and Clarity

  • Avoid: Verbose URLs (e.g., /getAllUsers, /createNewOrder)
  • Prefer Simple, resource-focused URLs (e.g., /users, /orders)
  • Why? Follow RESTful API design principles for clarity and consistency.

RESTful URL Structure

  • Collection: /api/v1/resources
  • Single Resource: /api/v1/resources/{id}
  • Nested Resources: /api/v1/resources/{id}/sub-resources

HTTP Methods for CRUD Operations

  • GET: Retrieve resource(s)
  • POST: Create a new resource
  • PUT/PATCH: Update an existing resource
  • DELETE: Remove a resource

Examples of RESTful Endpoints

GET    /api/v1/users         # List users
POST /api/v1/users # Create a new user
GET /api/v1/users/{id} # Get a specific user
PUT /api/v1/users/{id} # Update a specific user
DELETE /api/v1/users/{id} # Delete a specific user

3. Routing in PHP Laravel: Implementing Best Practices

Using RouteServiceProvider for API Versioning

  1. Update app/Providers/RouteServiceProvider.php:
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));

// Add versioned API routes
Route::prefix('api/v1')
->middleware('api')
->namespace($this->namespace.'\V1')
->group(base_path('routes/api_v1.php'));
});
}
}

2. Create routes/api_v1.php for version-specific routes:

use App\Http\Controllers\V1\UserController;

Route::apiResource('users', UserController::class);

Implementing Resource Controllers

Use Laravel’s resource controllers to automatically map RESTful actions:

php artisan make:controller V1/UserController --api

This creates a controller with methods mapped to RESTful actions:

class UserController extends Controller
{
public function index()
{ /* List users */ }

public function store(Request $request)
{ /* Create user */ }

public function show($id)
{ /* Get user */ }

public function update(Request $request, $id)
{ /* Update user */ }

public function destroy($id)
{ /* Delete user */ }
}

4. Benefits of This Approach

  • Self-explanatory URLs: The purpose of each endpoint is clear from its URL.
  • Easier maintenance and scalability: Consistent structure makes adding new features simpler.
  • Improved developer experience: Other developers can quickly understand and work with your API.
  • Better alignment with HTTP methods: Leverages the semantic meaning of GET, POST, PUT, and DELETE.
  • Enhanced interoperability: Follows widely adopted standards, making integration easier.
  • Versioning support: Allows for evolving your API without breaking existing clients.

5. Best Practices for Other Developers

  • Document Your API: Use tools like
    Swagger/OpenAPI/Postman to provide clear documentation.
  • Use Meaningful Status Codes:
    - 200 for success,
    - 201 for creation,
    - 404 for not found, etc.
  • Implement Proper Error Handling: Return descriptive error messages and appropriate status codes.
  • Use Query Parameters for Filtering/Sorting: e.g.,
    /api/v1/users?role=admin&sort=name
  • Implement Pagination: For large datasets, use offset/limit or cursor-based pagination.
  • Use Camel Case for JSON Properties: e.g.,
    { "firstName": "John", "lastName": "Doe" }
  • Validate Input Data: Use Laravel’s form request validation for robust input handling.
  • Use Resource Classes: For consistent and controlled API responses.

Clear, consistent naming conventions, RESTful design principles, and thoughtful routing strategies make your APIs more intuitive and maintainable. By following these practices, you reduce cognitive load for developers, improve the overall quality of your codebase, and create a foundation for scalable, user-friendly APIs.

Remember, good code is self-documenting. Let’s make our APIs speak for themselves! 💻✨

--

--

Abdullah AlHabal
Abdullah AlHabal

Written by Abdullah AlHabal

Junior Backend Software Engineer | Laravel, PHP, NestJS | API Design | MySQL, PostgreSQL | Docker | Web Technologies Enthusiast