请教大佬们两个问题:redirect 和 BusinessException

yookey

问题描述

问题一

重定向方法redirect(url) 能否在 控制器类 的父类中可实现跳转(文档是说只能在中间件或控制器中可跳转)

//基类
abstract class Base
{
    ....
    public function xyz()
    {
        ...
        if($flag) {
            return redirect(url); // 这里是不能跳转的
        }
    }
}

//控制器类
class Index extends Base
{
    public function index()
    {
        .....
        return redirect(url); //这里跳转是正常
    }
}
问题二

业务类 BusinessException,当前只有传递两个参数,怎么改造可以传递多个参数,能返回如下的json数据格式(或者返回能指定视图模板更灵活):

//改造后能实现的调用
ChangException("信息", 200, ['url'=>'https://www.workerman.net/'])

//返回给终端
{"code":200, "msg":"信息", data:['数组']}

请教下大佬们是否好实现,谢谢!

267 1 0
1个回答

walkor 打赏

异常处理参考文档,你可以自己定义一个异常类,加上你要的参数和你需要渲染的结果
https://www.workerman.net/doc/webman/exception.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%9A%E5%8A%A1%E5%BC%82%E5%B8%B8

redirect()实际上就是返回一个response对象,你能让被调用的控制器返回这个对象就行,例如。

class Index extends Base
{
    public function index()
    {
        .....
        return $this->xyz();
    }
}

如果你想要在任意位置跳转(非控制器),也可以利用自定义异常做到,自定义异常的render方法里return redirect(...);就好了。

<?php

namespace app\exception;

use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;

class Redirect extends BusinessException
{
    protected $location;
    public function __construct($location)
    {
        $this->location = $location;
    }
    public function render(Request $request): ?Response
    {
        return redirect($this->location);
    }
}

app/functions.php里封装一个函数

use app\exception\Redirect;
function my_redirect($location)
{
    throw new Redirect($location);
}

这样在任意位置调用my_redirect()就可以跳转了。

  • yookey 2024-09-19

    好的,已经完美解决问题,感谢大佬!

×
🔝