Ngu ngơ học làm web (x31) - CakePHP2 - beforeFilter, lấy thông tin user, virtualFields

Tiếp theo của: Ngu ngơ học làm web (x30) - CakePHP2 – Auth, đăng nhập, đăng xuất
-----

Phần x31. CakePHP2 – beforeFilter, lấy thông tin user, virtualFields


Xem (clip số 33b – chickenrainshop):

- Lọc các action không yêu cầu đăng nhập

- Sử dụng Auth->allow, beforeFilter (3":21)

- Sử dụng parent để không ghi đè hàm cha (8":15)

Mặc định AuthComponent sẽ tác động lên mọi action trong mọi controller của project. Nghĩa là người dùng vào bất kì trang nào, hoặc sử dụng bất kì chức năng nào của website, nó cũng bắt phải đăng nhập; hay nói cách khác mọi thao tác đều phải đăng nhập để hệ thống kiểm soát.

Tuy nhiên, trong thực tế, sẽ có những trang, những action không nhất thiết phải đăng nhập mới sử dụng được. Vì vậy, cần phải khai báo để website bỏ qua yêu cầu chứng thực đối với các trường hợp này. Khai báo trong hàm beforeFilter.

Đọc thêm về hàm beforeFilter tại đây: https://book.cakephp.org/2.0/en/controllers.html

[This function is executed before every action in the controller. It’s a handy place to check for an active session or inspect user permissions.

The beforeFilter() method will be called for missing actions, and scaffolded actions.]

Hàm beforeFilter được thực thi trước mọi action trong controller.

Trong hàm beforeFilter, sử dụng hàm $this->Auth->allow(); để liệt kê các action mà người sử dụng có thể dùng mà không cần đăng nhập. Ví dụ,

[AppController.php]

public function beforeFilter() {
                        $this->Auth->allow('menu', 'index');
            }

Do action ‘menu’, ‘index’ được chỉ định trong AppController, nên chỉ định này sẽ áp dụng cho mọi action ‘menu’, ‘index’ của mọi controller là con của AppController.

Nếu chỉ muốn thiết lập cho một controller cụ thể thì viết thêm hàm beforeFilter trong chính controller đó, và nhớ thêm dòng mã:

parent::beforeFilter();

để thực thi các nội dung được thiết lập tại hàm beforeFilter trong AppController. Ví dụ,

[CouponsController.php]

            public function beforeFilter() {
                        parent::beforeFilter();
                        $this->Auth->allow('add');
            }

Xem (clip số 34a – chickenrainshop):

Sau khi người dùng đăng nhập thành công, thông tin người dùng sẽ được lưu trong AuthComponent.
Để kiểm tra người dùng đăng nhập hay chưa? Sử dụng hàm:

$this->Auth->login()

Để lấy thông tin người dùng, sử dụng hàm:

$this->Auth->user();

Nội dung hàm lấy thông tin người dùng, trong AppController.php:

public function getUser() {
                        // kiểm tra người dùng đăng nhập hay chưa?
                        if ($this->Auth->login()) {
                                    // trả về thông tin người dùng
                                    return $this->Auth->user();
                        }
            }

Để gửi thông tin người dùng đã đăng nhập tới tất cả các view, sẽ thực hiện trong hàm beforeFilter tại AppController.php:

public function beforeFilter() {
                        $this->Auth->allow('menu', 'index');
                        $this->set('userInfo', $this->getUser());
            }

Trong các view, để kiểm tra xem người dùng đã đăng nhập hay chưa, sẽ kiểm tra biến userInfo:

[View\Layouts\default.ctp]

<!-- sidebar -->
<div class="sidebar col col-lg-3">
<!-- user panel -->
<?php if (!empty($userInfo)): ?>
            <div class="panel panel-info">
                        <h4 class="panel-heading"><span class="glyphicon glyphicon-user"></span><small> Xin chào <strong><?php echo $userInfo['username']; ?></strong></small></h4>
                        <ul>
                                    <li><a href="">Cập nhật thông tin</a></li>
                                    <li><a href="">Đổi mật khẩu</a></li>
                                    <li><a href="">Lịch sử mua hàng</a></li>
                                    <li><a href="">Đăng xuất</a></li>
                        </ul>
            </div>
<?php else: ?>
            <div class="panel panel-info">
                        <h4 class="panel-heading"><span class="glyphicon glyphicon-user"></span><small> Xin chào <strong>khách</strong></small></h4>
                        Nhấn vào <?php echo $this->Html->link('đây','/login'); ?> để đăng nhập.
            </div>
<?php endif ?>                      
<!-- /user panel -->

Thiết lập virtualFields:

Đọc thêm về virtualFields tại đây: https://book.cakephp.org/2.0/en/models/virtual-fields.html

VirtualFields cho phép tạo một tên trường ảo cho Model, tuy nhiên chỉ có thể đọc (read) dữ liệu từ trường này chứ không thể lưu xuống cơ sở dữ liệu (save).

Khai báo virtualFields trong model User:

[Model\User.php]

class User extends AppModel {
            public $virtualFields = [
                        'fullname' => 'concat(User.lastname, " ", User.firstname)'
            ];

Hàm concat để nối chuỗi.

Gọi ra sử dụng trong view:

[default.ctp]

<h4 class="panel-heading"><span class="glyphicon glyphicon-user"></span><small> Xin chào <strong><?php echo $userInfo['fullname']; ?></strong></small></h4>
            <ul>

                        <li><a href="">Cập nhật thông tin</a></li>
-----------
Cập nhật 22/6/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web