怎么简化或者优化客户端判断代码

我用laravel 的 Agent 判断用户端,然后渲染不同的页面,代码如下:

UsersController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Agent;

class UsersController extends Controller
{
    public function index() {
        if(Agent::isMobile()){
            return view("mobile.auth.member-index");
        } else {
            return ("请用手机访问懂你心理");
        }
    }

    public function create() {
        if(Agent::isMobile()){
            return view("mobile.auth.member-login");
        } else {
            return ("请用手机访问懂你心理");
        }
    }

这样会出现大量的if语句,我怎么优化呢?比如写到model里?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 14

建个中间件

4年前 评论

其实你可以定义一个全局函数, 比如

function myView($viewPath){
    if(Agent::isMobile()){
        return view("mobile.".$viewPath);
    } else {
        return ("请用手机访问懂你心理");
    }
}

然后, 调用.

4年前 评论

中间件+1

4年前 评论

@likunyan @pigzzz 二位大佬能否留下代码片段或者参考文章,新手感激不尽

4年前 评论
php artisan make:middleware IsMobile
use Agent;

class IsMobile
{
    public function handle($request, Closure $next)
    {
        if (!Agent::isMobile()) {
            return "请用手机访问懂你心理";
        }

        return $next($request);
    }
}

多看文档

4年前 评论

个人认为中间件虽然是比较好的解决方案 但是不易扩展,如果电脑也需要返回视图,这种方案就不行了

4年前 评论
wongvio (楼主) 4年前
ouer1994 (作者) 4年前

如果只要统一碰到移动端就跳转,还不如干脆在 nginx 里检查下 user agent , 直接跳走拉倒。
都不用初始化 laravel 。

4年前 评论

可以写一个控制器继承Controller,在里面写判断方法,然后其他控制器继承这个控制器

<?php namespace App\Http\Controllers;
use Agent;
class CheckMobileController extends Controller
{
     public function checkMobile($url)
       {
            if (!Agent::isMobile()) {
             return redirect($url);
        }
  }
}

在其他控制器中继承并使用

class UsersController extends CheckMobileController
{
    public function index() {
       $this->checkMobile('/home')
    }

    public function create() {
        $this->checkMobile('/home')
    }
4年前 评论
wongvio (楼主) 4年前

建立中间件封装一层逻辑流转处理,控制器层逻辑处理,不作为逻辑流转。

4年前 评论
nfangxu

前端自适应他不香吗

4年前 评论
wongvio (楼主) 4年前

写到构造函数里可以吗

4年前 评论

首先,,,

// 在 Agent 里
public static getViewPrefix()
{
    return static::isMobile() ? 'mobile' : 'pc';
}

// 在控制器里
public function index()
{
    return view(Agent::getViewPrefix().".auth.member-index");
}

然后,,

由于你现在没有 PC 页面,如果是 PC 访问,就要返回错误,则可以做一个中间件来过滤,以后做了 PC 页面,把中间件去掉即可。

最后。。

如果你都是按照 mobile 或者 pc 的前缀划分的,,,可以放到 服务提供者 里面,根据客户端是否是 手机,重新注册 view 的根目录,,之后控制里,直接 return view('auth.member-index') 就可以了

4年前 评论
html{
  max-width: 750px;
  margin: 0 auto !important;
}

限制最大宽度&&居中,电脑看起来和手机一样

4年前 评论
wongvio (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!