Php Laravel,获取访客Ip的最佳方法是什么?

Php Laravel,获取访客Ip的最佳方法是什么?,php,laravel,controller,ip,refactoring,Php,Laravel,Controller,Ip,Refactoring,我正在寻找最受支持/安全的方法来捕获访问者的Ip地址 目前,我可以通过以下方法保存访问者Ip 拨打电话的路线 Route::get('/','VisitorController@multidisplay'); 在multidisplay函数中,我调用另一个控制器来捕获和存储访客Ip,如-> public function multidisplay() { //calling log visitor controller app()->cal

我正在寻找最受支持/安全的方法来捕获访问者的Ip地址

目前,我可以通过以下方法保存访问者Ip

拨打电话的路线

Route::get('/','VisitorController@multidisplay');
在multidisplay函数中,我调用另一个控制器来捕获和存储访客Ip,如->

 public function multidisplay()
    {   
        //calling log visitor controller
        app()->call('App\Http\Controllers\LogVisitIpController@store');


        return view('welcome')
        ->with('sliderimg', Sliderimage::all())
        ->with('postimg', PostImage::orderBy('created_at', 'desc')->take(3)->get())
        ;

    }
最后,在LogVisitIpController中存储访问者Ip的实际功能

public function store(Request $request)
    {
        $bla=$this->getIp();
        $myvisitor = new LogVisitIp();
        $myvisitor->visitorIp=$bla;
        $myvisitor->save();
    }
现在我有两个问题

  • 在另一个控制器中使用这样的控制器可以吗

  • 我应该使用另一种方法来捕获访客ip吗 控制器


  • 注意:VisitorController用于将访问者的请求保存在DB中并发送邮件,我可以收集IP并从访问者的请求中传递,但我的目标是在访问者打开我的网站或发出ping请求时立即捕获IP

    即使您的代码实际上可以工作,我也不建议使用这种技术。 这是你应该做的

    定义一个仅用于保存IP的类。您将在此处移动真正记录ip的代码

    Class VisitIpLoggerService
    {
        public function storeIp(Request $request)
        {
            $myvisitor = new LogVisitIp();
            $myvisitor->visitorIp=$request->ip();
            $myvisitor->save();
        }
    }
    
    然后将该服务注入控制器的函数中,并像这样调用该函数。这样,您的代码将更易于维护

    public function multidisplay(Request $request, VisitIpLoggerService $ipLogger)
    {   
        //just call the service
        $ipLogger->storeIp($request);
    

    即使您的代码实际上可以工作,我也不建议使用这种技术。 这是你应该做的

    定义一个仅用于保存IP的类。您将在此处移动真正记录ip的代码

    Class VisitIpLoggerService
    {
        public function storeIp(Request $request)
        {
            $myvisitor = new LogVisitIp();
            $myvisitor->visitorIp=$request->ip();
            $myvisitor->save();
        }
    }
    
    然后将该服务注入控制器的函数中,并像这样调用该函数。这样,您的代码将更易于维护

    public function multidisplay(Request $request, VisitIpLoggerService $ipLogger)
    {   
        //just call the service
        $ipLogger->storeIp($request);
    

    将此添加到控制器中

    'ip_address_variable' => \Request::ip();
    
    对于你的情况

    public function store(Request $request)
        {
            $bla=$this->getIp();
            $myvisitor = new LogVisitIp();
            $myvisitor->visitorIp=$request->ip();
            $myvisitor->save();
        }
    

    将此添加到控制器中

    'ip_address_variable' => \Request::ip();
    
    对于你的情况

    public function store(Request $request)
        {
            $bla=$this->getIp();
            $myvisitor = new LogVisitIp();
            $myvisitor->visitorIp=$request->ip();
            $myvisitor->save();
        }
    


    您是否有任何登录系统或其适用于将访问您网站特定模块的任何人?没有,这是一个单页网站。访客只能以客人的身份发送请求,这样就可以了。您可以使用任何方式存储访问者的IP。在单个项目中使用调用模型是一种非常好的方法。根据我的调用,从任何其他控制器中的一个控制器调用函数是一种糟糕的方法contranLogVisitIpController@store在…内VisitorController@multidisplay. 我想使用一个有说服力的模型作为中间人b/w两个控制器或任何其他更好的方法,如php trait。您有任何登录系统或其供任何人访问您的网站的特定模块吗?不,这是一个单页网站。访客只能以客人的身份发送请求,这样就可以了。您可以使用任何方式存储访问者的IP。在单个项目中使用调用模型是一种非常好的方法。根据我的调用,从任何其他控制器中的一个控制器调用函数是一种糟糕的方法contranLogVisitIpController@store在…内VisitorController@multidisplay. 我想使用一个有说服力的模型作为中间人b/w两个控制器或任何其他更好的方法,比如php trait。但是我想简单一点,LogVisitipController仅用于捕获IP地址,您的方法和我的方法的唯一区别在于VisitorController中调用/访问函数store/storeip的方式。然而,你的通话方式看起来很干净。另外,如果使用了Laravel的内置方法来捕获IP地址,我如何确定它是否是真正的IP,即不是代理。刚刚测试了您的方法。这对我来说不起作用,它抛出了一个异常“BadMethodCallException调用未定义的方法App\LogVisitIp::store()”@SyedAqeel我无法帮助检查代码,将其发布到某个地方,我会尝试看一看……我会更进一步,创建一个路由中间件。但是我想简单一点,LogVisitipController仅用于捕获IP地址,您的方法和我的方法的唯一区别在于VisitorController中调用/访问函数store/storeip的方式。然而,你的通话方式看起来很干净。另外,如果使用了Laravel的内置方法来捕获IP地址,我如何确定它是否是真正的IP,即不是代理。刚刚测试了您的方法。它对我来说不起作用,它抛出了一个异常“BadMethodCallException调用未定义的方法App\LogVisitIp::store()”@SyedAqeel我无法帮助检查代码,将它发布到某个地方,我会尝试看一看。。。