• 技术文章 >后端开发 >PHP问题

    php怎么实现关注功能

    藏色散人藏色散人2021-11-19 09:34:12原创67

    php实现关注功能的方法:1、创建控制层实现代码“namespace App\Controller\Test...”;2、设计服务层实现代码“namespace App\Service\Ptg...”;3、设置好仓储层代码即可。

    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑

    php怎么实现关注功能?

    php + redis 实现关注功能:

    产品价值

    1: 关注功能
    2: 功能分析之“关注”功能
    3: 平平无奇的「关注」功能,背后有4点重大价值

    应用场景

    在做PC或者APP端时,掺杂点社交概念就有关注和粉丝功能;
    数据量小的话数据库还能支持,如果数据量很庞大还是用缓存比较好。

    具体实现

    1 控制层实现

    <?php
    
    namespace App\Controller\Test;
    
    use App\Controller\AbstractController;
    use App\Service\Ptg\TestFollowService;
    use Hyperf\Di\Annotation\Inject;
    use Hyperf\HttpServer\Annotation\Controller;
    use Hyperf\HttpServer\Annotation\Middleware;
    use Hyperf\HttpServer\Annotation\RequestMapping;
    
    /**
     * 测试 - 关注
     * Class TestFollowController
     * @package App\Controller
     * @Controller(prefix="test")
     */
    class TestFollowController extends AbstractController
    {
        /**
         * 服务层 - 关注
         * @Inject()
         * @var TestFollowService
         */
        protected $testFollowService;
    
        /**
         * 关注/取消关注
         * @param Request $request
         * @return mixed
         */
        public function follow(Request $request)
        {
            $type = $request->input('type', 'follow');         // 1-关注-follow 2-取消关注-remove
            $userId = $request->input('user_id', 0);    // 我的用户ID
            $otherId = $request->input('other_id', 0);  // 我关注的用户ID
            if ($userId == $otherId) {
                return $this->response->apiResponse();
            }
            $this->testFollowService->follow($type, $userId, $otherId);
            return $this->response->apiResponse();
        }
    
        /**
         * 我的关注/粉丝
         * @param Request $request
         * @return mixed
         */
        public function myFollowAndFans(Request $request)
        {
            $type = $request->input('type', 'follow');  // 1-关注-follow 2-粉丝-fans
            $userId = $request->input('user_id', 0);    // 我的用户ID
            $page = $request->input('page', 1);         // 页码
            $limit = $request->input('limit', 10);      // 每页显示条数
            $res = $this->testFollowService->myFollowAndFans($userId, $type, $page, $limit);
            return $this->response->apiResponse($res);
        }
    }
    ?>

    2 服务层实现

    <?php
    
    namespace App\Service\Ptg;
    
    use App\Repository\Redis\TestFollowRedis;
    use App\Service\AbstractService;
    use Hyperf\Di\Annotation\Inject;
    
    class TestFollowService extends AbstractService
    {
        /**
         * 仓储层 - 关注
         * @Inject()
         * @var TestFollowRedis
         */
        protected $testFollowRedis;
    
        /**
         * 关注/取消关注
         * @param string $type
         * @param int $userId
         * @param int $otherId
         * @return mixed
         */
        public function follow($type = 'follow', int $userId, int $otherId)
        {
            // 关注
            if ($type === 'follow') {
                // 先处理 mysql
                // TODO mysql 操作
                // 然后处理 redis
                $this->testFollowRedis->zAddFollow($userId, $otherId);
                $this->testFollowRedis->zAddFans($otherId, $userId);
            }
            // 取消关注
            if ($type === 'remove') {
                // 先处理 mysql
                // TODO mysql 操作
                // 然后处理 redis
                $this->testFollowRedis->zRemFollow($userId, $otherId);
                $this->testFollowRedis->zRemFans($otherId, $userId);
            }
        }
    
        /**
         * 我的关注/粉丝
         * @param int $userId 当前登录用户的ID
         * @param string $type 要获取的数据
         * @param int $page 页码
         * @param int $limit 限制条数
         * @return array
         */
        public function myFollowAndFans(int $userId, $type = 'follow', $page = 1, $limit = 10)
        {
            $start = $limit * ($page - 1);
            $end = $start + $limit - 1;
            $res = [];
            if ($type === 'follow') {
                $res = $this->testFollowRedis->zRangeFollow($userId, $start, $end);
            }
            if ($type === 'fans') {
                $res = $this->testFollowRedis->zRangeFans($userId, $start, $end);
            }
            return $res;
        }
    }
    ?>

    仓储层实现【推荐:PHP视频教程

    <?php
    
    namespace App\Repository\Redis;
    
    class TestFollowRedis extends AbstractRedis
    {
        /**
         * 关注key
         * @var string
         */
        private $followKey = '%u:follow';
    
        /**
         * 粉丝key
         * @var string
         */
        private $fansKey = '%u:fans';
    
        /**
         * 前缀
         */
        public function initPrefix()
        {
            return 'follow:';
        }
    
        /**
         * 增加关注
         * @param $userId
         * @param $otherId
         */
        public function zAddFollow($userId, $otherId)
        {
            $this->redis->zAdd(sprintf($this->prefix . $this->followKey, $userId), time(), $otherId);
        }
    
        /**
         * 取消关注
         * @param $userId
         * @param $otherId
         */
        public function zRemFollow($userId, $otherId)
        {
            $this->redis->zRem(sprintf($this->prefix . $this->followKey, $userId), $otherId);
        }
    
        /**
         * 我的关注 | 正序
         * @param int $userId
         * @param int $start
         * @param int $end
         * @return array
         */
        public function zRangeFollow(int $userId, int $start = 0, int $end = 9)
        {
            return $this->redis->zRange(sprintf($this->prefix . $this->followKey, $userId), $start, $end);
        }
    
        /**
         * 我的关注 | 倒序
         * @param int $userId
         * @param int $start
         * @param int $end
         * @return array
         */
        public function zRevRangeFollow(int $userId, int $start = 0, int $end = 9)
        {
            return $this->redis->zRevRange(sprintf($this->prefix . $this->followKey, $userId), $start, $end);
        }
    
        /**
         * 增加粉丝
         * @param $userId
         * @param $otherId
         */
        public function zAddFans($userId, $otherId)
        {
            $this->redis->zAdd(sprintf($this->prefix . $this->fansKey, $userId), time(), $otherId);
        }
    
        /**
         * 移除粉丝
         * @param $userId
         * @param $otherId
         */
        public function zRemFans($userId, $otherId)
        {
            $this->redis->zRem(sprintf($this->prefix . $this->fansKey, $userId), $otherId);
        }
    
        /**
         * 我的粉丝 | 正序
         * @param int $userId
         * @param int $start
         * @param int $end
         * @return array
         */
        public function zRangeFans(int $userId, int $start = 0, int $end = 9)
        {
            return $this->redis->zRange(sprintf($this->prefix . $this->fansKey, $userId), $start, $end);
        }
    
        /**
         * 我的粉丝 | 倒序
         * @param int $userId
         * @param int $start
         * @param int $end
         * @return array
         */
        public function zRevRangeFans(int $userId, int $start = 0, int $end = 9)
        {
            return $this->redis->zRevRange(sprintf($this->prefix . $this->fansKey, $userId), $start, $end);
        }
    }

    以上就是php怎么实现关注功能的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php
    上一篇:php验证码后台不能生成怎么办 下一篇:php5.2怎么去除反斜杠
    VIP会员

    相关文章推荐

    • php如何判断用户是否关注微信公众号• PHP如何获得微信公众平台关注用户的基本信息• php微信活动时如何验证用户是否关注了公众号• 怎样关注店铺

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网