Перейти к содержимому
Русский язык для Invision Community 5

JsonSerializable в IPS

Здравствуйте. Имею вот такой файлик с другого движка, это ActiveRecords и еще тут есть какой-то JsonSerializable.

 

Файлик:

 

<?php

namespace StatsBundle\Entity;

/**
* StatsGameplayerHeroes
*/
class StatsGameplayerHeroes implements \JsonSerializable {
   use MultiKillStatsTrait, StatsHeroTrait, AdditionalStatsTrait;

   /**
    * @var integer
    */
   private $playerId;

   /**
    * Set playerId
    *
    * @param integer $playerId
    *
    * @return StatsGameplayerHeroes
    */
   public function setPlayerId($playerId)
   {
       $this->playerId = $playerId;

       return $this;
   }

   /**
    * Get playerId
    *
    * @return integer
    */
   public function getPlayerId()
   {
       return $this->playerId;
   }


   public function jsonSerialize()
   {
       return [
           'hero' => $this->getHero(),
           'games' => $this->getG(),
           'winrate' => number_format(($this->getW() * 100) / $this->getG(), 2),
           'kd' => number_format($this->getD() > 0 ? $this->getK() / $this->getD() : $this->getK(), 2),
           'ad' => number_format($this->getD() > 0 ? $this->getA() / $this->getD() : $this->getA(), 2),
       ];
   }
}

 

Мне всё понятно кроме подключения implements \JsonSerializable

Рекомендованные сообщения

  • Автор

Сделал вот еще одну функцию, мне таск пишет Sorry, we could not find that! Всё правильно, проверил раз 20.

 

$heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first());

 

<?php

namespace IPS\sharedstats\Entity;

class _StatsGameplayerHeroes extends \IPS\sharedstats\DbIntegration\ActiveRecord
{

   /**
    * @brief    [ActiveRecord] ID Database Column
    */
   public static $databaseColumnId = 'player_id';
   /**
    * @brief   [ActiveRecord] Database ID Fields
    */
   protected static $databaseIdFields = array( 'player_id' );

   /**
    * @brief    [ActiveRecord] Database table
    * @note    This MUST be over-ridden
    */
   public static $databaseTable = 'stats_gameplayer_heroes';

   /**
    * @brief   [ActiveRecord] Database Prefix
    */
   public static $connectionName = 'stats';

}

  • Автор

Пока закомментировал этот код, вот такая строка подключения в другом движке: $gHeroStats = $em->getRepository('StatsBundle:StatsHeroes')->find($hero); что вместо find использовать? Попробовал load, не помогает.

Изменено пользователем TemKa_SD

  • Автор

Так. Посмотрел в движке, может быть, load и нужен. Я так понимаю, нужно добавить таблицу?

 

Хотя нет. У меня в таблице нет ID, поэтому, load не подходит.

Изменено пользователем TemKa_SD

  • Автор

Разобрался, потому что таблица пустая.

first() выкидывает исключение, поэтому используйте try/catch

try
{
   $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first());
}
catch (\UnderflowException $e)
{
}

  • Автор

Пока так:

 

	public function execute()
{
	$db = \IPS\sharedstats\DB::get();
	$type = 'dota';
	$hero = '';
	$gameIds = $db->select('g.gameid, d.winner', ['stats_games_scored', 'g'], ['hs.id IS NULL AND type=?', $type], 'g.gameid ASC', 75)->join( array( 'stats_dotagames', 'd' ), 'd.gameid = g.gameid', 'INNER')->join( array( 'stats_heroes_scored', 'hs' ), 'hs.id = g.gameid', 'LEFT');

    try {
    	foreach($gameIds as $game) {
    		$gameId = $game['gameid'];
    		$players = $db->select('d.*, p.*', ['stats_gameplayers', 'p'], ['p.gameid = ? AND TRIM(d.hero) !=?', $gameId, $hero])->join( array( 'stats_dotaplayers', 'd' ), 'd.gameid = p.gameid AND d.newcolour = p.colour', 'INNER');
    		foreach($players as $p) {
    			$dbPlayer = \IPS\sharedstats\Entity\StatsGameplayerScored::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerScored::$databaseTable, (['name=? AND server=?', $p['name'], $p['spoofedrealm']]))->first());

				if($dbPlayer) {
					$hero = $this->getHero(mb_strtoupper($p['hero']));
                       $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                       if (!$heroStats) {
                           $heroStats = new StatsGameplayerHeroes();
                           $heroStats->setPlayerId($dbPlayer->getId());
                           $heroStats->setHero($hero);
                       }
                       $gHeroStats = \IPS\sharedstats\Entity\StatsHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsHeroes::$databaseTable, (['hero=?', $hero]))->first());
                       if (!$gHeroStats) {
                           $gHeroStats = new StatsHeroes();
                           $gHeroStats->setHero($hero);
                       }
				}
    		}
    	}
    } catch(\OutOfRangeException $e) {}

    if(count($gameIds)>0) {
      return 'Hero: ' . json_encode($heroStats);
    }
    else {
    	return 'Игры не найдены';
    }
}

 

Соответственно, здесь $dbPlayer = \IPS\sharedstats\Entity\StatsGameplayerScored::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerScored::$databaseTable, (['name=? AND server=?', $p['name'], $p['spoofedrealm']]))->first()); тоже нужно его использовать?

 

А в catch выводить ошибку, что записей в таблице нет?

Изменено пользователем TemKa_SD

  • Автор

Правильно ли я сделал?

 

Было:

 

                        $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                       if (!$heroStats) {
                           $heroStats = new StatsGameplayerHeroes();
                           $heroStats->setPlayerId($dbPlayer->getId());
                           $heroStats->setHero($hero);
                       }

 

Стало:

 

                            try
                               {
                                   $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                               }
                               catch (\UnderflowException $e)
                               {
                                   $heroStats = new StatsGameplayerHeroes();
                                   $heroStats->setPlayerId($dbPlayer->getId());
                                   $heroStats->setHero($hero);
                               }

  • Автор

Ну конечно же ПРАВИЛЬНО, у меня ТЕПЕРЬ всё работает как часики, блин, я так рад, что у меня что-то получаться начало и при этом, я понимаю что делаю. Спасибо вам огромнейшее.

 

Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например:

 

Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?

 

Я закончил, гляньте пожалуйста на наличие ошибок, как время будет. Функционал рабочий, все функции выполняет и записывает в БД.

heroesScore.php

Изменено пользователем TemKa_SD

Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например:

 

Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?

Документацию читали? :)

  • Автор

Не читал, обязательно почитаю )

  • Автор

Ничего не понял из документации (((

Допустим нужно достать 1 запись (таблица постов) из БД с определенной датой

$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();

Если запись существует, то мы получим массив с данными

Если записи не существует, то будет выброшено исключение UnderflowException, которое нужно поймать

Поэтому оборачиваем код в try/catch

try

{

$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();

}

catch (\UnderflowException $e)

{

}

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.