上一节介绍了Laravel的Eloquent ORM模型,这一节接着介绍控制器如何通过模型获得数据,并传送给视图显示。下面通过一个小例子来介绍。
一、注册路由
对于简单的路由,可以直接把第二个参数定义为一个 function()
:
Route::get('foo', function(){ return 'Bar'; });
而这里我们通过调用控制器中的方法来实现:
Route::get('articles', 'ArticlesController@index');
二、创建控制器
通过Laravel的 artisan
命令行生成控制器:
php artisan make:controller ArticlesController --plain
这时在 app/Http/Controllers 目录下就多出了一个 ArticlesController.php 文件,打开文件编辑内容如下:
<?php namespace App\Http\Controllers; // 这里需要导入命名空间 use App\Article; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class ArticlesController extends Controller { public function index(){ $articles = Article::all(); return $articles; } }
这里在浏览器中访问 articles 路由,可以看到已经把上一节添加的文章以 JSON 格式输出出来了。
因为我们需要把结果输出到视图,所以修改 index()
方法为:
public function index(){ $articles = Article::all(); return view('articles.index', compact('articles')); //或者也可以使用这种方式 //return view('articles.index')->with('articles', $articles); }
三、建立视图文件
在前面介绍 Blade模版 时已经创建了一个基础模版 main.blade.php ,下面的视图文件都使用该模版来生成。
在 resources/views 目录下创建 articles 文件夹,然后在里面 index.blade.php 文件:
@extends('main') @section('content') <h1>Articles</h1> <hr/> @foreach($articles as $article) <article> <h2>{{ $article->title }}</h2> <div class="body">{{ $article->body }}</div> </article> @endforeach @stop
浏览器中重新访问 articles 路由,可以看到已经把所有文章列出来了。
查看单个文章
上面列出了所有文章,那么如何查看单个文章呢?
- 首先注册路由
在 route.php 中添加下面代码:
Route::get('articles/{id}', 'ArticlesController@show');
其中 {id}
是传入 show()
方法的参数。
- 定义
show()
方法
在 ArticlesController.php 中添加:
public function show($id){ return $id; }
在浏览器访问 http://laravel.dev/articles/foo ,可以看到页面输出 foo ,也就是参数传入成功。
现在把 show() 方法修改为:
public function show($id){ $article = Article::find($id); // 找不到文章,抛出404 if(is_null($article)){ abort(404); } return view('articles.show', compact('article')); }
对于找不到的情况,Laravel 提供了一个 findOrFail()
方法,所以上面的代码可以简化为:
public function show($id){ $article = Article::findOrFail($id); return view('articles.show', compact('article')); }
- 建立 show.blade.php 视图文件:
@extends('main') @section('content') <h1>{{ $article->title }}</h1> <article>{{ $article->body }}</article> @stop
在浏览器访问 http://laravel.dev/articles/1,可以看到已经可以输出单个文章的内容了。
- 给列表中文章标题添加链接
修改 index.blade.php 视图文件:
@extends('main') @section('content') <h1>Articles</h1> <hr/> @foreach($articles as $article) <article> <h2> {{--方法一--}} {{--<a href="/articles/{{$article->id}}">{{ $article->title }}</a>--}} {{--方法二--}} {{--<a href="{{ action('ArticlesController@show', [$article->id]) }}">{{ $article->title }}</a>--}} {{--方法三--}} <a href="{{ url('/articles', $article->id) }}">{{ $article->title }}</a> </h2> <div class="body">{{ $article->body }}</div> </article> @endforeach @stop
上面的三种方法都可以生成链接,可以选择自己喜欢的方式。
该篇属于专题:《Laravel 5 基础视频教程学习笔记》
shea 2015/11/12 15:29
@extends('main') @section('content') Articles @foreach($articles as $article) {{--方法一--}} {{--id}}">{{ $article->title }}--}} 我的页面为啥非得在articles前面再加上index.php这个呢?
Specs 2015/11/12 15:47
@ 哪有index.php?
shea 2015/11/12 16:36
@ 就是我的链接必须是这个:a href="index.php/articles/{{$article->id}才成功跳转,这是为啥?
Specs 2015/11/12 16:38
@ 你访问其他的时候要加 index.php 吗?应该是你没设置 .htaccess 的问题吧
shea 2015/11/12 16:41
@ 原来如此,懂了!!!非常感谢!!!
Element 2017/04/27 15:17
@ 因为你控制器写在那个下面
Element 2017/04/27 15:19
foreach ($goods as &$v) { $brand[] = $v['brand']; $detail = DB::table('gdetail') ->where('gid',$v['id']) ->select('id') ->first(); $picture = DB::table('gpicture') ->where('gdid',$detail['id']) ->select('picture') ->first(); $v['picture'] = $picture['picture']; // dd($v); }结果为什么$goods里面没有picture
Specs 2017/05/06 16:32
@ $v 里面有吗?