π§ 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
).
π 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');
}
}
/
) 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/
orAuth/
- 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{{ ... }}