Left Icon Right Icon
Squehub SqueHub

🧭 Controllers in Squehub

Controllers in Squehub handle the business logic of your application. They receive input from routes, process data using models or packages, and return a response β€” typically a view or JSON response.

All controller files should be stored in /project/Controllers/. The controller class name must match the file name (e.g., UserController inside UserController.php).

πŸ’‘ Use controllers to keep route files clean and business logic separate.

πŸ“ Directory Structure

project/
└── Controllers/
    β”œβ”€β”€ HomeController.php
    β”œβ”€β”€ UserController.php
    └── Admin/
        β”œβ”€β”€ DashboardController.php
        └── SettingsController.php

You can organize controllers into subdirectories like Auth/, Admin/, or Api/ to separate responsibilities. This is especially useful for larger applications or multi-role setups.

πŸš€ Creating a Basic Controller

Here’s an example of a basic controller class that renders a view:

<?php
namespace Project\Controllers;

use App\Core\View;

class HomeController
{
    public function index()
    {
        return View::render('home.welcome');
    }
}

🧭 Connecting Routes to Controllers

To use a controller in a route, reference it using Controller@method:

$router->add('GET', '/', 'HomeController@index');
$router->add('GET', '/about', 'HomeController@about');

πŸ“‚ Using Controllers from Subdirectories

If your controller is inside a subfolder (e.g. project/Controllers/Admin/DashboardController.php), reference it with a forward slash in your route:

$router->add('GET', '/admin/dashboard', 'Admin/DashboardController@index');

Internally, the controller file should declare its namespace accordingly:

<?php
namespace Project\Controllers\Admin;

use App\Core\View;

class DashboardController
{
    public function index()
    {
        return View::render('admin.dashboard');
    }
}
⚠️ Use forward slashes (/) in route declarations for subdirectories, not backslashes.

πŸ“Œ Route Parameters

Routes that contain parameters (e.g. /user/{id}) automatically pass those values to the controller method:

<?php
namespace Project\Controllers;

use App\Core\View;
use Project\Models\User;

class UserController
{
    public function show($id)
    {
        $user = User::find($id);
        return View::render('user.profile', ['user' => $user]);
    }
}
$router->add('GET', '/user/{id}', 'UserController@show');

πŸ“š Using Models, Views, or Packages

When using models, services, or packages inside your controllers, you must import them via namespaces using the use keyword.

<?php
namespace Project\Controllers;

use App\Core\View;
use Project\Models\User;

class UserController
{
    public function all()
    {
        $users = User::all();
        return View::render('user.list', ['users' => $users]);
    }
}

This applies to any package or custom component installed under project/packages/ as well.

πŸ§ͺ Full Example: Controller + Route + View

Here's a complete example using a controller method and Blade-like view file:

// πŸ“ project/Controllers/UserController.php
namespace Project\Controllers;

use App\Core\View;
use Project\Models\User;

class UserController
{
    public function all()
    {
        $users = User::all();
        return View::render('user.list', ['users' => $users]);
    }
}
// πŸ“ project/Routes/users.php
$router->add('GET', '/users', 'UserController@all');
// πŸ“ views/user/list.squehub.php
@foreach ($users as $user)
  <p>{{ $user['name'] }} - {{ $user['email'] }}</p>
@endforeach

βœ… Recap

  • Controllers live in /project/Controllers/
  • Organize controllers in subfolders like Admin/ or Auth/
  • Reference subfolder controllers using forward slashes in routes
  • Use Controller@method in routes for mapping
  • Import all models, views, and packages using proper use statements
  • Escape Blade syntax in docs with @ and {{ ... }}
;