在Laravel中使用模型的正确方法是什么?

时间:2015-05-22 02:36:48

标签: php laravel opencart

你能帮我解决这个问题吗?我目前正在自己​​学习Laravel,我按照Laracasts中的教程进行操作,这很棒。在Laravel之前我在我的项目中使用CodeIgniter和Opencart,然后我开始学习Laravel,因为我想学习一个新的框架。

在CI和Opencart中,所有数据库查询都在模型中。但是在Laravel中你可以在Controller中执行和查询吗?这是Laravel中查询的正确方法吗?

我在Controller中有这样的代码:

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\Article;
use Illuminate\Http\Request;

class ArticlesController extends Controller {

    public function index() {

        $articles = Article::all();

        return view('articles.index')->with('articles', $articles);

    }

}

2 个答案:

答案 0 :(得分:3)

是的,这对于小型应用程序来说非常好。 但是对于大型应用程序,我建议使用存储库,因为它们将模型与控制器分离 - 这使得它们更具可读性和可测试性。

你的ArticlesController会翻译成这样的东西:

<?php namespace App\Http\Controllers;

use App\Repositories\Articles\ArticleRepositoryInterface;

class ArticlesController extends Controller {

    private $articles;

    public function __construct(ArticleRepositoryInterface $articles)
    {
        $this->articles = $articles;
    }

    public function index()
    {
        return view('articles.index')
            ->with('articles', $this->articles->all());
    }

}

查看Laravels Service Container以了解 ArticleRepositoryInterface 的自动解决方案。 Laracasts在存储库中有一些很好的视频。

答案 1 :(得分:1)

存储库是您明智的决定。但为什么呢?
基本上,存储库是一个&#39;网关&#39;在您的应用程序和存储之间 使用存储库,您可以找到您的数据库查询&#39;在一个地方。

让我们考虑模型文章。
您不需要使用文章的静态实例,而是需要使用它(Articles::find()Articles::all()等),而只需创建文章存储库。
在您的控制器(例如)中注入此回购,并使用&#39;功能&#39;存储在ArticleRepository中。

你是什么意思?
让我们考虑一下文章库。我在我的应用文章模型中多次使用了什么?我需要选择全部,按ID选择,插入,更新,删除。基本上这些&#39;东西&#39;。那么,如果我把所有这些东西放在一个地方?

class ArticleRepository {

    public function all(){}
    public function getById($id){}
    public function insert($data){}
    public function update($data){}
    public function delete($id){}

}

在控制器中注入此ArticleRepository。为此,请在此处阅读有关IoC容器的信息:http://laravel.com/docs/5.0/container

控制器中的构造将如下所示:

public function __construct(ArticleRepository $articles)
{
    $this->articles = $articles;
}

完成所有操作后,当您需要获取控制器中的所有文章时,只需执行以下操作:

public function index()
{
    $articles = $this->articles->all();
    return View::make('articles.index')->with(['articles' => $articles]);
}

通过这种做法,您可以获得具有可测试控制器和漂亮的组织和设计的干净应用程序。 ;)

看,我试着尽可能地教你理解这个概念。使用存储库不仅是一种方法。所以我在评论中放了链接。并在此处提及其他参考文献 我相信你会很快理解的。
成功学习! :)

https://laracasts.com/search?q=repositories&q-where=lessons
http://ryantablada.com/post/the-repository-pattern-in-action
http://culttt.com/2014/03/17/eloquent-tricks-better-repositories/
http://culttt.com/2013/07/15/how-to-structure-testable-controllers-in-laravel-4/