45 phút
Giới thiệu CodeIgniter 4
CodeIgniter là gì?
CodeIgniter là framework PHP nhẹ, nhanh, dễ học, được nhiều developer Việt Nam sử dụng.
Ưu điểm
- Nhẹ và nhanh: Ít overhead
- Dễ học: Documentation rõ ràng
- MVC pattern: Quen thuộc với nhiều developer
- Không cần Composer bắt buộc: Có thể download zip
- Built-in security: CSRF, XSS protection
- ORM đơn giản: Query Builder
Cài đặt
Yêu cầu
- PHP 8.1+
- Extensions: intl, mbstring, json, mysqlnd (hoặc pdo)
Cài đặt với Composer
composer create-project codeigniter4/appstarter myapp
cd myapp
Cấu hình
# Copy env file
cp env .env
# Generate encryption key
php spark key:generate
Chạy development server
php spark serve
# Mở http://localhost:8080
Cấu trúc project
myapp/
├── app/
│ ├── Config/
│ ├── Controllers/
│ ├── Database/
│ │ ├── Migrations/
│ │ └── Seeds/
│ ├── Filters/
│ ├── Models/
│ ├── Views/
│ ├── Helpers/
│ └── Libraries/
├── public/
│ ├── index.php
│ └── .htaccess
├── system/
├── tests/
├── vendor/
├── writable/
├── .env
├── composer.json
└── spark
Controller đầu tiên
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class Blog extends BaseController
{
public function index(): string
{
$data = [
'title' => 'My Blog',
'posts' => [
['id' => 1, 'title' => 'First post', 'content' => 'Hello world'],
['id' => 2, 'title' => 'Second post', 'content' => 'Another one'],
],
];
return view('blog/index', $data);
}
public function view(int $id): string
{
return "Post ID: $id";
}
public function api(): \CodeIgniter\HTTP\ResponseInterface
{
return $this->response->setJSON([
'status' => 'ok',
'data' => ['message' => 'Hello from API'],
]);
}
}
Routing
<?php
// app/Config/Routes.php
$routes->get('/', 'Home::index');
$routes->get('blog', 'Blog::index');
$routes->get('blog/(:num)', 'Blog::view/$1');
$routes->group('api/v1', ['namespace' => 'App\Controllers\Api'], function ($routes) {
$routes->get('posts', 'PostController::index');
$routes->get('posts/(:num)', 'PostController::show/$1');
$routes->post('posts', 'PostController::create');
$routes->put('posts/(:num)', 'PostController::update/$1');
$routes->delete('posts/(:num)', 'PostController::delete/$1');
});
Views với Template
<!-- app/Views/blog/index.php -->
<!DOCTYPE html>
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($title) ?></h1>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<a href="/blog/<?= $post['id'] ?>"><?= esc($post['title']) ?></a>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
Base Controller với Helpers
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
abstract class BaseController extends Controller
{
protected $helpers = ['form', 'url', 'text'];
protected array $data = [];
public function initController(
\CodeIgniter\HTTP\RequestInterface $request,
\CodeIgniter\HTTP\ResponseInterface $response,
\Psr\Log\LoggerInterface $logger
): void {
parent::initController($request, $response, $logger);
$this->data['title'] = 'My App';
}
}
Bài tập thực hành
Hãy tạo controller và views đầu tiên!