Skip to content

Sử dụng Agentic IDE với dự án CakePHP

Agentic IDE giúp đơn giản hóa và tăng tốc quá trình làm việc với CakePHP, một framework có nhiều quy ước và cấu trúc đặc thù.

1. Viết Document cho Action

Với một action trong Controller, bạn có thể yêu cầu Agentic IDE tạo DocBlock để làm rõ chức năng và các tham số.

"prompt: Tạo DocBlock cho Action"

Tạo DocBlock cho action view trong ArticlesController. Action này nhận một tham số $slug. Cần mô tả chức năng, tham số, exception có thể xảy ra (NotFoundException), và kiểu dữ liệu trả về.

Ví dụ Agentic IDE thực hiện:

php
class ArticlesController extends AppController
{
    /**
     * Hiển thị một bài viết dựa trên slug.
     *
     * @param string|null $slug The article slug.
     * @return \Cake\Http\Response|null
     * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
     */
    public function view($slug = null)
    {
        $article = $this->Articles->findBySlug($slug)->firstOrFail();
        $this->set(compact('article'));
    }
}

2. Điều tra kiến trúc hệ thống

Hiểu các mối quan hệ và cấu trúc của một dự án CakePHP hiện có.

"prompt: Điều tra kiến trúc hệ thống"

Phân tích dự án CakePHP này. Liệt kê các Plugin đã được load, các Component và Helper được sử dụng trong AppController. Vẽ biểu đồ Mermaid thể hiện mối quan hệ giữa các table: users, articles, và tags (quan hệ many-to-many).

Ví dụ Agentic IDE thực hiện:

Plugins đã load:

  • Authentication
  • Authorization
  • Migrations
  • DebugKit

Components trong AppController:

  • FlashComponent
  • Authentication.Authentication

Helpers trong AppController:

  • FormHelper
  • HtmlHelper
  • UrlHelper

Biểu đồ quan hệ Tables:

3. Debug lỗi

Agentic IDE có thể nhanh chóng xác định nguyên nhân của các lỗi phổ biến trong CakePHP.

"prompt: Debug lỗi không tìm thấy Table class"

Lỗi "Table class for alias Authors could not be found" xảy ra khi tôi cố gắng truy vấn $this->Articles->find()->contain(['Authors']). Phân tích và chỉ ra nguyên nhân. Đề xuất cách sửa.

Ví dụ Agentic IDE thực hiện:

Phân tích: Lỗi này xảy ra vì CakePHP không tìm thấy class AuthorsTable. Nguyên nhân thường là do có sự không nhất quán trong quy ước đặt tên. Tên của association phải là Authors (số nhiều), tương ứng với AuthorsTable, nhưng có thể bạn đã đặt tên bảng hoặc model là Author (số ít).

Cách sửa đề xuất:

  1. Kiểm tra tên association: Đảm bảo rằng trong ArticlesTable.php, association được định nghĩa đúng:

    php
    // In src/Model/Table/ArticlesTable.php
    public function initialize(array $config): void
    {
        parent::initialize($config);
        $this->belongsTo('Authors', [ 
            'foreignKey' => 'author_id',
        ]);
    }
  2. Đổi tên association trong câu lệnh contain: Nếu bạn muốn giữ tên association là Author (số ít), bạn cần cập nhật lại câu lệnh:

    php
    $query = $this->Articles->find()->contain(['Author']); 

4. Phát triển tính năng mới

Yêu cầu Agentic IDE tạo code cho một tính năng tìm kiếm đơn giản.

"prompt: Phát triển tính năng tìm kiếm"

Tạo tính năng tìm kiếm bài viết trong ArticlesController@index.

  1. Thêm một form tìm kiếm trong file template index.php.
  2. Cập nhật action index để lọc các bài viết dựa trên query param ?q=.
  3. Việc tìm kiếm nên dựa trên cả titlebody của bài viết.

Ví dụ Agentic IDE thực hiện:

1. Cập nhật templates/Articles/index.php:

php
<?= $this->Form->create(null, ['type' => 'get']) ?>
<?= $this->Form->control('q', ['label' => 'Search', 'value' => $this->request->getQuery('q')]) ?>
<?= $this->Form->button(__('Search')) ?>
<?= $this->Form->end() ?>

2. Cập nhật src/Controller/ArticlesController.php:

php
public function index()
{
    $this->paginate = [
        'contain' => ['Users'],
    ];
    $query = $this->Articles->find();

    $searchQuery = $this->request->getQuery('q');
    if ($searchQuery) { 
        $query->where([
            'OR' => [
                'Articles.title LIKE' => '%' . $searchQuery . '%',
                'Articles.body LIKE' => '%' . $searchQuery . '%',
            ]
        ]);
    }

    $articles = $this->paginate($query);
    $this->set(compact('articles'));
}