@52fhy
        
        2016-04-28T03:51:13.000000Z
        字数 7215
        阅读 399
    PHP
本文以laravel5.0.22为例。
本节以新建一个简单的博客作为实例。学完本文,你应该能够使用Laravel5写个简单的博客。
.env文件(也可以直接修改config/database.php)
DB_HOST=localhostDB_DATABASE=myblogDB_USERNAME=rootDB_PASSWORD=123456
数据库表:
CREATE TABLE `blog` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`uid` int(11) NOT NULL DEFAULT '0',`title` varchar(50) NOT NULL DEFAULT '',`content` text NOT NULL,`flag` tinyint(2) NOT NULL DEFAULT '1',`create_time` int(11) NOT NULL DEFAULT '0',`update_time` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
这里暂时不使用Eloquent ORM,直接使用DB类。
新建一个控制器:app/Http/Controllers/BlogController.php
<?phpnamespace App\Http\Controllers;use Illuminate\Support\Facades\DB;/**** @author YJC**/class BlogController extends Controller{public function index() {$list = DB::table('blog')->get();//需要returnreturn view('blog.index', ['list' => $list]);}}
新建一个母版视图:resources/views/blog/layout.blade.php
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Laravel</title><link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"></head><body>@yield('content')<!-- Scripts --><script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script><script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script></body></html>
新建一个普通视图:resources/views/blog/index.blade.php
@extends('blog.layout')@section('content')@foreach($list as $blog)<div><h1>{{$blog->title}}</h1><p>{{$blog->content}}</p></div>@endforeach@endsection
Route::get('blog', 'BlogController@index');
访问
http://localhost/laravel5/public/index.php/blog
即可。
默认的,每新增一个方法,需要写一条路由,比较繁琐。Laravel支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是: 
1) 控制器里方法必须以get、post开头。 
2) Route::get()改成Route::controller()。
示例:上面的index方法我们需要改成getIndex,路由这样写:
Route::controller('blog', 'BlogController');
这样,Blog控制器所有的方法都能被路由匹配。例如,有如下方法:
public function getIndex(){}public function getDetail(){}public function postAdd(){}
都可以被匹配。访问的时候直接:
http://localhost/laravel5/public/index.php/blog/indexhttp://localhost/laravel5/public/index.php/blog/detail/2http://localhost/laravel5/public/index.php/blog/add
控制器新增getDetail()方法:
public function getDetail($id) {$blog = DB::table('blog')->find($id);return view('blog.detail', ['blog' => $blog]);}
更改index.blade.php:
@extends('blog.layout')@section('content')@foreach($list as $blog)<div><h1><a href="{{url('blog/detail/'.$blog->id)}}">{{$blog->title}}</a></h1><p>{{$blog->content}}</p></div>@endforeach@endsection
新增文章详情试图页blog/detail.blade.php:
@extends('blog.layout')@section('content')<div class="jumbotron"><h1>{{$blog->title}}</h1><p>{{$blog->content}}</p></div>@endsection
更改路由:
//对应blog/indexRoute::get('blog', 'BlogController@index');//对应blog里任何方法,注意方法要加get或者postRoute::controller('blog', 'BlogController');
上面我们一直用的是DB类。接下来我们将使用Eloquent ORM代替DB类。
Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动。 每个数据库表对应一个模型文件。
在app下新建Blog.php:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;/*** @author YJC**/class Blog extends Model{//指定表名,不指定系统会默认自动对应名称为「类名称的小写复数形态」的数据库表protected $table = 'blog';//指定主键,默认就是idprotected $primaryKey = 'id';//默认情况下,在数据库表里需要有 updated_at 和 created_at 两个字段。如果您不想设定或自动更新这两个字段,则将类里的 $timestamps 属性设为 false即可public $timestamps = false;}
提示:所有DB类里查询构造器里的方法,查询 Eloquent 模型时也可以使用。
复制BlogController.php为BlogController.php.bak,清空原BlogController.php里面内容,改为如下内容:
<?phpnamespace App\Http\Controllers;//需要use模型use App\Blog;/**** @author YJC**/class BlogController extends Controller{public function index() {$list = Blog::all();return view('blog.index', ['list' => $list]);}public function getDetail($id) {$blog = Blog::find($id);return view('blog.detail', ['blog' => $blog]);}}
Eloquent ORM提供了很多易用的方法来操作数据库。例如:
在Blog.php模型文件里,我们可以使用以下查询方法(Eloquent ORM同时支持$this和静态方式调用):
//取出所有记录,all()得出的是对象集合,可以遍历$this->all()->toArray();//根据主键取出一条数据$one = $this->find('2');return array($one->id,$one->title,$one->content,);//查找id=2的第一条数据$this->where('id', 2)->first()->toArray();//查找id>0的所有数据$this->where('id', '>', '0')->get()->toArray();//查找id>0的所有数据,降序排列$this->where('id', '>', '0')->orderBy('id', 'desc')->get()->toArray();//查找id>0的所有数据,降序排列,计数$this->where('id', '>', '0')->orderBy('id', 'desc')->count();//offset,limit$this->where('id', '>', '0')->orderBy($order[0], $order[1])->skip($offset)->take($limit);//等同于$this->where('id', '>', '0')->orderBy($order[0], $order[1])->offset($offset)->limit($limit);
更多操作方法详见:http://www.golaravel.com/laravel/docs/5.0/eloquent/
访问http://localhost/laravel5/public/index.php/blog页面看看吧!
建立新视图:blog/add.blade.php:
@extends('blog.layout')@section('content')<div class="container"><div class="row"><div class="col-md-10 col-md-offset-1"><div class="panel panel-default"><div class="panel-heading">新增博客</div><div class="panel-body"><!--错误信息输出-->@if (count($errors) > 0)<div class="alert alert-danger"><strong>Whoops!</strong> 输入的格式不正确!<br><br><ul>@foreach ($errors->all() as $error)<li>{{ $error }}</li>@endforeach</ul></div>@endif<!--表单--><form action="{{ URL('blog/add') }}" method="POST"><input type="hidden" name="_token" value="{{ csrf_token() }}"><input type="text" name="title" class="form-control" required="required"><br><textarea name="content" rows="10" class="form-control" required="required"></textarea><br><button class="btn btn-lg btn-info">新增</button></form></div></div></div></div></div>@endsection
在目视图blog/layout.blade.php新增一个新增按钮:
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Laravel</title><link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"></head><body><!--新增按钮--><header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner"><div class="container"><nav id="bs-navbar" class="collapse navbar-collapse"><ul class="nav navbar-nav"><li><a href="{{url('blog/add')}}">新增</a></li></ul></nav></div></header>@yield('content')<!-- Scripts --><script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script><script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script></body></html>
控制器新增:
/*** 显示新增页面*/public function getAdd() {return view('blog.add');}/*** 执行新增动作*/public function postAdd(Request $request) {//执行表单验证 http://laravel-china.org/docs/5.0/validation$this->validate($request, ['title' => 'required|max:255','content' => 'required',]);//如何获取post过来的title和content等字段信息?//方法一:使用传统方法// $data = $_POST;//方法二:通过 Facade Request。必须导入 Illuminate\Support\Facades\Request// $title = \Illuminate\Support\Facades\Request::input('title');//方法三:依赖注入,需导入Illuminate\Http\Request// $data = $request->all();// $title = $request->input('title');//或者:// $title = $request->title;//方法四:使用Facade Input。必须导入 Illuminate\Support\Facades\Input// $data = Input::get();$blog = new Blog;$blog->title = Input::get('title');$blog->content = Input::get('content');$blog->uid = 1;//保存数据if ($blog->save()) {//重定向,需要先导入Illuminate\Support\Facades\Redirectreturn Redirect::to('blog');} else {return Redirect::back()->withInput()->withErrors('保存失败!');}}
点击新增按钮,就可以新增一篇博客了!
在上面代码里面,演示了多种途径获得post过来的数据,大家可以一一尝试。
小技巧:可以使用dd()、var_dump()方法打印。
这里用到了Laravel的下列知识点: 
1. 表单验证:http://laravel-china.org/docs/5.0/validation 
2. 请求:http://laravel-china.org/docs/5.0/requests 
3. Facades:http://laravel-china.org/docs/5.0/facades