Laravel,捕获访客 IP 的最佳方法是啥?
Posted
技术标签:
【中文标题】Laravel,捕获访客 IP 的最佳方法是啥?【英文标题】:Laravel, What is best approach to capture Visitors Ip?Laravel,捕获访客 IP 的最佳方法是什么? 【发布时间】:2019-08-20 10:10:41 【问题描述】:我正在寻找最受支持/最安全的方法来捕获访问者的 IP 地址。
目前我可以通过以下方法保存访问者 IP
发出呼叫的路由。
Route::get('/','VisitorController@multidisplay');
在多显示功能中,我正在调用另一个控制器来捕获和存储访客 Ip like->
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 用于将访问者的请求保存在数据库中并发送邮件,我可以从访问者的请求中收集 IP 并传递它,但我的目标是在访问者打开我的网站或进行 ping 时立即捕获 Ip要求。
【问题讨论】:
您是否有任何登录系统或任何将访问您网站的特定模块的人? 不,这是一个单页网站。访客只能以访客身份发送请求。 那就没问题了。您可以使用任何方式以您想要的方式存储访问者的 IP。您已经为单个项目使用了调用模型的非常好的方法。 根据***.com/a/30365349从任何其他控制器中的一个控制器调用函数是一种不好的方法我在VisitorController@multidisplay中调用contranLogVisitIpController@store。我想使用一个雄辩的模型作为中间人 b/w 两个控制器或任何其他更好的方法,如 php trait。 【参考方案1】:即使您的代码确实有效,我也不建议您使用该技术。 这是你应该做的。
定义一个仅用于保存 ips 的类。您将在此处移动真正记录 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);
【讨论】:
我会更进一步,创建一个路由中间件 同意。但我想以某种方式保持简单 LogVisitIpController 仅用于捕获 IP 地址,您的方法和我的方法的唯一区别是在 VisitorController 中调用/访问函数 store/storeip 的方式。但是,您的呼叫方式看起来很干净。另外,如果使用 Laravel 的内置方法来捕获 IP 地址,我如何确定它是否是真实 IP,也就是不是代理。 刚刚测试了你的方法。它对我来说不起作用,它会引发异常“ BadMethodCallException Call to undefined method App\LogVisitIp::store()”。 @SyedAqeel 我忍不住要检查没有代码,把它贴在某个地方,我会尝试看看......【参考方案2】:将此添加到您的控制器中...
'ip_address_variable' => \Request::ip();
对于你的情况,
public function store(Request $request)
$bla=$this->getIp();
$myvisitor = new LogVisitIp();
$myvisitor->visitorIp=$request->ip();
$myvisitor->save();
【讨论】:
以上是关于Laravel,捕获访客 IP 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 5.2 中捕获保存和删除的最可靠方法是啥?