Pokemon GO - jak to jest zrobione

Niedawno świat opanowała bardzo dziwna moda, miliony ludzi odeszło nagle od komputerów w celu łapania nieistniejących stworków za pomocą swoich telefonów. Rozgrywka jest o tyle ciekawa, że jej akcja odbywa się w zasadzie wszędzie dookoła nas. Mapa gry to nic innego jak bardzo sprytne wykorzystanie Google maps oraz pozycji GPS odczytywanej z telefonu gracza. W tym wpisie przedstawię mniej więcej w jaki sposób działa klient gry przez co nietrudno będzie się domyślić sposobu działania serwera.

Pokemon Go

Avatar użytkownika - upload plików

Upload plików, wydawało by się proces trywialny jednak wystarczy rzucić okiem na dokumentację Doctrine dla Symfony aby zobaczyć jak bardzo można ten proces skomplikować.

// src/AppBundle/Entity/Document.php
namespace AppBundle\Entity;

class Document
{
    public $id;

    public $name;

    public $path;

    public function getAbsolutePath()
    {
        return null === $this->path
            ? null
            : $this->getUploadRootDir().'/'.$this->path;
    }

    public function getWebPath()
    {
        return null === $this->path
            ? null
            : $this->getUploadDir().'/'.$this->path;
    }

    protected function getUploadRootDir()
    {
        // the absolute directory path where uploaded
        // documents should be saved
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // get rid of the __DIR__ so it doesn't screw up
        // when displaying uploaded doc/image in the view.
        return 'uploads/documents';
    }
}

Przykład nie dość, że skomplikowany (prostego kodu nie trzeba oszpecać komentarzami) to jeszcze może okazać się tragiczny w skutkach. Dlaczego dokument, reprezentujący plik ma decydować o tym gdzie jest zapisany? To tak jakby adres email miał decydować czy jest unikalny w kontekście systemu. Zarówno plik jak i email to wartości, wartości istniejące w jakimś kontekście. Wymuszanie na pliku aby wiedział pod jaką nazwą jest zapisany to prawie to samo co wymuszanie na adresie email aby potrafił sprawdzić czy jest unikalny.

Save repository from save

Repozytorium, reprezentacja kolekcji pozwalająca na uzyskanie dostępu do obiektów domenowych.
Czy jednak repozytorium powinno również zajmować się aktualizowaniem stanu obiektów i zapisywaniem tego stanu?

interface Repository 
{
    public function add(Object $object);

    public function remove(Object $object);

    public function getBy(Criteria $criteria);

    public function hasAnyMatching(Criteria $criteria);

    public function update(Object $object);
}

public function update(Object $object); tego w ogóle nie powinno tu być!

Akceptuję

Ten serwis używa plików cookies. Więcej o plikach cookies.