Я пытаюсь реализовать отслеживание пользователей в Laravel путем записи статистики после входа пользователя. Т.е. местоположение, часовой пояс и тому подобное. Мне почти повезло реализовать это.
Я использовал ajax, прикрепив прослушиватель событий для отправки кнопки в форму входа. После отправки формы вызывается метод ajax. Этот метод получает статистику пользователя с помощью вызова API. Затем этот запрос ajax отправляет эти данные в StatsController@store
, который затем записывает эту запись в таблицу статистики.
Это достигается только с помощью e.preventDefault();
, если я его не использую, записи не вставляются в БД и выдает ошибку, которая быстро исчезает после перенаправления на панель инструментов.
Ajax метод находится в файле js, который вызывается в файле макета.
Вот метод ajax:
function getCoords(){
return fetch('https://ipinfo.io/geo')
.then((response) => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
else{
return response.json();
}
})
.then((response) => {
let url = "/writeStats";
let token = document.querySelector("meta[name='csrf-token']").getAttribute("content");
let forma = document.getElementById("loginForm");
let formElements = {};
formElements.email = forma.elements[1].value;
formElements.password = forma.elements[2].value;
$.ajax({
url: url,
type: 'POST',
data: {_token: token , message: "bravo", stats: response, formElements: formElements},
dataType: 'JSON',
success: (response) => {
console.log("success");
console.log(response);
},
error: (response) => {
console.log("error");
console.log(response);
}
});
})
.catch((error) => {
console.error('There has been a problem with your fetch operation:', error);
});
}
window.addEventListener("click", (e) => {
if(e.target.id==="loginBtn"){
//e.preventDefault();
getCoords();
}
});
web. php:
Route::post('/writeStats','StatsController@store');
StatsController:
public function store(Request $request)
{
if($request->ajax()){
$email = $request->formElements["email"];
$password = $request->formElements["password"];
$user = DB::table('users')->where("email", "=", $email)->first();
if(Hash::check($password, $user->password)) {
$stat = new Stats;
$stat->ip = $request->stats["ip"];
$stat->city = $request->stats["city"];
$stat->region = $request->stats["region"];
$stat->country = $request->stats["country"];
$stat->coords = $request->stats["loc"];
$stat->timezone = $request->stats["timezone"];
$stat->user_id = $user->id;
$stat->save();
$response = array(
"message" => "bravo",
"request" => $request->all(),
"stats" => $request->stats,
"user" => $user,
"stat" => $stat,
);
return response()->json($response);
}
}
}
php artisan --version
показывает Laravel Framework 6.9.0
Мой вопрос: Как вставить в таблицу статистики сразу после входа пользователя ?
Edit1:
Сейчас я пробую несколько иной подход. Вместо какого-то пользовательского метода из StatsController я теперь использую метод authenticated
в LoginController.
public function authenticated(Request $request)
{
$credentials = $request->only('email', 'password');
$email = $request->input("email");
$password = $request->input("password");
$user = DB::table('users')->where("email", "=", $email)->first();
if (Auth::attempt($credentials)) {
$stat = new Stats;
$stat->ip = $request->stats["ip"];
$stat->city = $request->stats["city"];
$stat->region = $request->stats["region"];
$stat->country = $request->stats["country"];
$stat->coords = $request->stats["loc"];
$stat->timezone = $request->stats["timezone"];
$stat->user_id = auth()->user()->id;
$stat->save();
$response = array(
"stat" => $request->all(),
);
return redirect()->intended('dashboard');
}
}
и в Интернете. php:
Route::post('/login','Auth\LoginController@authenticated');
Все еще не повезло. Я просто не знаю, какой подход использовать. Это так близко, как будто я упустил что-то маленькое.
Edit2:
Позвольте мне перефразировать вопрос:
Как отправить вызов API ответ на контроллер входа, чтобы после аутентификации пользователя я мог вставить данные ответа API в другую таблицу (не в таблицу пользователей)? Могу ли я:
- Каким-то образом вставить ответ API в запрос аутентификации?
- Или как проверить подлинность при одновременной записи записей в таблицу
stats
?
Я испробовал оба подхода (см. Исходные данные и правки), но не уверен, что мне писать. ..