我只想在数据库中保存一次访问者IP地址,因此我创建了一个中间件并尝试使用$ request-> ip保存用户IP地址。但是问题是数据总是在数据库中重复,以避免这种情况我试图用Laravel会话创建一个布尔标志,以检查当前用户的IP地址是否保存在数据库中?但是Laravel在Laravel会话中没有保存任何内容,因此数据在数据库中重复。 我的代码是:
namespace App\Http\Middleware;
use App\Repositories\Contracts\VisitorRepositoryInterface;
use Closure;
use Session;
class VisitorMiddleware
{
private $visitorRepository;
public function __construct(VisitorRepositoryInterface $visitorRepository)
{
$this->visitorRepository = $visitorRepository;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!session('visited', false)) {
$this->visitorRepository->create([
'ip' => $request->ip(),
]);
session(['visited' => true]);
session()->save();
}
return $next($request);
}
}
我也尝试用:
保存$request->session()->put('visitors', true);
但是没有机会!
任何帮助将不胜感激。
答案 0 :(得分:0)
您正在使用哪个会话驱动程序?如果为array
,则该会话将不会在请求之间持续存在。至于重复的数据,您根本不需要会话,而是直接检查数据库中的IP地址,如果不存在则保存它:
public function handle($request, Closure $next)
{
$exists = $this->visitorRepository->where([
'ip' => $request->ip(),
])->exists();
if (!$exists) {
$this->visitorRepository->create([
'ip' => $request->ip(),
]);
}
return $next($request);
}
// simplified further using eloquent's firstOrCreate
public function handle($request, Closure $next)
{
$this->visitorRepository->firstOrCreate([
'ip' => $request->ip(),
]);
return $next($request);
}