2015-09-16 3 views
1

Я создал модель под названием Hangman. Внутри контроллера я вставляю строку в базу данных, такую ​​какВызвать метод в модели в Laravel 5

$hangman = new Hangman(); 
$hangman->word = 'exampleWord'; 
$hangman->lives = 3; 
$hangman->save(); 

Пока все хорошо.

У меня есть два вопроса:

1) Является ли это лучше всего держать вставки вещи в контроллере?

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

public function insert($word, $lives) 
{ 
    $hangman = new Hangman(); 
    $hangman->word = $word; 
    $hangman->lives = $lives; 
    $hangman->save(); 

    return $hangman; 
} 

Итак, мой вопрос (предполагая, что вопрос 1 НЕТ) является:

2) Как я могу назвать этот метод с контроллера?

Это не работает

\App\Hangman::insert('exampleword', 4); 

Namespaces являются правильными.

Я знаю, что это очень простой, спасибо, ребята

+0

Нет проблем, чтобы иметь этот код в контроллере. Функции модели инкапсулированы, поэтому вы можете иметь этот код в контроллере. Посмотрите на Laravel Guide: http://laravel.com/docs/5.1/eloquent#basic-inserts –

+0

@ JavierNúñez Я знаю, что могу иметь его, просто я не хочу иметь 4 или 5 строк, если смогу имеют только одну строку с вызовом вставки. Thanks – godsaway

ответ

3

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

Что касается вашего второго вопроса: поскольку вы находитесь в модели Hangman, вы должны сделать статичный самореферентный вызов, а также сам метод.

public static function insert($word, $lives) 
{ 
    $hangman = new static; 
    $hangman->word = $word; 
    $hangman->lives = $lives; 
    $hangman->save(); 

    return $hangman; 
} 

И этого должно быть достаточно. Вы также можете сэкономить несколько строк:

public static function insert($word, $lives) 
{ 
    return static::create(compact('word', 'lives')); 
} 
+0

Wow! Это изящное решение! Да, вы правы в первом вопросе, просто я не чувствую, что у вас чистое 4 или 5 линий в контроллере, когда у вас может быть только один. – godsaway

+0

Это определенно справедливая проблема. Я считаю, что у Джеффри Уэй есть несколько видео по этому поводу на Laracasts.com, но прошло довольно много времени, поэтому я не уверен, что они будут. –

1

Вы не можете вызвать метод с :: double colons, если метод не является статическим. Поэтому вы должны изменить свой метод на статический метод.

public static function insert($word, $lives) 
{ 
    // logic 
} 

Вы на самом деле делаете это неправильно. Метод вставки должен находиться в контроллере, а не внутри модели. Переместите свой метод вставки на контроллер и используйте его. Создание экземпляра модели внутри Контроллера - правильный способ сделать это.

Прямо сейчас вы пытаетесь создать экземпляр класса внутри того же класса (Hangman in Hangman). Это не правильный способ сделать это в архитектуре MVC.

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