Thêm action add trong ArticlesController

Lượt xem: 2373

Thêm action add trong ArticlesController

Với các chế độ cơ bản như độc xem và tạo, chúng ta cần tạo điều kiện cho bài viết mới được tạo. Bắt đầu bằng cách tạo action add() trong ArticlesController. Bộ điều khiển (controller) của chúng ta sẽ trông giống như sau:


 // src/Controller/ArticlesController.php

namespace App\Controller;

use App\Controller\AppController;

class ArticlesController extends AppController
{

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('Paginator');
        $this->loadComponent('Flash'); // Include the FlashComponent
    }

    public function index()
    {
        $articles = $this->Paginator->paginate($this->Articles->find());
        $this->set(compact('articles'));
    }

    public function view($slug)
    {
        $article = $this->Articles->findBySlug($slug)->firstOrFail();
        $this->set(compact('article'));
    }

    public function add()
    {
        $article = $this->Articles->newEntity();
        if ($this->request->is('post')) {
            $article = $this->Articles->patchEntity($article, $this->request->getData());

            // Mã hóa user_id là tạm thời và sẽ bị xóa sau
            // khi chúng tôi xây dựng xác thực.
            $article->user_id = 1;

            if ($this->Articles->save($article)) {
                $this->Flash->success(__('Bài viết của bạn đã được lưu.'));
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('Không thể thêm bài viết của bạn.'));
        }
        $this->set('article', $article);
    }
}

Chú ý: Bạn cần bao gồm (include) thành phần Flash trong bất kỳ controller nào mà bạn sử dụng. Thường thì đưa nó vào AppController là hợp lý.

Đây là những gì hành động add () thực hiện:

- Nếu phương thức HTTP của yêu cầu là POST, hãy thử lưu dữ liệu bằng Articles model.

- Nếu vì lý do nào đó, nó không lưu, chỉ hiển thị chế độ xem. Điều này sẽ hiển thị các lỗi xác thực người dùng hoặc các cảnh báo khác cho chúng ta.

Mỗi yêu cầu CakePHP bao gồm một đối tượng yêu cầu có thể truy cập bằng cách sử dụng $this-> request. Đối tượng yêu cầu chứa thông tin liên quan đến yêu cầu vừa nhận được. Chúng ta sử dụng phương thức Cake\http\ServerRequest :: is() để kiểm tra xem yêu cầu có phải là yêu cầu HTTP POST không.

Dữ liệu POST của chúng ta có trong $this->request->getData(). Bạn có thể sử dụng các hàm pr() hoặc debug() để in ra nếu bạn muốn xem nó trông như thế nào. Để lưu dữ liệu, trước tiên, chúng tôi sẽ sắp xếp dữ liệu POST vào Articles Entity. Thực thể (Entity) sau đó được duy trì bằng cách sử dụng ArticleTable mà chúng ta đã tạo trước đó.

Sau khi lưu bài viết mới CakePHP sửa dụng FlashComponent’s  với hàm success() để thiết lập môt thông báo vào phiên làm việc (session). Hàm success được cung cấp sử dụng tính năng kỳ diệu của PHP. Thông điệp (message) flash sẽ được hiển thị trên trang tiếp theo sau khi chuyển hướng. Trong layouts chúng ta có Flash->render() ?> hiển thị các thông báo flash và xoá các biến tương ứng. Cuối cùng sau khi lưu hoàn thành và sử dụng.

Cake\Controller\Controller::redirect để đưa người dùng trở lại danh sách bài viết. Tham số ['action' => 'index'] dịch sang URL / bài viết tức là hành động chỉ mục của ArticleContoder. Bạn có thể tham khảo chức năng Cake\ Routing\Router::url () trên API để xem các định dạng mà bạn có thể chỉ định URL cho các chức năng CakePHP khác nhau.

Video