🎮 Controllers
Controllers are regular PHP classes responsible for handling HTTP requests and returning responses to the user.
They help separate application logic: routes define which URL to handle, while the controller determines what to do when that URL is called.
🚀 Quick Start
🔍 Why Use Controllers?
Imagine a user opens the "About Us" page:https://site.com/about
We need to:
- 📥 Catch this request.
- 🧠 Prepare data (e.g., page content).
- 📤 Return an HTML page to the user.
To achieve this, we create:
- 📌 A route – specifies which URL to respond to.
- 🧱 A controller – a class that processes this request.
🛠 Step 1: Create a Route
Open the routes file (e.g., routes/web.php) and add:
Route::get('/about', 'AboutController@index');Here:
/about– the path in the address bar.'AboutController@index'– means: call theindexmethod in theAboutControllerclass.
🧱 Step 2: Create the Controller
Now, let’s create the controller in the App\Http\Controllers folder:
<?php
namespace PageBlocks\App\Http\Controllers;
class AboutController extends Controller
{
public function index()
{
return view('about'); // Render the about.tpl template
}
}What’s happening here:
AboutController– a regular PHP class.index()– the method called when visiting/about.view('about')– returns the HTML templateabout.tpl.
🧠 What Does a Controller Do?
A controller:
- Receives the browser request,
- Executes necessary logic (e.g., fetches data from the database),
- Returns a response – HTML, JSON, or plain text.
It acts like a dispatcher:
Request comes in → Checks what’s needed → Returns the required information.
💡 Example with a Parameter
Suppose we want to display a user by ID:
Route::get('/user/{id}', 'UserController@show');Controller:
class UserController extends Controller
{
public function show($id)
{
return "User with ID: $id";
}
}🧪 Example with a Request and Template
For a contact form submission:
Route::post('/contact', 'ContactController@submit');Controller:
use Boshnik\PageBlocks\Http\Request;
class ContactController extends Controller
{
public function submit(Request $request)
{
$data = $request->validate([
'name' => 'required',
'email' => 'required|email',
]);
// Save or send an email...
return view('contact-success', ['name' => $data['name']]);
}
}📁 Where Controllers Are Stored
By default, controllers are located in:
App\Http\ControllersIf you create an AboutController, its path will be:
/core/App/Http/Controllers/AboutController.php🔗 How to Link Controllers in Routes
PageBlocks supports several ways to connect controllers:
🧾 Via the Controller@method String
Route::get('/about', 'AboutController@index');PageBlocks automatically adds the namespace
App\Http\Controllers.
🧾 Via an Array [Class::class, 'method']
use PageBlocks\App\Http\Controllers\AboutController;
Route::get('/about', [AboutController::class, 'index']);Useful for IDE autocompletion.
🧾 Class Only – __invoke Method
If you connect a controller without specifying a method, it must contain __invoke():
class ContactPageController extends Controller
{
public function __invoke()
{
return view('contact');
}
}Route::get('/contact', ContactPageController::class);Great for single-action pages: "Contacts," "Home," "Thank You."
📥 Dependency Injection
Controllers (and anonymous route functions) can automatically receive dependencies. PageBlocks passes:
- The
Requestobject, - Route parameters (
{id},{slug}, etc.).
📨 Injecting the Request Object
use Boshnik\PageBlocks\Http\Request;
class ContactController extends Controller
{
public function submit(Request $request)
{
$name = $request->input('name');
return response("Hello, $name!");
}
}💡 Works in anonymous functions too:
Route::post('/contact', function (Request $request) {
return response($request->input('name'));
});🧩 Injecting URL Variables
If a route contains variables (e.g., /user/{id}), they are passed to the controller method:
Route::get('/user/{id}', 'UserController@show');class UserController extends Controller
{
public function show(Request $request, $id)
{
return response("User ID: $id");
}
}🔁 Combined Example
Route::get('/order/{id}', 'OrderController@status');class OrderController extends Controller
{
public function status(Request $request, $id)
{
$userAgent = $request->header('User-Agent');
return response("Order #$id. Device: $userAgent");
}
}