Я пытаюсь создать сайт для голосования.Таким образом, любой пользователь, который посещает сайт, должен иметь возможность голосовать с или без регистрации.Здесь возникает моя проблема - я хочу аутентифицировать пользователей по IP-адресу.Мне нужна идея, как структурировать мой код и представление, чтобы включить это.Потому что я могу найти пользователя по IP и могу использовать Auth::loginUsingId();
, но я делаю это в моем контроллере.Вот мой код:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Answer;
use App\Question;
use App\User;
use App\Category;
use DateTime;
class QuestionController extends Controller
{
public function show()
{
$ip = \Request::ip();
$user = User::where('ip', $ip)->first();
if($user == NULL)
{
$user = new User;
$user->ip = $ip;
$user->save();
}
Auth::loginUsingId($user->id, true);
$questions = Question::all();
$categories = Category::all();
return view('home')
->with('questions', $questions)
->with('categories', $categories);
}
public function vote(Request $request)
{
$user = NULL;
$ip = $request->ip();
if(Auth::check()) $user = Auth::user();
$user = User::where('ip', $ip)->first();
Auth::loginUsingId($user->id, true);
if($user->votes_left == 0)
return response()->json(['success' => false, 'msg' => 'You have no votes left.']);
if($user == NULL)
{
$user = new User;
$user->ip = $ip;
$user->save();
}
$question = Question::find($request->question_id)->users()->where('user_id', Auth::id())->get();
if(sizeof($question) >= 1)
return response()->json(['success' => false, 'msg' => 'You had already answered this question.']);
$user->votes_left -= 1;
$user->save();
$user->questions()->attach($request->question_id);
$user->answers()->attach($request->answer_id);
return response()->json(['success' => true]);
}
public static function isAnsweredByUser($question)
{
}
public static function timeElapsed($datetime, $full = false) {
$now = new DateTime;
$ago = new DateTime($datetime);
$diff = $now->diff($ago);
$diff->w = floor($diff->d / 7);
$diff->d -= $diff->w * 7;
$string = array(
'y' => 'year',
'm' => 'month',
'w' => 'week',
'd' => 'day',
'h' => 'hour',
'i' => 'minute',
's' => 'second',
);
foreach ($string as $k => &$v) {
if ($diff->$k) {
$v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
} else {
unset($string[$k]);
}
}
if (!$full) $string = array_slice($string, 0, 1);
return $string ? implode(', ', $string) . ' ago' : 'just now';
}
public function store(Request $request)
{
//
}
}