Trabajo en laravel y trato de obtener la respuesta de la página. Este es el controlador en cuestión:
public function counter($id) { $toSearch = $id * 10000; $latest = User::where('counter', '>=', $toSearch)->get()->last(); $res = $latest['counter'] % $toSearch; return $res; }Como puede ver, el resultado que devolvió el controlador es un registro único y estoy desesperado por obtener ese registro en el archivo Java Script en un archivo separado de mi vista Blade. No quiero acceder a la base de datos de JS y solo intentar obtener ese único registro.
Esta es la función que se encarga de devolver el resultado:
function counter(id) { let data; // Please Help Me Here return data; }El valor devuelto por esta función se utilizará para otra función.
La forma en que funciona el algoritmo es llamar a la función de contador desde el archivo JS, cuyo resultado será manejado por el controlador mediante el uso de búsqueda o cualquier cosa.
Nota: el resultado debe ser un número entero <- tal vez haya otra cosa que hacer para convertirlo a número entero/número.
Veo 2 opciones para resolver tu problema:
1. Envíe la variable a la plantilla de hoja y luego con js recupérela.
2. Realice una solicitud ajax para recuperar los datos, debe crear una ruta separada, de modo que la ruta solo devuelva el resultado a través de JSON.
Ambas variantes tienen sus pros y sus contras. Para alguien es más fácil segundo, para el primero. Intentaré escribir ambos a continuación:
1. Envío de datos a Blade : para este, necesita saber dónde se usará ese counter , si intenta usarlo globalmente, entonces puede adjuntarlo al body o al footer/header de la siguiente manera:
<body data-counter="{{App\Http\Models\User::calculateCounter($user_id)}}">es solo un ejemplo, su código real podría ser diferente. Para el código anterior, debe crear una función estática pública en el modelo de usuario y colocar su código allí en el modelo. También debe pasar la variable $user_id y recibirla en el modelo de usuario. O puede usar el archivo del controlador para lograrlo, aunque el resultado sería el mismo ($user_id necesita enviar).
Luego, en la función de su archivo js:
function counter() { return parseInt(document.body.dataset.counter); }2. Solicitud de Ajax : es posible que tenga un problema de espera asincrónica, en caso afirmativo, intente obtener más información sobre "devolver la respuesta asíncrona XMLHTTPRequest". Puede ser complicado. En tu función js:
function counter(id){ const xhttp = new XMLHttpRequest(); xhttp.open("GET", `/getCounterOfUser/${id}`); xhttp.addEventListener('load', function (event) { if (event.target.responseText && event.target.status == 200) { return parseInt(JSON.parse(event.target.responseText)); } else { return 0; } }); xhttp.addEventListener(' error', function (event) { // Define what happens in case of error }); xhttp.send(); }Y necesitas crear una nueva ruta:
Route::get('/getCounterOfUser/{id}', [App\Http\Controllers\Your_Controller::class, 'counter'])También debe devolver JSON en la función de su controlador:
public function counter($id) { $toSearch = $id * 10000; $latest = User::where('counter', '>=', $toSearch)->get()->last(); $res = $latest->counter % $toSearch; return response()->json($res); }