前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >制作一个PHP简易框架(十)-- Session and Cookie

制作一个PHP简易框架(十)-- Session and Cookie

作者头像
caoayu
发布2021-03-03 15:03:21
3400
发布2021-03-03 15:03:21
举报
文章被收录于专栏:caoayu的分享caoayu的分享
吴孟达
吴孟达

项目地址:https://github.com/ayuayue/php-frame

制作一个PHP简易框架(一)–准备工作

制作一个PHP简易框架(二)– 引入容器

制作一个PHP简易框架(三)– 信息调试

制作一个PHP简易框架(四)– 路由系统

制作一个PHP简易框架(五)– 响应

制作一个PHP简易框架(六)– 视图模板

制作一个PHP简易框架(七)– 路由及路径优化

制作一个PHP简易框架(八)– 配置中心

制作一个PHP简易框架(九)– ORM

制作一个PHP简易框架(十)– Session and Cookie


状态管理

对于一个 web 系统来说,一个用户的状态管理基本是必须的,但由于 http 连接是无法保存状态的,所以 session , cookie 便被设计了出来。

php 默认的 session 存储方式是 文件存储。但对于现代的大型应用,一般都是将 session 存入到 db ,redis 中进行持久化。

项目开启 Session

代码语言:javascript
复制
# bootstrap/app.php
session_save_path(__DIR__ . '../storage/sessions');
session_start();
测试是否开启成功。
代码语言:javascript
复制
# app\Controller\HomeController.php
public function index($request)
    {
        $_SESSION['name'] = config('name');
        dump($_SESSION['name']);
    }

如果获取到 session 说明开启成功。

定义 session 接口

sessin 的存储方式因项目需求可能会改变,所以要定义一个统一的接口,用来规范每个存储类需要完成的操作。

代码语言:javascript
复制
# app\Service\Session\SessionInterface.php
<?php

namespace App\Service;

interface SessionInterface
{
    public function has($key);

    public function set($key,$value);

    public function get($key,$value);

    public function del(...$key);
}

定义文件存储方式,实现接口

代码语言:javascript
复制
# app\Serice\Session\FileSession.php
<?php


namespace App\Service\Session;

class FileSession implements SessionInterface
{

    public function has($key)
    {
        return isset($_SESSION[$key]) && !empty($key);
    }

    public function set($key, $value = null)
    {
        if(is_array($key)){
            foreach ($key as $k=>$v){
                $_SESSION[$k] = $v;
            }
        }else{
            $_SESSION[$key] = $value;
        }
    }

    public function get($key, $default = null)
    {
        if ($this->has($key)){
            return $_SESSION[$key];
        }
        if ($default != null){
            $_SESSION[$key] = $default;
            return $default;
        }else{
            return $default;
        }
    }

    public function del(...$key)
    {
        foreach($key as $v){
             unset($_SESSION[$v])
        }
    }
}

创建 Session 服务提供者

注册到容器中,使用容器统一管理

代码语言:javascript
复制
# app\Providers\SessionServiceProvider.php
<?php


namespace App\Providers;


use App\Service\Session\FileSession;
use League\Container\ServiceProvider\AbstractServiceProvider;

class SessionServiceProvider extends AbstractServiceProvider
{
    protected $provides = [
        'session'
    ];
    public function register()
    {
        $container = $this->getContainer();
        $container->add('session',function(){
            return new FileSession();
        });
    }
}
注册到容器中
代码语言:javascript
复制
# config/app.php
'providers' => [
        App\Providers\AppServiceProvider::class,
        App\Providers\ViewServiceProvider::class,
        App\Providers\DatabaseServiceProvider::class,
        App\Providers\SessionServiceProvider::class,
    ]
调用测试
代码语言:javascript
复制
# app\Controller\HomeController.php
class HomeController
{
    public function index($request)
    {
        dump(app('session')->get('name'));
        return view('index.twig', compact('user'));
    }
}
定义助手函数
代码语言:javascript
复制
# helpers.php
if (!function_exists('session')) {
    function session()
    {
        return app('session');
    }

测试
代码语言:javascript
复制
# app\Controllers\HomeController.php
class HomeController
{
    public function index($request)
    {
        dump(session()->get('name'));
        session()->del('name');
        return view('index.twig', compact('user'));
    }
}

Cookie 服务

有了 session ,就少不了 cookie ,下面来封装 cookie 的方法。

代码语言:javascript
复制
# app\Service\Cookie\Cookie.php
<?php


namespace App\Service\Cookie;


class Cookie
{
    protected $path = '/';
    protected $domain;
    protected $secure = false;
    protected $httponly = true;
    public function set($key,$value = null,$minutes = 120)
    {
        $expires = time() + $minutes *60;
        if (is_array($key)){
            foreach ($key as $k => $v){
                setcookie($k,$v,$expires,$this->path,$this->domain,$this->secure,$this->httponly);
            }
        }else{
            setcookie($key,$value,$expires,$this->path,$this->domain,$this->secure,$this->httponly);
        }
    }
    public function has($key)
    {
        return isset($_COOKIE[$key]) && !empty($key);
    }

    public function get($key,$default = null)
    {
        if ($this->has($key)){
            return $_COOKIE[$key];
        }
        if ($default){
            $this->set($key,$default);
            return $default;
        }else{
            return $default;
        }
    }


    public function forever($key,$value)
    {
        $this->set($key,$value,-3600000000);
    }

    public function del(...$key)
    {
        foreach($key as $v){
            $this->set($v);
        }
    }
}
创建服务提供者并注册到容器
代码语言:javascript
复制
# app\Providers\CookieServiceProvider.php
<?php


namespace App\Providers;


use App\Service\Cookie\Cookie;
use League\Container\ServiceProvider\AbstractServiceProvider;

class CookieServiceProvider extends AbstractServiceProvider
{
    protected $provides = [
        'cookie'
    ];
    public function register()
    {
        $container = $this->getContainer();
        $container->add('cookie',function(){
           return new Cookie();
        });
    }
}
代码语言:javascript
复制
# config/app.php
'providers' => [
        App\Providers\AppServiceProvider::class,
        App\Providers\ViewServiceProvider::class,
        App\Providers\DatabaseServiceProvider::class,
        App\Providers\SessionServiceProvider::class,
        App\Providers\CookieServiceProvider::class,
    ]
创建助手函数
代码语言:javascript
复制
# helpers.php
if (!function_exists('cookie')) {
    function cookie()
    {
        return app('cookie');
    }
}

测试
代码语言:javascript
复制
# app\Controllers\HomeController.php
class HomeController
{
    public function index($request)
    {
        cookie()->set([
            'name'=>'1',
            'a'=>1
        ]);
        cookie()->del('a','name','age');
        $user = 123;
        return view('index.twig', compact('user'));
    }
}

系列完结。

后面有时间可能还会增加第二阶段的文章。主要包括

  1. 用户
  2. 数据验证
  3. 异常处理
  4. 中间件
  5. 网络安全
  6. 重定向
  7. CSRF
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 状态管理
  • 项目开启 Session
    • 测试是否开启成功。
      • 定义 session 接口
      • 创建 Session 服务提供者
        • 注册到容器中
          • 调用测试
            • 定义助手函数
              • 测试
              • Cookie 服务
                • 创建服务提供者并注册到容器
                  • 创建助手函数
                    • 测试
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档