2013-11-25 2 views
0

Прочитайте много книг о Laravel 4 и это структурирование с использованием интерфейсов и реализаций через контейнер IoC. Так что теперь из всей этой информации я ничего не понимаю.Структура приложения Laravel 4: как организовать пользовательские и его профильные модели с использованием принципов SOLID

В примере я иметь такую ​​структуру:

app 
-- config 
-- database 
-- lang 
-- ... 
-- logic 
-- -- MyAPP 
-- -- -- Controllers 
-- -- -- Interfaces 
-- -- -- Libraries 

-- -- -- Models 
-- -- -- -- User 
-- -- -- -- -- Profile.php 
-- -- -- -- -- User.php 

-- -- -- Repositories 
-- -- -- ServiceProviders 

У меня модель пользователя и модель профиля, которая не может существовать без пользовательской модели, потому что она имеет отношение один к одному.

В примере я пользовательский интерфейс:

interface UserInterface 
{ 
    public function find($userId); 

    public function findProfile($userId); 

    public function replace($userId, $attributes, $profileAttributes); 
} 

И реализация, которая выглядит следующим образом:

class UserRepository implements UserInterface 
{ 
    protected $user; 

    protected $profile; 

    public function __construct(Model $user, Model $profile) 
    { 
     $this->user = $user; 

     $this->profile = $profile; 
    } 

    public function find($userId) 
    { 
     return $this->user->find($userId); 
    } 

    public function findProfile($userId) 
    { 
     return $this->profile->where('user_id', $userId)->first(); 
    } 

    public function replace($userId, $attributes, $profileAttributes) 
    { 
     // 
    } 
} 

Так что мой вопрос, что это хорошая практика, если я пытаюсь реализовать SOLID принципов, UserRepository вводит две модели User и Profile, или это был бы правильный способ создать ProfileInterface и ввести его в UserRepository, чтобы было что-то вроде этого:

public function __construct(Model $user, ProfileInterface $profile) 

Вещь, которую я не могу понять, является правильным способом организации зависимостей. Потому что я думаю, что ProfileInterface должен иметь всю функциональность профиля, но с другой стороны он не может существовать без Пользователя, потому что мы создаем пользователя в таблице, а затем добавляем во вторую таблицу user_profiles его детали.

Где лучше хранить функциональность. пользователя и его функции UserProfile в одном интерфейсе - UserInterface или в отдельных интерфейсах: UserInterface и ProfileInterface, которые вводятся в UserInterface?

И если ProfileInterface вводится в UserInterface, как я должен создать нового пользователя (используя Eloquent)?

+0

Вы когда-нибудь загружаете пользователя без загрузки своего профиля? –

+0

Нет, я всегда получаю доступ к $ user и получаю доступ к его профилю через такие отношения; $ user-> profile-> some_profile_field, где profile - это метод отношений, который указывает на модель профиля – user991

ответ

0

На основании вашего комментария, я не вижу необходимости в ProfileRepository, поскольку он по своей сути связан с моделью User. И если вы всегда возвращающая User с их Profile то я хотел бы сделать несколько вещей -

  1. Убедитесь, что User модель имеет отношения с Profile модели. Например, belongsTo. См.: http://laravel.com/docs/eloquent#relationships
  2. В репозитории загружайте Profile с помощью User. См.: http://laravel.com/docs/eloquent#eager-loading

Я также не обязательно передавал бы модель User в конструкторе. Вероятно, лучше передать его только тем методам, которые ему нужны.

public function find($id) 
{ 
    // returns User with Profile, if you have relationships set up 
    return User::with('profile')->find($id); 
} 

public function save(User $user) 
{ 
    // do some save logic here, like: 
    $user->save(); 
} 

... и так далее.

+0

. Я думаю, что если вы будете использовать User :: в статическом порядке, вы будете тормозить один из принципов SOLID, поэтому хранилище будет менее проверяемым.Но я согласен с ответом, что можно использовать только модель пользователя. Тогда у меня есть другой вопрос. Как будет выполняться сохранение нового пользователя? Может быть что-то подобное: $ user = $ this-> user-> create ($ attributes); $ user-> profile-> somefield = 'somevalue'; ? $ user-> profile-> save() ??? – user991

+0

Использование модели статически подобно тому, как разработан проект «Красноречивый»; если вы не используете этот метод, вы не используете Eloquent, и вам нужно будет разработать немного дальше. –

+0

Одна из книг, которую я прочитал, была «Реализация Ларавеля Крисом Фидао». Книга посвящена структуре l4 с использованием интерфейсов. Вот пример Repo: https://github.com/fideloper/Implementing-Laravel/blob/master/app/Impl/Repo/Status/EloquentStatus.php. Он не использует Eloquent staticaly нигде в своем коде. Какая логика правильная? Его или его? – user991

Смежные вопросы