Bon Référentiel de Conception de Modèle en PHP?

Préface: je suis d'essayer d'utiliser le modèle de référentiel dans une architecture MVC avec les bases de données relationnelles.

J'ai récemment commencé l'apprentissage du TDD en PHP, et je me suis rendu compte que ma base de données est couplée beaucoup trop étroite collaboration avec le reste de ma demande. J'ai lu sur des référentiels et à l'aide d'un Conteneur IoC à "injecter" dans mes contrôleurs. Des trucs très cools. Mais maintenant vous poser quelques questions pratiques au sujet de la conception du dépôt. Considérons l'exemple suivant.

<?php

class DbUserRepository implements UserRepositoryInterface
{
    protected $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function findAll()
    {
    }

    public function findById($id)
    {
    }

    public function findByName($name)
    {
    }

    public function create($user)
    {
    }

    public function remove($user)
    {
    }

    public function update($user)
    {
    }
}

Question n ° 1: Trop de champs

Toutes ces méthodes utilisent une sélectionnez tous les champs (SELECT *) approche. Cependant, dans mes applications, je suis toujours en essayant de limiter le nombre de champs que je reçois, comme souvent, cela ajoute de la surcharge et ralentit les choses. Pour ceux qui utilisent ce modèle, comment réagissez-vous face à cela?

Question n ° 2: Trop de méthodes

Alors que cette classe a l'air joli, maintenant, je sais que dans un monde réel application j'ai besoin de beaucoup plus de méthodes. Par exemple:

  • findAllByNameAndStatus
  • findAllInCountry
  • findAllWithEmailAddressSet
  • findAllByAgeAndGender
  • findAllByAgeAndGenderOrderByAge
  • Etc.

Comme vous pouvez le voir, il pourrait être une très, très longue liste de méthodes possibles. Et puis, si vous ajoutez dans le champ de sélection de la question ci-dessus, le problème s'aggrave. Dans le passé, j'avais normalement il suffit de mettre tous cette logique dans mon controller:

<?php

class MyController
{
    public function users()
    {
        $users = User::select('name, email, status')
            ->byCountry('Canada')->orderBy('name')->rows();

        return View::make('users', array('users' => $users));
    }
}

Avec mon référentiel approche, je ne veux pas terminer cette:

<?php

class MyController
{
    public function users()
    {
        $users = $this->repo->get_first_name_last_name_email_username_status_by_country_order_by_name('Canada');

        return View::make('users', array('users' => $users))
    }

}

Question n ° 3: Impossible de faire correspondre une interface

Je vois l'avantage de l'utilisation des interfaces pour les dépôts, donc je peux échanger mes de mise en œuvre (à des fins de test ou autres). Ma compréhension des interfaces, qu'elles définissent un contrat qu'une mise en œuvre doit suivre. C'est génial jusqu'à ce que vous commencez à ajouter des méthodes supplémentaires pour vos dépôts comme findAllInCountry(). Maintenant, j'ai besoin de mettre à jour mon interface d'avoir aussi cette méthode, sinon, d'autres implémentations sont peut-être pas, et qui pourraient briser ma demande. Par ce sent fou...un cas de la queue qui remue le chien.

Spécification De Modèle?

Cela me mène à croire que le référentiel ne devrait avoir qu'un nombre fixe de méthodes (comme save(), remove(), find(), findAll(), etc). Mais alors, comment puis-je effectuer des recherches? J'ai entendu parler de la Spécification Du Modèle, mais il me semble que cela ne réduit tout un ensemble d'enregistrements (via IsSatisfiedBy()), qui a clairement les principaux problèmes de performances si vous êtes en tirant à partir d'une base de données.

Aider?

Clairement, j'ai besoin de repenser les choses un peu lorsque l'on travaille avec des dépôts. Quelqu'un peut-il éclairer sur la façon dont cela se fait?

InformationsquelleAutor Jonathan | 2013-04-23