2016-08-05 4 views
2

Итак, у меня есть вопрос о том, как это сделать наилучшим образом. И я даже не уверен, что делаю это правильно.Лучшая практика для доступа к модели с контроллера в Laravel

У меня есть страница настроек, где пользователь может обновить некоторые настройки. Когда форма отправляется, нижеприведенный метод заботится о запросе, как вы можете видеть.

У меня есть модель Profile, а также модель User, и их отношения также настроены правильно.

Но, как вы можете видеть, все делается в контроллере в этом методе. Я вообще не использую модель Profile. Но разве я не должен?

Какой метод я мог бы использовать и использовать в модели Profile, чтобы я мог делать меньше в контроллере?

Извините, если это неуместный вопрос.

Заранее спасибо.

/** 
* @return mixed 
* 
* Process general settings 
*/ 
public function postEditGeneralSettings() { 

    // Validate 
    $val = Validator::make([ 
     'show_age' => Input::get('show_age'), 
     'show_gender' => Input::get('show_gender') 
    ], [ 
     'show_age' => 'sometimes|boolean', 
     'show_gender' => 'sometimes|boolean' 
    ]); 

    if ($val -> fails()) { 
     return $this -> backWithErrors($val); 
    } 

    // Update 
    Auth::user() -> profile() -> update([ 
     'show_age' => Input::get('show_age'), 
     'show_gender' => Input::get('show_gender') 
    ]); 

    return $this -> backWithSuccess('Innstillingene ble lagret!'); 

} 
+0

Выглядит неплохо. Я просто предлагаю вам использовать запрос формы вместо 'Validator :: make', потому что тогда у вас есть лучший SOC. –

+0

А, я вижу. Должен ли быть новый класс запросов для каждого нового почтового процесса? Например, editGeneralSettings, editSecuritySettings, editText, editStatus? – Kaizokupuffball

ответ

2

Вы можете использовать Repository класс вытолкнуть ResponsAbility хранения данных от контроллера:

class UserRepository 
{ 
    //rules for validation, as an alternative you can put them in your User Model 
    public static $rules = [ 
     'title' => 'required|unique|max:255', 
     'body' => 'required', 
    ]; 

    public function updateUserProfile($user, $data) 
    { 
     $user->profile()->update([ 
     'show_age' => $data('show_age'), 
     'show_gender' => $data('show_gender') 
    ]);   
} 

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

public function postEditGeneralSettings(UserRepository $repo) 
{  
    //an alternative to your validation, using the ValidatesRequests trait of the controller 
    //this will give the same results of your validation, but is more concise 
    $this->validate(CUserRepository::$rules, Input::all()); 

    // Update using the repository 
    $repo->update(Auth::user(), Input::all()); 

    return $this->backWithSuccess('Innstillingene ble lagret!'); 
} 
+0

Я постараюсь реализовать это. Мне просто интересно, где бы я поместил этот класс в структуру папок (есть ли команда CLI, которую я мог бы использовать для создания класса)? И мне нужно много классов репозитория? Или только один для каждой вещи (UserRepo, ProfileRepo, GalleryRepo, MessagesRepo)? – Kaizokupuffball

+0

Я стараюсь не полагаться на Фасады, поскольку они практически являются ярлыками. По моему предложению, этот метод получит класс FormRequest вместо UserRepository, а правила проверки будут в классе FormRequest. Вы также можете ввести репозиторий в конструкцию контроллера. Для шаблона репозитория я предлагаю github.com/andersao/l5-repository, который является практически полным решением. –

+0

@Kaizokupuffball: какие репозитории использовать и где их разместить, зависит от ваших потребностей. Обычно я использую один репозиторий для каждой модели. – Moppo

1

As Марко сказал, ничего плохого здесь.

Вы также можете использовать вызов метода по умолчанию validate для проверки, а не для создания конкретного запроса формы. Как правило, я обращаюсь к определенным классам запросов формы, если проверка становится сложной, в противном случае inline является совершенным. Что хорошо с функцией validate, она выдает исключение проверки, которое поймано и перенаправляется обратно с установленными ошибками и т. Д.

Также нет ничего плохого в использовании Eloquent для того, что это такое, охватывая активный шаблон записи. Если вы хотите быть более ясными, вы можете обернуть обновление следующим образом.

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