2015-05-22 145 views
2

你能帮助我吗?我目前正在自学Laravel,我遵循Laracasts的教程,它很棒。在Laravel之前,我在我的项目中使用CodeIgniter和Opencart,并开始学习Laravel,因为我想学习一个新的框架。在Laravel中使用模型的正确方法是什么?

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

我有这种代码在控制器:

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

    } 

} 
+1

如果您有laracasts帐户,看看这个:https://laracasts.com/search?q=repositories&q-where=lessons –

+1

还有一句: http://ryantablada.com/post/the-repository-pattern-in-action –

回答

1

存储库对您来说是一个明智的决定。但为什么?
基本上,存储库是您的应用程序和存储之间的“网关”。
通过存储库,您可以在一个地方找到“数据库查询”。

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

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

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]); 
} 

通过这种做法,您可以使用testables控制器和美观的组织和设计进行清洁应用。 ;)

看,我试图尽可能地说服你,以了解这个概念。存储库的使用不仅是一种方法。所以我让评论中的链接。并让其他参考也在这里。
我相信你会很快理解。
成功学习! :)

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/

+0

感谢您的明确解释。我也会检查你的参考链接。 :) – Jerielle

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在存储库上有一些很好的视频。

+0

感谢您的好解释。我会阅读有关的。 :) – Jerielle

相关问题