Система голосования фреймворк Laravel


Я написал класс для голосования в фреймворк Laravel. Он использует сайты API голосования, чтобы проверить, если пользователь уже голосовал сегодня. Пользователь имеет право голосовать один раз в день.

Все голоса сброшены в полночь (т. е. 12:00 по времени Чикаго) и я создать cookie для того, чтобы не беспокоить попусту завиток ответ до тех пор, так что истекает срок действия файла cookie, когда новое голосование разрешено.

API возвращает код ответа: 2 означает, что пользователь не проголосовал за них в течение последних 24 часов, и 3 означает, что они проголосовали за них в течение последних 24 часов. Просто думаю, что 2 в 0 и 3 в 1 в ложное/истинное положение дел.

Причина, по которой я задаю этот вопрос, я не думаю, что я занимаюсь печенье лучший способ я могу. Может кто посоветует лучший способ, чтобы создать их? Я не был уверен, как это сделать без ответа, так как фреймворк Laravel говорит, что вы должны отправить его с ответом.

Если пользователь должен голосовать, они отправляются на страницу голосования. Сейчас я просто поставил временную ссылку как http://need2vote.com пока я не закончу класс.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Auth;
use Redirect;
use Illuminate\Support\Facades\Route;
use Cookie;
use Illuminate\Http\Request;
use Config;

class VotingController extends Controller
{
    protected $pageUsername;
    protected $requestTimeout;
    protected $usingCloudflare;
    protected $apiUrl;

    public function __construct() 
    {
        $this->pageUsername = Config::get('voting.username');
        $this->requestTimeout = Config::get('voting.timeout');
        $this->usingCloudflare = true;
        $this->apiUrl = Config::get('voting.api_url');
    }

    public function checkVote(Request $request) 
    {
        if (Config::get('voting.enabled') == false) {
            return;
        }

        if ($this->isVoteCookieSet()) {
            return;
        }

        $urlRequest = $this->apiUrl . 'user=' . $this->pageUsername . '&ip=' . $request->ip();

        $result = $this->makeCurlRequest($urlRequest, $this->requestTimeout);

        if ($result == 3) {
            $this->redirectToVote();
        }
        else {
            $this->setVoteCookie();
        }
    }

    private function makeCurlRequest($url, $timeout) 
    {
        if (function_exists('curl_version')) 
        {
            $curl = curl_init();

            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);

            $requestData = curl_exec($curl);

            curl_close($curl);
        }
        else
        {
            $requestData = stream_context_create(array('http' => array('timeout' => $timeout))); 
            return file_get_contents($url, 0, $requestData); 
        }

        return $requestData;
    }

    public function redirectToVote() {
        header('Location: http://needtovote.com');
        exit();
    }

    private function setVoteCookie() {
        $rankingsResetTime = $this->getVoteResetTime();
        setcookie('vote_timestamp', $rankingsResetTime, $rankingsResetTime);
    }

    private function isVoteCookieSet() {
        if (isset($_COOKIE['voting_timestamp'])) {
            if ($_COOKIE['voting_timestamp'] == $this->getVoteResetTime()) {
                return true;
            }
            else{
                setcookie('voting_timestamp', '');
                return false;
            }
        }

        return false;
    }

    private function getVoteResetTime() {
        $serverDefaultTime = date_default_timezone_get();
        date_default_timezone_set('America/Chicago');

        $rankingsResetTime = mktime(0, 0, 0, date('n'), date('j') + 1);
        date_default_timezone_set($serverDefaultTime);

        return $rankingsResetTime;
    }
}


1099
3
задан 1 февраля 2018 в 01:02 Источник Поделиться
Комментарии
1 ответ

Вопрос


Может кто посоветует лучший способ, чтобы создать [печенье]?

Как ваш код уже используется, setcookie() Это традиционный способ установки куки. И да, поскольку данные куки передаются в заголовке, там должен быть ответ, иначе браузера/пользователя не может получить печенье.

Общей Обратной Связи

Передавая экземпляр/переменные-члены для способ

Почему пройти $this->timeout для makeCurlRequest от checkVote способ? Если метод был вызван за пределами этого класса (и объем способ изменен protected для суб-классов или public в другом месте в коде), то возможно, есть смысл принимать этот параметр.


$result = $this->makeCurlRequest($urlRequest, $this->requestTimeout);

Поскольку этот метод не является статическим, он может просто сослаться на $this->requestTimeout вместо того, чтобы принять параметр для него.

Сообщают Имя Метода

Метод makeCurlRequest появляется, чтобы проверить, если завить функции curl_version() существует и затем либо делает завиток запрос или использует file_get_contents(). Таким образом, метод может не всегда сделать завиток просьбе и лучшее имя makeRequest. Код в блоке, когда curl_version() функция существует, может быть перемещен в новый метод makeCurlRequest.

return от makeCurlRequest()

Метод makeCurlRequest имеет два return заявления. В else блока, а другой-в конце метода, т. е. return $requestData;. Этой переменной,$requestDataпохоже, ответа от API, когда curl_version() функция не существует (и, таким образом, завиток запрос), но в else блок $requestData назначается ресурсов от stream_context_create(). Хотя это скорее правильно код функции, он может ввести в заблуждение партнера по команде, которым пришлось обновить его. Более подходящее название для возвращаемое значение от вызова stream_context_create() может быть что-то вроде $streamContext. Тогда это может быть проще, чтобы назначить возвращаемое значение от вызова file_get_contents() для $requestData и использовать return этой переменной в конце метода, или когда делает завиток запрос, возвращает ответ в конце этого блока.

Избыточные return false

В isVoteCookieSet() есть else блок вложенных if заявление, содержащее return false;. Что может быть удалены, так как в последней строке метод делает то же самое.

Константы для кодов ответа

Было бы разумно определить (класс) константы для кодов ответа, как те ниже. Хотя в настоящее время представляется только одно место в коде, где это значение появляется, может возникнуть необходимость, чтобы они отображались в другие логики и, следовательно, было бы полезно повторно использовать константа(ы). Затем, если значение никогда не должны быть обновлены (например, если API не меняется), то он может быть обновлен в коде в одном месте.

const RESPONSE_VOTE_PLACED_IN_PAST_24_HOURS = 3;
const RESPONSE_VOTE_NOT_PLACED_IN_PAST_24_HOURS = 2;

Таким образом, код строки, как показано ниже:


if ($result == 3) {

Можно обновить так:

if ($result == self::RESPONSE_VOTE_PLACED_IN_PAST_24_HOURS) {

Что, надеемся, позволит еще кто-то читает ваш код, чтобы иметь лучшее представление о том, что значит логика. Хотя, если эти имена слишком длинные, не стесняйтесь, чтобы сократить их.

1
ответ дан 8 февраля 2018 в 09:02 Источник Поделиться