Thêm action delete trong Articles controller - cakephp
Lượt xem: 2871
Thêm action delete trong Articles controller - cakephp
Tiếp theo, chúng ta thêm action delete() trong ArticlesController để người dùng có thể xoá bài viết như sau:
// src/Controller/ArticlesController.php
public function delete($slug)
{
$this->request->allowMethod(['post', 'delete']);
$article = $this->Articles->findBySlug($slug)->firstOrFail();
if ($this->Articles->delete($article)) {
$this->Flash->success(__('Bài viết {0} đã được xoá.', $article->title));
return $this->redirect(['action' => 'index']);
}
}
Logic xoá bài viết này được chỉ định bởi $slug và sử dụng $this->Flash->success() để hiển thị cho người dùng thông báo sau khi chuyển hướng tới /articles. Nếu người dùng cố gắng xoá bài viết bằng yêu cầu GET, hàm allowMethod() sẽ đưa ra một ngoại lệ. Các trường hợp ngoại được xử lý bằng trình xử lý ngoại lện của CakePHP và một trang lỗi được hiển thị. Có nhiều ngoại lệ tích hợp có thể sử dụng để chi ra các lỗi HTTP khác nhau mà ứng dụng của bạn có thể cần tạo ra.
Lưu ý:
Cho phép xoá nội dung bằng các yêu cầu GET là rất nguy hiểm, vì trình thu thập dữ liệu web có thể vô tình xoá tất cả các nội dung của bạn.
Đó là lý do tại sao chúng ta sử dụng hàm allowMethod() trong controller
Bởi vì chúng ta chỉ thực hiện logic và chuyển hướng sang action khác và action này không có template. Bây giờ chúng ta cập nhật lại template của action index như sau cho phép người dùng sử dụng link để xoá bài viết.
<!-- File: src/Template/Articles/index.ctp (delete links added) --> <h1>Bài viết</h1> <p>Html->link("Add Article", ['action' => 'add']) ?>> <table> <tr> <th>Tiêu đề</th> <th>Created</th> <th>Action</th> </tr< >!-- Đây là nơi chúng tôi lặp lại thông qua đối tượng truy vấn $ article, in ra thông tin bài viết --> <?php foreach ($articles as $article): ?> <tr> <td> <?= $this->Html->link($article->title, ['action' => 'view', $article->slug]) ?> </td> <td> <?= $article->created->format(DATE_RFC850) ?> </td> <td> <?= $this->Html->link('Edit', ['action' => 'edit', $article->slug]) ?> <?= $this->Form->postLink( 'Delete', ['action' => 'delete', $article->slug], ['confirm' => 'Are you sure?']) ?> </td> <tr> <?php endforeach; ?> </table>
Sử dụng View\Helper\FormHelper::postLink() sẽ tạo một liên kết sử dụng JavaScript để thực hiện yêu cầu POST xóa bài viết của chúng tôi.
Lưu ý:
Mã xem này cũng sử dụng FormHelper để nhắc người dùng bằng hộp thoại xác nhận JavaScript trước khi họ cố gắng xóa một bài viết.
Video
Nguồn: https://book.cakephp.org/3.0/en/quickstart.html