Ra mắt hai series mới cực hot Trí tuệ nhân tạo A đến ZPython công cụ không thể thiếu khi nghiên cứu Data science, Machine learning.

Laravel session lưu trữ thông tin người dùng

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 Cookie cũng sử dụng để lưu trữ những thông tin người dùng, vậy giữa Laravel Cookie và Laravel Session có gì giống giống nhau và phải chăng Laravel Session là thừa. Không hẳn vậy, Laravel Session giúp chúng ta lưu trữ thông tin được sử dụng ở các trang khác nhau trong cùng website khi người dùng sử dụng, còn Cookie sử dụng khi chúng ta muốn lưu trữ thông tin người dùng ở các lần truy cập website khác nhau. Ví dụ sau giúp bạn hiểu rõ hơn:

  1. Khi người dùng đăng nhập vào hệ thống, các thông tin như trạng thái đăng nhập, tên người dùng, số dư tài khoản ... sẽ cần cho tất cả các yêu cầu sau đó, ví dụ như khi người dùng vào trang thanh toán, vào trang đặt hàng... chúng ta sẽ có sẵn các thông tin cần thiết về người dùng và như vậy chúng ta sẽ dùng Laravel Session cho trường hợp này.
  2. Người dùng gửi comment, khi đó yêu cầu nhập Họ và tên, email, nội dung comment, như vậy nếu một lần sau có thể là vài tuần sau, người dùng muốn gửi comment tiếp thì chúng ta cần ghi nhớ được Họ tên và email để điền sẵn giúp người dùng không cần nhập nữa, ví dụ này chúng ta sử dụng Laravel Session.

Qua hai ví dụ trên có thể thấy 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 (Ví dụ này tôi đưa ra để hiểu thêm về Laravel Session chứ trong Laravel việc quản lý xác thực khá đơn giản và chúng ta sẽ đi chi tiết ở những bài viết khác): Để 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

Trang đăng nhập trong ví dụ Laravel Session

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

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. ## Lời kết

Qua những ví dụ hết sức đơn giản, chúng ta đã hiểu được Laravel Session là gì, cách thức sử dụng như thế nào? Ví dụ về đăng nhập trong bài viết chỉ mang tính minh họa, trong Laravel đã cung cấp những tính năng như Xác thực rất mạnh mẽ, chúng ta sẽ tìm hiểu chủ đề xác thực trong những bài tiếp theo. Các bạn thấy bài viết cần góp ý gì xin để lại comment ở dưới bài, mình rất cám ơn. Chúc các bạn thực hành thành công.


CÁC BÀI VIẾT KHÁC

FirebirD

Đam mê Toán học, Lập trình. Sở thích chia sẻ kiến thức, Phim hài, Bóng đá, Cà phê sáng với bạn bè.

Cơ bản về Vue instance

Laravel Form validation - kiểm soát thông tin nhập liệu

1 Bình luận trong "Laravel session lưu trữ thông tin người dùng"

  1. Pet

    1 year ago

    Phản hồi
    làm cách nào em có thể lưu thông tin trên form nhập vào session id đang hoạt động ạ như đoạn code dưới này function ChangeInfor(Request $Infor_request){ if(session()->get('typeuser')==1){ //Thay đổi thông tin cho người bán session()->put('name') = $Infor_request->input('name'); session()->put('phone') = $Infor_request->input('phone'); session()->put('address') = $Infor_request->input('number_house'); session()->put('ward') = $Infor_request->input('ward'); session()->put('district') = $Infor_request->input('district'); session()->put('city') = $Infor_request->input('city'); session()->save(); return redirect('Information')->with('thongbao','Bạn đã sửa thông tin thành công'); }else if(session()->get('typeuser')==2){ //Thay đổi thông tin cho người mua session()->put('name') = $Infor_request->name; session()->put('phone') = $Infor_request->phone; session()->put('address') = $Infor_request->number_house; session()->put('ward') = $Infor_request->ward; session()->put('district') = $Infor_request->district; session()->put('city') = $Infor_request->city; session()->save(); return redirect('Information')->with('thongbao','Bạn đã sửa thông tin thành công'); }else if(session()->get('typeuser')==3){ //Thay đổi thông tin cho nhân viên session()->put('name') = $Infor_request->name; session()->put('phone') = $Infor_request->phone; session()->put('address') = $Infor_request->number_house; session()->put('ward') = $Infor_request->ward; session()->put('district') = $Infor_request->district; session()->put('city') = $Infor_request->city; session()->save(); return redirect('Information')->with('thongbao','Bạn đã sửa thông tin thành công'); }else return redirect('home'); } em cảm ơn

Thêm bình luận