在Laravel 5中调用模型中的方法

时间:2015-09-16 14:56:27

标签: php laravel laravel-5.1

我创建了一个名为Hangman的模型。在控制器内部,我在数据库中插入一行,如下所示

$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);

命名空间是正确的。

我知道这是非常基本的,谢谢你们

2 个答案:

答案 0 :(得分: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'));
}

答案 1 :(得分:1)

除非方法是静态的,否则你不能用:: double冒号调用方法。因此,您应该将方法更改为静态方法。

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

你实际上是以错误的方式做这件事。 insert方法必须在Controller中,而不是在模型内。将插入方法移动到Controller并使用它。在Controller中创建Model的实例是正确的方法。

现在,您正在尝试在同一个类中创建一个类的实例(Hangman中的Hangman)。在MVC架构中,这不是正确的方法。