[关闭]
@52fhy 2016-04-28T11:51:13.000000Z 字数 7215 阅读 342

Laravel5.0学习--02 进阶实例

PHP


本文以laravel5.0.22为例。

本节以新建一个简单的博客作为实例。学完本文,你应该能够使用Laravel5写个简单的博客。

准备工作

数据库配置

.env文件(也可以直接修改config/database.php)

  1. DB_HOST=localhost
  2. DB_DATABASE=myblog
  3. DB_USERNAME=root
  4. DB_PASSWORD=123456

数据库表:

  1. CREATE TABLE `blog` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `uid` int(11) NOT NULL DEFAULT '0',
  4. `title` varchar(50) NOT NULL DEFAULT '',
  5. `content` text NOT NULL,
  6. `flag` tinyint(2) NOT NULL DEFAULT '1',
  7. `create_time` int(11) NOT NULL DEFAULT '0',
  8. `update_time` int(11) NOT NULL DEFAULT '0',
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

开始

这里暂时不使用Eloquent ORM,直接使用DB类。

控制器

新建一个控制器:app/Http/Controllers/BlogController.php

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Support\Facades\DB;
  4. /**
  5. *
  6. * @author YJC
  7. *
  8. */
  9. class BlogController extends Controller{
  10. public function index() {
  11. $list = DB::table('blog')->get();
  12. //需要return
  13. return view('blog.index', ['list' => $list]);
  14. }
  15. }

视图

新建一个母版视图:resources/views/blog/layout.blade.php

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Laravel</title>
  8. <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
  9. </head>
  10. <body>
  11. @yield('content')
  12. <!-- Scripts -->
  13. <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
  14. <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  15. </body>
  16. </html>

新建一个普通视图:resources/views/blog/index.blade.php

  1. @extends('blog.layout')
  2. @section('content')
  3. @foreach($list as $blog)
  4. <div>
  5. <h1>{{$blog->title}}</h1>
  6. <p>{{$blog->content}}</p>
  7. </div>
  8. @endforeach
  9. @endsection

路由

  1. Route::get('blog', 'BlogController@index');

访问

  1. http://localhost/laravel5/public/index.php/blog

即可。

路由技巧

默认的,每新增一个方法,需要写一条路由,比较繁琐。Laravel支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是:
1) 控制器里方法必须以getpost开头。
2) Route::get()改成Route::controller()

示例:上面的index方法我们需要改成getIndex,路由这样写:

  1. Route::controller('blog', 'BlogController');

这样,Blog控制器所有的方法都能被路由匹配。例如,有如下方法:

  1. public function getIndex(){}
  2. public function getDetail(){}
  3. public function postAdd(){}

都可以被匹配。访问的时候直接:

  1. http://localhost/laravel5/public/index.php/blog/index
  2. http://localhost/laravel5/public/index.php/blog/detail/2
  3. http://localhost/laravel5/public/index.php/blog/add

新增文章详情页

控制器新增getDetail()方法:

  1. public function getDetail($id) {
  2. $blog = DB::table('blog')->find($id);
  3. return view('blog.detail', ['blog' => $blog]);
  4. }

更改index.blade.php:

  1. @extends('blog.layout')
  2. @section('content')
  3. @foreach($list as $blog)
  4. <div>
  5. <h1><a href="{{url('blog/detail/'.$blog->id)}}">{{$blog->title}}</a></h1>
  6. <p>{{$blog->content}}</p>
  7. </div>
  8. @endforeach
  9. @endsection

新增文章详情试图页blog/detail.blade.php:

  1. @extends('blog.layout')
  2. @section('content')
  3. <div class="jumbotron">
  4. <h1>{{$blog->title}}</h1>
  5. <p>{{$blog->content}}</p>
  6. </div>
  7. @endsection

更改路由:

  1. //对应blog/index
  2. Route::get('blog', 'BlogController@index');
  3. //对应blog里任何方法,注意方法要加get或者post
  4. Route::controller('blog', 'BlogController');

使用Eloquent ORM

上面我们一直用的是DB类。接下来我们将使用Eloquent ORM代替DB类。

Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动。 每个数据库表对应一个模型文件。

模型(Model)

app下新建Blog.php:

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. /**
  5. * @author YJC
  6. *
  7. */
  8. class Blog extends Model{
  9. //指定表名,不指定系统会默认自动对应名称为「类名称的小写复数形态」的数据库表
  10. protected $table = 'blog';
  11. //指定主键,默认就是id
  12. protected $primaryKey = 'id';
  13. //默认情况下,在数据库表里需要有 updated_at 和 created_at 两个字段。如果您不想设定或自动更新这两个字段,则将类里的 $timestamps 属性设为 false即可
  14. public $timestamps = false;
  15. }

提示:所有DB类里查询构造器里的方法,查询 Eloquent 模型时也可以使用。

控制器里使用模型

复制BlogController.phpBlogController.php.bak,清空原BlogController.php里面内容,改为如下内容:

  1. <?php
  2. namespace App\Http\Controllers;
  3. //需要use模型
  4. use App\Blog;
  5. /**
  6. *
  7. * @author YJC
  8. *
  9. */
  10. class BlogController extends Controller{
  11. public function index() {
  12. $list = Blog::all();
  13. return view('blog.index', ['list' => $list]);
  14. }
  15. public function getDetail($id) {
  16. $blog = Blog::find($id);
  17. return view('blog.detail', ['blog' => $blog]);
  18. }
  19. }

Eloquent ORM提供了很多易用的方法来操作数据库。例如:

Blog.php模型文件里,我们可以使用以下查询方法(Eloquent ORM同时支持$this静态方式调用):

  1. //取出所有记录,all()得出的是对象集合,可以遍历
  2. $this->all()->toArray();
  3. //根据主键取出一条数据
  4. $one = $this->find('2');
  5. return array(
  6. $one->id,
  7. $one->title,
  8. $one->content,
  9. );
  10. //查找id=2的第一条数据
  11. $this->where('id', 2)->first()->toArray();
  12. //查找id>0的所有数据
  13. $this->where('id', '>', '0')->get()->toArray();
  14. //查找id>0的所有数据,降序排列
  15. $this->where('id', '>', '0')->orderBy('id', 'desc')->get()->toArray();
  16. //查找id>0的所有数据,降序排列,计数
  17. $this->where('id', '>', '0')->orderBy('id', 'desc')->count();
  18. //offset,limit
  19. $this->where('id', '>', '0')->orderBy($order[0], $order[1])->skip($offset)->take($limit);
  20. //等同于
  21. $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:

  1. @extends('blog.layout')
  2. @section('content')
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-md-10 col-md-offset-1">
  6. <div class="panel panel-default">
  7. <div class="panel-heading">新增博客</div>
  8. <div class="panel-body">
  9. <!--错误信息输出-->
  10. @if (count($errors) > 0)
  11. <div class="alert alert-danger">
  12. <strong>Whoops!</strong> 输入的格式不正确!<br><br>
  13. <ul>
  14. @foreach ($errors->all() as $error)
  15. <li>{{ $error }}</li>
  16. @endforeach
  17. </ul>
  18. </div>
  19. @endif
  20. <!--表单-->
  21. <form action="{{ URL('blog/add') }}" method="POST">
  22. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  23. <input type="text" name="title" class="form-control" required="required">
  24. <br>
  25. <textarea name="content" rows="10" class="form-control" required="required"></textarea>
  26. <br>
  27. <button class="btn btn-lg btn-info">新增</button>
  28. </form>
  29. </div>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. @endsection

在目视图blog/layout.blade.php新增一个新增按钮:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Laravel</title>
  8. <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
  9. </head>
  10. <body>
  11. <!--新增按钮-->
  12. <header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
  13. <div class="container">
  14. <nav id="bs-navbar" class="collapse navbar-collapse">
  15. <ul class="nav navbar-nav">
  16. <li>
  17. <a href="{{url('blog/add')}}">新增</a>
  18. </li>
  19. </ul>
  20. </nav>
  21. </div>
  22. </header>
  23. @yield('content')
  24. <!-- Scripts -->
  25. <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
  26. <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  27. </body>
  28. </html>

控制器新增:

  1. /**
  2. * 显示新增页面
  3. */
  4. public function getAdd() {
  5. return view('blog.add');
  6. }
  7. /**
  8. * 执行新增动作
  9. */
  10. public function postAdd(Request $request) {
  11. //执行表单验证 http://laravel-china.org/docs/5.0/validation
  12. $this->validate($request, [
  13. 'title' => 'required|max:255',
  14. 'content' => 'required',
  15. ]);
  16. //如何获取post过来的title和content等字段信息?
  17. //方法一:使用传统方法
  18. // $data = $_POST;
  19. //方法二:通过 Facade Request。必须导入 Illuminate\Support\Facades\Request
  20. // $title = \Illuminate\Support\Facades\Request::input('title');
  21. //方法三:依赖注入,需导入Illuminate\Http\Request
  22. // $data = $request->all();
  23. // $title = $request->input('title');
  24. //或者:
  25. // $title = $request->title;
  26. //方法四:使用Facade Input。必须导入 Illuminate\Support\Facades\Input
  27. // $data = Input::get();
  28. $blog = new Blog;
  29. $blog->title = Input::get('title');
  30. $blog->content = Input::get('content');
  31. $blog->uid = 1;
  32. //保存数据
  33. if ($blog->save()) {
  34. //重定向,需要先导入Illuminate\Support\Facades\Redirect
  35. return Redirect::to('blog');
  36. } else {
  37. return Redirect::back()->withInput()->withErrors('保存失败!');
  38. }
  39. }

点击新增按钮,就可以新增一篇博客了!

在上面代码里面,演示了多种途径获得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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注