我创建了一个名为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);
命名空间是正确的。
我知道这是非常基本的,谢谢你们
答案 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架构中,这不是正确的方法。