HTTP là giao thức không lưu giữ trạng thái (stateless), tức là các request sẽ độc lập với nhau, mỗi một phiên sẽ bao gồm một cặp request và response. Giao thức HTTP không yêu cầu máy chủ lưu trữ thông tin và trạng thái phiên làm việc. Khi các ứng dung web có nhiều các tính năng hơn như xác thực hoặc người phát triển mong muốn thu thập nhiều thông tin hơn từ người dùng, thông tin trao đổi giữa các request là cần thiết.

Laravel Session cho phép bạn lưu trữ thông tin người dùng thông qua các request (các trang của một website) khác nhau với nhiều cách thức lưu trữ như file, cookie, Memcached, Redis hoặc cả database. Mặc định thông tin lưu trữ trong file, cấu hình cách thức lưu trữ có trong config/session.php.

Laravel Session sử dụng cho các dữ liệu cần trong một phiên làm việc, khi hết phiên (thoát ra khỏi trang) thì các dữ liệu này sẽ không còn hiệu lực, còn với Laravel Cookie sử dụng để lưu các thông tin lâu hơn cỡ hàng ngày, tuần, tháng…

Làm việc với Laravel Session chúng ta chỉ cần quan tâm đến 3 việc là: lưu dữ liệu vào phiên, lấy dữ liệu ra từ phiên làm việc và xóa một dữ liệu khỏi phiên làm việc.

Truy xuất dữ liệu Laravel Session

Để lấy dữ liệu của phiên làm việc chúng ta cần một instance của phiên làm việc và sử dụng phương thức get với tham số vào là tên dữ liệu:

$value = $request->session()->get('key');

Có thể sử dụng phương thức all() để lấy tất cả dữ liệu từ phiên làm việc. Để kiểm tra xem một dữ liệu có tồn tại trong phiên không chúng ta sử dụng phương thức has():

if ($request->session()->has('users')) {
    //
}

Lưu dữ liệu vào Laravel Session

Để lưu dữ liệu vào phiên chúng ta sử dụng phương thức put(), phương thức này có hai tham số đầu vào là tên và giá trị:

$request->session()->put('key', 'value');

Xóa một dữ liệu khỏi Laravel Session

Phương thức forget() được sử dụng để xóa dữ liệu khỏi phiên, tham số đầu vào là tên dữ liệu.

$request->session()->forget('key');

để xóa toàn bộ các dữ liệu khỏi phiên chúng ta sử dụng phương thức flush(). Có một phương thức khác giống forget() là pull(), phương thức này cũng xóa dữ liệu khỏi session nhưng trước đó nó trả về giá trị của dữ liệu.

Ví dụ về Laravel Session

Chúng ta cùng nhau thực hành một ví dụ về Laravel Session, các ví dụ thực tế giúp chúng ta hiểu về các khái niệm cũng như cách thức sử dụng tốt hơn nhiều. Ví du: khi đăng nhập xong thì phía trên menu xuất hiện thêm một menu thiết lập thông tin của người dùng

Để cho nhanh chúng ta sẽ bỏ qua các Controller mà viết code thẳng trong các route, sau khóa học này chúng ta sẽ thực hiện một project nhỏ, khi đó chúng ta sẽ sử dụng đầy đủ các thành phần.

Tạo một route trong routes/web.php

Route::get('login', function(){
  return ``view('fontend.login');
});

Tạo một view login.blade.php trong resources/views/fontend

@extends('layouts.default')

@section('title', 'Đăng nhập')

@section('content')
    @if(isset($success))
        <div class="alert alert-success" role="alert">{{ $success }}</div>
    @endif
    @if(isset($fail))
        <div class="alert alert-danger" role="alert">{{ $fail }}</div>
    @endif

    {!! Form::open(array('url' => '/login', 'class' => 'form-horizontal')) !!}
      <div class="form-group">
         {!! Form::label('username', 'Username', array('class' => 'col-sm-2 control-label')) !!}
         <div class="col-sm-10">
            {!! Form::text('username', '', array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('password', 'Password', array('class' => 'col-sm-2 control-label')) !!}
         <div class="col-sm-10">
            {!! Form::password('password', array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         <div class="col-sm-offset-2 col-sm-10">
            {!! Form::submit('Login', array('class' => 'btn btn-success')) !!}
         </div>
      </div>
   {!! Form::close() !!}
@endsection

Blade template default được tạo ra trong bài Laravel Blade, trong code có sử dụng Laravel HTML, bạn nên xem lại 2 bài này để hiểu hơn về đoạn code trên nhé. Ok, như vậy đã xong phần form đăng nhập, chúng ta truy cập http://laravel.dev/login

Tìm hiểu về Laravel session image 1

Username và password được lưu trữ trong database nhưng trong ví dụ này do chưa đến phần kiến thức làm việc với database chúng ta giả sử username là admin, password là 123456. Chúng ta sẽ xử lý phương thức POST khi nhập dữ liệu vào form đăng nhập và click vào Login.

Route::post('login', function(){
    $username = Request::input('username');
    $password = Request::input('password');
    if($username == 'admin' && $password == '123456'){
        Request::session()->put('login', true);
        Request::session()->put('name', 'Nguyễn Văn A');
        return view('fontend.login')->with('success', 'Đăng nhập thành công.');
    } else {
        return view('fontend.login')->with('fail', 'Đăng nhập không thành công, sai username hoặc password.');
    }

});

Route::get('logout', function(){
    Request::session()->flush();
    return view('fontend.login');
});

Khi gửi thông tin đăng nhập lên http://laravel.dev/login theo phương thức POST, chúng ta lấy thông tin ra và kiểm tra xem username có phải là admin và password có phải là 123456 như giả định ở trên không. Nếu đúng thông tin đăng nhập thì đặt vào session một biến tên login có giá trị là true và biến name có giá trị là Nguyễn Văn A để sử dụng cho các trang khác.

Chúng ta cũng tạo luôn trang logout để người dùng đăng xuất khỏi hệ thống, khi đăng xuất các thông tin người dùng sẽ được xóa khỏi session.

Ok, giờ chúng ta đã có thể đăng nhập và đăng xuất khỏi hệ thống, giờ chúng ta muốn là khi đăng nhập thì trên menu sẽ xuất hiện menu chứa link để đăng xuất và tên người dùng. Phần layout cho menu nằm trong file resources/views/layouts/menu.php, chúng ta sửa lại như sau:

<!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="/">All Laravel TEnv</a>
            </div>
            <div id="navbar" class="collapse navbar-collapse">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="/">Trang chủ</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Ví dụ <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="/first-blade-example">Ví dụ Blade 1</a></li>
                            <li><a href="/second-blade-example">Ví dụ Blade 2</a></li>
                        </ul>
                    </li>
                    <li><a href="/contact">Liên hệ</a></li>
                    @if(Session::has('login') && Session::get('login') == true)
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Xin chào {{ Session::get('name') }} <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="/logout">Đăng xuất</a></li>
                        </ul>
                    </li>
                    @endif
                </ul>
            </div><!--/.nav-collapse -->
        </div>
    </nav>

Ví dụ sử dụng Laravel session trong đăng nhập hệ thống

Tìm hiểu về Laravel session image 1

Chúng ta thử click vào Đăng xuất, khi đó menu về người dùng sẽ biến mất trên hệ thống menu.

Viết câu trả lời

Drop Images

0 Bình luận