欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

[Laravel 5 教程学习笔记] 九、基础的模型、控制器、视图流程 有大用

shiping1 的头像

上一节介绍了Laravel的Eloquent ORM模型,这一节接着介绍控制器如何通过模型获得数据,并传送给视图显示。下面通过一个小例子来介绍。

 

一、注册路由

对于简单的路由,可以直接把第二个参数定义为一个 function() :


  1. Route::get('foo', function(){

  2. return 'Bar';

  3. });

而这里我们通过调用控制器中的方法来实现:


  1. Route::get('articles', 'ArticlesController@index');

二、创建控制器

通过Laravel的 artisan 命令行生成控制器:


  1. php artisan make:controller ArticlesController --plain

这时在 app/Http/Controllers 目录下就多出了一个 ArticlesController.php 文件,打开文件编辑内容如下:


  1. <?php namespace App\Http\Controllers;

  2.  

  3. // 这里需要导入命名空间

  4. use App\Article;

  5. use App\Http\Requests;

  6. use App\Http\Controllers\Controller;

  7.  

  8. use Illuminate\Http\Request;

  9.  

  10. class ArticlesController extends Controller {

  11.  

  12. public function index(){

  13.  

  14. $articles = Article::all();

  15. return $articles;

  16. }

  17.  

  18. }

这里在浏览器中访问 articles 路由,可以看到已经把上一节添加的文章以 JSON 格式输出出来了。

因为我们需要把结果输出到视图,所以修改 index() 方法为:


  1. public function index(){

  2. $articles = Article::all();

  3.  

  4. return view('articles.index', compact('articles'));

  5. //或者也可以使用这种方式

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

  7. }

三、建立视图文件

在前面介绍 Blade模版 时已经创建了一个基础模版 main.blade.php ,下面的视图文件都使用该模版来生成。

在 resources/views 目录下创建 articles 文件夹,然后在里面 index.blade.php 文件:


  1. @extends('main')

  2.  

  3. @section('content')

  4. <h1>Articles</h1>

  5. <hr/>

  6.  

  7. @foreach($articles as $article)

  8. <article>

  9. <h2>{{ $article->title }}</h2>

  10. <div class="body">{{ $article->body }}</div>

  11. </article>

  12. @endforeach

  13. @stop

浏览器中重新访问 articles 路由,可以看到已经把所有文章列出来了。

laravel-view-articles

查看单个文章

上面列出了所有文章,那么如何查看单个文章呢?

  • 首先注册路由

在 route.php 中添加下面代码:


  1. Route::get('articles/{id}', 'ArticlesController@show');

其中 {id} 是传入 show() 方法的参数。

  • 定义 show() 方法

在 ArticlesController.php 中添加:


  1. public function show($id){

  2. return $id;

  3. }

在浏览器访问 http://laravel.dev/articles/foo ,可以看到页面输出 foo ,也就是参数传入成功。

现在把 show() 方法修改为:


  1. public function show($id){

  2. $article = Article::find($id);

  3.  

  4. // 找不到文章,抛出404

  5. if(is_null($article)){

  6. abort(404);

  7. }

  8.  

  9. return view('articles.show', compact('article'));

  10. }

对于找不到的情况,Laravel 提供了一个 findOrFail() 方法,所以上面的代码可以简化为:


  1. public function show($id){

  2. $article = Article::findOrFail($id);

  3. return view('articles.show', compact('article'));

  4. }

  • 建立 show.blade.php 视图文件:


  1. @extends('main')

  2.  

  3. @section('content')

  4. <h1>{{ $article->title }}</h1>

  5. <article>{{ $article->body }}</article>

  6. @stop

在浏览器访问 http://laravel.dev/articles/1,可以看到已经可以输出单个文章的内容了。

  • 给列表中文章标题添加链接

修改 index.blade.php 视图文件:


  1. @extends('main')

  2.  

  3. @section('content')

  4. <h1>Articles</h1>

  5. <hr/>

  6.  

  7. @foreach($articles as $article)

  8. <article>

  9. <h2>

  10. {{--方法一--}}

  11. {{--<a href="/articles/{{$article->id}}">{{ $article->title }}</a>--}}

  12. {{--方法二--}}

  13. {{--<a href="{{ action('ArticlesController@show', [$article->id]) }}">{{ $article->title }}</a>--}}

  14. {{--方法三--}}

  15. <a href="{{ url('/articles', $article->id) }}">{{ $article->title }}</a>

  16. </h2>

  17. <div class="body">{{ $article->body }}</div>

  18. </article>

  19. @endforeach

  20. @stop

上面的三种方法都可以生成链接,可以选择自己喜欢的方式。


 

本文共 5 个回复

  •  

    shea 2015/11/12 15:29

    @extends('main') @section('content') Articles @foreach($articles as $article) {{--方法一--}} {{--id}}">{{ $article->title }}--}} 我的页面为啥非得在articles前面再加上index.php这个呢? :sad:

    •  

      shea 2015/11/12 16:36

      @ Specs 就是我的链接必须是这个:a href="index.php/articles/{{$article->id}才成功跳转,这是为啥?

    •  

      shea 2015/11/12 16:41

      @ Specs 原来如此,懂了!!!非常感谢!!! :arrow:

       
    •  
    •  

      Specs  2015/11/12 16:38

      @ shea 你访问其他的时候要加 index.php 吗?应该是你没设置 .htaccess 的问题吧

    •  

      Specs  2015/11/12 15:47

      @ shea 哪有index.php?


    来自 http://9iphp.com/web/laravel/basic-model-controller-view-workflow.html

    普通分类: