请问 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 里怎么让上面的设置生效?
一样的呀!
表单验证详细用法点我
你可以新写个
class
来集成基类的Request
扩展新方法 然后在使用的时候使用你这个新的class
就行 就像你上面写的一样 当然其实还有一种方法 不用这么麻烦Illuminate\Http\Request
里使用了一个Trait
名字是Illuminate\Support\Traits\Macroable
这个可以扩展类的方法 你可以具体看下这个类的源码你自己写个request 类,在容器中重新绑定下就行 $app->bind();
AppServiceProvider
的register
要这么写才能扩展然后随便在哪都可以直接使用了
@ganto
<?php
namespace App\Http\Requests; use Illuminate\Http\Request;
class TestRequest {
}
macro 方法可以满足你。
教程:如何利用 macro 方法来扩展 Laravel 的基础类的功能
你可以在ServiceProvider中定义一个
Request::macro(‘inWxapp’, function () {
});
然后在你的控制器中调用 request()->inWxapp();
…你随便定义一个类,然后就可以那样使用,记得,随便定义
建议看一下
public/index.php
中的源码。request
对象在这里就通过Illuminate\Http\Request
类实例化了:后期你如果要丰富
request
对象的话,要么在现有request
对象的基础上动态新增方法,像上面有人提到的Macroable
或者通过重绑定事件;要么在public/index.php
中改变实例化request
对象的类。还有提到到
$app->bind()
方法不可行,是时机问题。request
对象在框架内核中有两次实例绑定,一次在容器启动前,一次在容器启动后,都是用的上面那个对象,所有在Provider
中通过boot
方法 对request
的注册绑定行为都不会生效,会被后一次覆盖掉,但可以通过延迟绑定来注册。楼主,你有解决办法了吗?我也遇到这样的问题
请求扩展 这个方法不知道对你可行?
出自学院君
楼主也许可以尝试一下中间件