Tuỳ chỉnh code sau khi sử dụng Bake trong CakePHP

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 19 tháng 1, 2025

Tuỳ chỉnh code sau khi sử dụng Bake trong CakePHP

Sau khi sử dụng lệnh Bake để tự động tạo các thành phần như Model, Controller và View, bạn có thể thực hiện một số tuỳ chỉnh để phù hợp hơn với yêu cầu của dự án.

1. Tuỳ chỉnh Model

Model bao gồm hai thành phần chính:

  • Table class: Định nghĩa các quy tắc, quan hệ, và các logic liên quan đến bảng.
  • Entity class: Xử lý dữ liệu của một bản ghi (record).

1.1. Tuỳ chỉnh Table class

File: src/Model/Table/<TênBảng>Table.php

Ví dụ, sau khi tạo bằng lệnh:

bin/cake bake model lessons

Sẽ tạo file LessonsTable.php. Bạn có thể tuỳ chỉnh như sau:

  • Thêm quy tắc xác thực (Validation):
public function validationDefault(Validator $validator): Validator
{
    $validator
        ->notEmptyString('title', 'Title cannot be empty')
        ->maxLength('title', 255, 'Title must not exceed 255 characters')
        ->allowEmptyString('description');

    return $validator;
}
  • Định nghĩa quan hệ giữa các bảng: Nếu bảng lessons liên kết với bảng users qua user_id, bạn có thể định nghĩa quan hệ như sau:
$this->belongsTo('Users', [
    'foreignKey' => 'user_id',
    'joinType' => 'INNER',
]);

1.2. Tuỳ chỉnh Entity class

File: src/Model/Entity/<TênBảnGhi>.php

Ví dụ: Lesson.php

Bạn có thể tuỳ chỉnh các thuộc tính có thể được gán hàng loạt:

protected $_accessible = [
    '*' => true, // Cho phép tất cả các trường được gán
    'id' => false, // Ngoại trừ trường id
];

Hoặc thêm các phương thức định dạng dữ liệu:

protected function _getTitleWithDate()
{
    return $this->title . ' (' . $this->created->format('Y-m-d') . ')';
}

2. Tuỳ chỉnh Controller

File: src/Controller/<TênController>Controller.php

Sau khi tạo bằng lệnh:

bin/cake bake controller lessons

Sẽ tạo file LessonsController.php.

2.1. Thêm logic trong các action

Mặc định, các action như index, view, add, edit, và delete được tạo với logic cơ bản. Bạn có thể bổ sung logic riêng:

Ví dụ, thêm logic sắp xếp trong action index:

public function index()
{
    $this->paginate = [
        'order' => ['Lessons.created' => 'DESC'],
        'limit' => 10,
    ];
    $lessons = $this->paginate($this->Lessons);

    $this->set(compact('lessons'));
}

2.2. Thêm middleware hoặc kiểm tra quyền truy cập

Bạn có thể sử dụng beforeFilter để kiểm tra quyền:

public function beforeFilter(\Cake\Event\EventInterface $event)
{
    parent::beforeFilter($event);
    // Cho phép truy cập action 'index' mà không cần đăng nhập
    $this->Authentication->allowUnauthenticated(['index']);
}

3. Tuỳ chỉnh View

Các file View được lưu trong thư mục: src/Template/<TênBảng>/.

3.1. Sửa file View

Ví dụ, file index.php:

<h1>Danh sách bài học</h1>
<table>
    <thead>
        <tr>
            <th>Tiêu đề</th>
            <th>Mô tả</th>
            <th>Ngày tạo</th>
            <th>Hành động</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($lessons as $lesson): ?>
        <tr>
            <td><?= h($lesson->title) ?></td>
            <td><?= h($lesson->description) ?></td>
            <td><?= h($lesson->created->format('d/m/Y')) ?></td>
            <td>
                <?= $this->Html->link('Xem', ['action' => 'view', $lesson->id]) ?>
                <?= $this->Html->link('Sửa', ['action' => 'edit', $lesson->id]) ?>
                <?= $this->Form->postLink('Xoá', ['action' => 'delete', $lesson->id], ['confirm' => 'Bạn có chắc chắn muốn xoá?']) ?>
            </td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

3.2. Tạo các phần dùng chung

Nếu có các thành phần giao diện dùng chung, hãy tạo file Element. Ví dụ: Tạo file src/Template/Element/lesson_card.php:

<div class="lesson-card">
    <h3><?= h($lesson->title) ?></h3>
    <p><?= h($lesson->description) ?></p>
</div>

Sử dụng trong View:

<?= $this->element('lesson_card', ['lesson' => $lesson]) ?>

4. Tuỳ chỉnh Routing

Mặc định, CakePHP tự động tạo URL dựa trên Controller và action. Tuy nhiên, bạn có thể tuỳ chỉnh trong file config/routes.php:

Ví dụ, tạo URL thân thiện:

$routes->connect('/lessons/:id', ['controller' => 'Lessons', 'action' => 'view'], ['pass' => ['id'], 'id' => '\d+']);

Kết luận

Sử dụng lệnh Bake chỉ là bước khởi đầu, giúp bạn tiết kiệm thời gian tạo code cơ bản. Sau đó, bạn có thể tuỳ chỉnh các thành phần (Model, Controller, View) để đáp ứng nhu cầu cụ thể của dự án. Hãy tận dụng sức mạnh của CakePHP để tạo ra các ứng dụng linh hoạt và hiệu quả!

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ