2014-12-02 3 views
0

только что начал использовать Laravel, но хочу убедиться, что использую его правильно.Действия базы данных Laravel 4 - контроллер или модель

Большая часть моей работы - это CMS, основанная на так называемом read/write/update и т. Д. В базе данных.

Пример того, что я сделал до сих пор является для вставки в БД:

На взгляд у меня есть форма с URL из «addNewUser».

В моих маршрутов я тогда делать:

Route::post('addnewuser', array('uses' => '[email protected]')); 

Мой контроллер пользовательский метод 'addNewUser' есть (упрощенно):

public function addNewUser() { 
    $data = Input::all(); 
    $rules = array(
     'username' => 'required|alpha_dash|max:16|unique:users,username', 
     ); 

    $validator = Validator::make($data, $rules, $messages); 

    if ($validator->fails()) 
    { 
     Input::flash(); 
     $errors = $validator->messages(); 
     return Redirect::to('/register')->withErrors($validator)->withInput(); 
    } 

    $user = new User; 
    $user->save(); 

    return Redirect::to('/login')->with('successLogin', '1'); 
} 

Правильно ли это? Я где-то читал, что все взаимодействия с БД должны быть в модели?

Аналогично при чтении из базы данных для отображения Еогеасп, например, я следующий непосредственно в окне просмотра:

$builds = DB::table('blogs')->orderBy('id', 'desc')->get(); 

if ($builds) { 

    foreach ($builds as $build) 
    { 
     $safeURLSlug = stringHelpers::safeURLSlug($build->blogtitle); 
     echo " 
     // stuff 
     "; 
    } 

} else { 
    // no stuff 
} 

Должен ли я делать эти рода запросов и показ данных непосредственно в окне просмотра? или в функции модели/контроллера и т. д.?

Хотите проверить, что я делаю вещи на 100% правильно/стандартный способ делать вещи, прежде чем я слишком вовлечен.

+0

Нет, это не должно быть сделано в контроллере, если вы хотите, чтобы код был повторно использован. Представьте, что у вас есть еще одна причина добавить пользователя, например. '/ users/add_batch', тогда вам нужно переписать все это для этого нового контроллера. Или вы хотите сделать это в командной строке (задание ремесленника или что-то еще) - вам нужно снова переписать этот материал. Вместо этого лучше создайте службу, метод на модели (что вам подходит), которая будет обрабатывать эту самую задачу и повторно использовать ее в вашем контроллере (ов)/cli. –

ответ

1

Я могу видеть несколько вещей, которые я лично сделал бы по-другому.

Например, я обычно кладу $rules в качестве переменной класса, поэтому его можно использовать в разных функциях, связанных с вашими пользователями.

Вы уже проверили ваш код? Любые ошибки?

В вашей функции addNewUser сохранятся ли данные? Я знаю, что у вас есть «упрощенный» над фрагментом кода, но между созданием переменной и запуском $user->save(); должно быть $user->username = $data['username']; и т. Д., Поэтому, если вы исключили это специально, я больше ничего не увижу с вашей моделью.

В вашем представлении кода, $builds = DB::table('blogs')->orderBy('id', 'desc')->get(); должно быть сделано в контроллере и передаются на ваш взгляд, как и return View::make('example', array('builds' => $builds))

Я также изменить

$builds = DB::table('blogs')->orderBy('id', 'desc')->get();

в

$builds = Blog::orderby('id','desc')->get(); если вы есть модель Blog, иначе ваш код в порядке.

1

Вы могли двигаться:

$rules = array(
     'username' => 'required|alpha_dash|max:16|unique:users,username', 
     ); 

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

$validator = Validator::make($data, $rules, $messages); 

вы можете использовать:

$validator = Validator::make($data, User::$rules, $messages); 

Но, безусловно, вы не должны получить данные из базы данных в вашем представлении, этот код должен быть в контроллере, например:

$builds = DB::table('blogs')->orderBy('id', 'desc')->get(); 
return View::make('someview')->with('builds', $builds); 

, конечно, если у вас есть Blog модель, вы должны использовать здесь:

$builds = Blog::orderBy('id', 'desc')->get(); 
return View::make('someview')->with('builds', $builds); 

Также неясно, что делает следующий код:

$safeURLSlug = stringHelpers::safeURLSlug($build->blogtitle); 

, но, вероятно, вы могли бы переместить его к вашему Blog модель и использование accessor внести изменения:

public function getSafeSlugAttribute($value) { 
    return stringHelpers::safeURLSlug($this->blogtitle); 
} 

и теперь ваш взгляд может выглядеть следующим образом:

@foreach ($builds as $build) 
     {{{ $build->title }}} {{{ $build->safeSlug }}} 
@endforeach 
+0

Хорошо, я медленно получаю картину. Я все еще должен делать сохранение/проверку и т. Д. В контроллере, но определяя правила в модели? – Lovelock

+0

@ user2921557 Ну, вы не делаете проверки в контроллере, вы используете модель 'Validator', и в этой модели делается валидация, вам нужно только что-то сделать с ее результатом в контроллере. Конечно, вы можете также создать отдельный метод в своей модели для проверки - например, в моем текущем проекте у меня есть validateEdit, validateAdd методы, потому что мне нужно использовать разные правила проверки в зависимости от действий или других данных –

0

Я предлагаю вам взглянуть на генераторы Laravel.

https://github.com/JeffreyWay/Laravel-4-Generators

Установить и запустить:

php artisan generate:scaffold customer 

генератора командной строки Laravel создать базовую CR для вас с контроллером, моделью, представлением и миграцией баз данных. Это хорошо для безопасного времени и сохранить ваш проект с какой-либо организацией по умолчанию.

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