请问 Laravel 怎么自定义 Illuminate\Http\Request 类

在 ThinkPHP 中,开发者可以自定义 Request 类。这个自定义的 Request 类一般是继承框架自带的 Request 类。
然后就可以在类中写自己的逻辑。

class HappyRequest extends \Illuminate\Http\Request
{
    // 判断请求来源微信小程序
    public function inWxapp()
    {
        return strpos($this->userAgent(), 'miniprogram');
    }

}

这样在控制器里就可以直接调用

public function test(HappyRequest $request)
{
    if ($request->inWxapp()) {

    }
}

这样的逻辑我觉得挺方便的。现在想问一下,在 Laravel 里怎么让上面的设置生效?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 13
JaguarJack

一样的呀!

3年前 评论
ganto (楼主) 3年前
php artisan make:request HappyRequest 

表单验证详细用法点我

3年前 评论
ganto (楼主) 3年前
slpi1 3年前
panda-sir

你可以新写个class来集成基类的Request扩展新方法 然后在使用的时候使用你这个新的class就行 就像你上面写的一样 当然其实还有一种方法 不用这么麻烦Illuminate\Http\Request里使用了一个Trait名字是Illuminate\Support\Traits\Macroable这个可以扩展类的方法 你可以具体看下这个类的源码

3年前 评论
ganto (楼主) 3年前
shi_xy 3年前

你自己写个request 类,在容器中重新绑定下就行 $app->bind();

3年前 评论
ganto (楼主) 3年前
戎码一生 (作者) 3年前
ganto (楼主) 3年前
戎码一生 (作者) 3年前
ganto (楼主) 3年前
戎码一生 (作者) 3年前
panda-sir

AppServiceProviderregister要这么写才能扩展
file
然后随便在哪都可以直接使用了

file

@ganto

3年前 评论
ganto (楼主) 3年前

<?php

namespace App\Http\Requests; use Illuminate\Http\Request;

class TestRequest {

public function __construct(Request $request)
{
    $this->request = $request;
}

// 判断请求来源微信小程序
public function inWxapp()
{
    echo $this->request->userAgent();
    return strpos($this->request->userAgent(), 'miniprogram');
}

}

3年前 评论
three_xtie (作者) 3年前
ganto (楼主) 3年前
three_xtie (作者) 3年前
ganto (楼主) 3年前
ganto (楼主) 3年前
three_xtie (作者) 3年前
three_xtie (作者) 3年前
slpi1 3年前

macro 方法可以满足你。
教程:如何利用 macro 方法来扩展 Laravel 的基础类的功能

你可以在ServiceProvider中定义一个
Request::macro(‘inWxapp’, function () {
});
然后在你的控制器中调用 request()->inWxapp();

3年前 评论
shi_xy (作者) 3年前
three_xtie 3年前
three_xtie 3年前

…你随便定义一个类,然后就可以那样使用,记得,随便定义

3年前 评论
three_xtie 3年前
Siam (作者) 3年前

建议看一下 public/index.php 中的源码。request 对象在这里就通过 Illuminate\Http\Request 类实例化了:

$request = Illuminate\Http\Request::capture()

后期你如果要丰富 request 对象的话,要么在现有 request 对象的基础上动态新增方法,像上面有人提到的 Macroable 或者通过重绑定事件;要么在 public/index.php 中改变实例化 request 对象的类。

还有提到到 $app->bind()方法不可行,是时机问题。 request 对象在框架内核中有两次实例绑定,一次在容器启动前,一次在容器启动后,都是用的上面那个对象,所有在 Provider 中通过 boot方法 对 request 的注册绑定行为都不会生效,会被后一次覆盖掉,但可以通过延迟绑定来注册。

3年前 评论

楼主,你有解决办法了吗?我也遇到这样的问题

3年前 评论

请求扩展 这个方法不知道对你可行?

出自学院君

3年前 评论
德国科隆街头的大胡子


namespace App\Http;


class TRequest extends \Illuminate\Http\Request
{
//自定义类
    public function isWx(){
        return false;
    }

}



//控制器

    //test
    public function test(TRequest $request){

        dd($request->isWx());
    }

3年前 评论

楼主也许可以尝试一下中间件

3年前 评论

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