本文以laravel5.0.22为例。

本节以新建一个简单的博客作为实例。

准备工作

数据库配置

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

DB_HOST=localhost
DB_DATABASE=myblog
DB_USERNAME=root
DB_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

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;

/**
 *
 * @author YJC
 *
 */
class BlogController extends Controller{

    public function index() {

        $list = DB::table('blog')->get();

        //需要return
        return 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');
Route::get('blog/info', 'BlogController@info'); //get请求
Route::post('blog/info', 'BlogController@info'); //post请求
Route::any('blog/info', 'BlogController@info'); //'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'请求均可
Route::match(['get', 'post'], 'blog/info', 'BlogController@info'); //'get', 'post'请求

Route::get('blog', ['uses' => 'BlogController@index']);
Route::get('blog/info/{id}', ['uses' => 'BlogController@info'])->where('id', '[0-9]+'); //匹配正则
Route::get('blog/tag/{name}', ['uses' => 'BlogController@tag'])->where('name', '\w+');

访问

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

即可。

隐式控制器路由

注意:laravel5.2已废弃该方法。

默认的,每新增一个方法,需要写一条路由,比较繁琐。Laravel支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是:
1) 方法的名称应由它们所响应的 HTTP 动词作为开头,紧跟着首字母大写的 URI 所组成:控制器里方法必须以getpost开头
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/index
http://localhost/laravel5/public/index.php/blog/detail/2
http://localhost/laravel5/public/index.php/blog/add

路由组:

Route::controllers([
    'blog' => 'BlogController',
    'user' => 'UserController'
]);

资源控制器路由
资源控制器会创建多个路由,用来处理各式各样和相片资源相关的的 RESTful 行为。例如:

Route::resource('photos', 'PhotosController');

该路由会根据HTTP动作及路径自动对应方法名:

动词          路径          行为(方法)      路由名称
GET         /photos                 index       photos.index
GET         /photos/create          create      photos.create
POST        /photos                 store       photos.store
GET         /photos/{photo}         show        photos.show
GET         /photos/{photo}/edit    edit        photos.edit
PUT/PATCH   /photos/{photo}         update      photos.update
DELETE      /photos/{photo}         destroy     photos.destroy

声明资源路由时,你可以指定让此路由仅处理一部分的行为:

Route::resource('photos', 'PhotosController',
                ['only' => ['index', 'show']]);

Route::resource('photos', 'PhotosController',
                ['except' => ['create', 'store', 'update', 'destroy']]);

路由组

Route::group(['prefix'=>'admin','middleware'=>'auth'],function(){
    Route::any('/','backend\HomeController@index');
    Route::resource('home', 'backend\HomeController');
    Route::resource('cate','backend\CateController');
    Route::controllers([
        'system'=>'backend\SystemController',
        'upload'=>'backend\UploadFileController'
    ]);

});

该路由组前缀是admin,及url里admin开头的都会调用该路由组。使用了中间件auth进行验证身份。

新增文章详情页

控制器新增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/index
Route::get('blog', 'BlogController@index'); 

//对应blog里任何方法,注意方法要加get或者post
Route::controller('blog', 'BlogController');

使用Eloquent ORM

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

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

模型(Model)

app下新建Blog.php:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

/**
 * @author YJC
 *
 */
class Blog extends Model{

    //指定表名,不指定系统会默认自动对应名称为「类名称的小写复数形态」的数据库表
    protected $table = 'blog';

    //指定主键,默认就是id
    protected $primaryKey = 'id';

    //默认情况下,在数据库表里需要有 updated_at 和 created_at 两个字段。如果您不想设定或自动更新这两个字段,则将类里的 $timestamps 属性设为 false即可
    public $timestamps = false;

}

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

控制器里使用模型

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

<?php
namespace 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>输入不正确!</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\Redirect
        return Redirect::to('blog');
    } else {
        return Redirect::back()->withInput()->withErrors('保存失败!');
    }
}

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

在上面代码里面,演示了多种途径获得post过来的数据,大家可以一一尝试。

小技巧:可以使用dd()var_dump()方法打印。

输出json

1、建立 JSON 响应

json 方法会自动将响应头的 Content-Type 配置为 application/json:

return response()->json(['name' => 'Abigail', 'state' => 'CA']);

2、建立 JSONP 响应#

return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

这里用到了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
  4. 响应http://laravel-china.org/docs/5.0/responses

辅助工具

给IDE添加智能提示

Laravel里很多类没有提示,如Route类。barryvdh/laravel-ide-helper 扩展包能让你的 IDE ( PHPStorm, Sublime ) 实现自动完成、代码智能提示和代码跟踪等功能,大大提高你的开发效率。

安装

1)使用 Composer 安装该扩展包:

composer require barryvdh/laravel-ide-helper

2)安装完成后,在 config/app.php 添加以下内容到 providers 数组。

Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,

3)接下来运行以下命令生成代码对应文档:

php artisan ide-helper:generate

由于使用此扩展包会生成相应的代码结构文件, 这些文件可能只有当前的开发者的 IDE 需要, 因此需要添加对应配置到.gitignore 文件中:

.idea
_ide_helper.php

到此,此拓展包即安装成功。

页面调试工具栏

laravel-debugbar 用于直观的显示调试及错误信息,提高开发效率。

安装

1)使用 Composer 安装该扩展包:

composer require barryvdh/laravel-debugbar

2)安装完成后,修改 config/app.php 在 providers 数组内追加 Debugbar 的 Provider

'providers' => [
    Barryvdh\Debugbar\ServiceProvider::class,
],

同时在 aliases 数组内追加如下内容

'aliases' => [
    'Debugbar' => Barryvdh\Debugbar\Facade::class,
]

3)接下来运行以下命令生成此扩展包的配置文件 config/debugbar.php:

php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

打开 config/debugbar.php,将 enabled 的值设置为:

'enabled' => env('APP_DEBUG', false),

修改完以后, Debugbar 分析器的启动状态将由 .env文件中 APP_DEBUG 值决定。

页面刷新后, 看到下图即表示运行成功。

更多:
summerblue/laravel-package-top-100:
https://github.com/summerblue/laravel-package-top-100

Laravel5.0学习--02 实例进阶的更多相关文章

  1. Laravel5.0学习--01 入门

    本文以laravel5.0.22为例. 生产环境建议使用laravel5.1版本,因为该版本是长期支持版本.5.1文档更详细:http://laravel-china.org/docs/5.1. 环境 ...

  2. Laravel5.0学习--03 Artisan命令

    本文以laravel5.0.22为例. 简介 Artisan 是 Laravel 内置的命令行接口.它提供了一些有用的命令协助您开发,它是由强大的 Symfony Console 组件所驱动.利用它, ...

  3. Django 2.0 学习(02):Django视图和URL(上)

    接上篇博文,接下来我们以具体代码例子来说明Django的基本流程. 创建项目 使用Win+R,输入cmd进图windows命令行模式: 再你想要存放项目工作的磁盘,输入下面命令: django-adm ...

  4. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  5. Python学习02 列表 List

    Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...

  6. Android Testing学习02 HelloTesting 项目建立与执行

    Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...

  7. SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming

    SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming 字数545 阅读52 评论0 喜欢1 JCo3.0调用SAP函数的过程 大致可以总结为以下步骤: 连接至 ...

  8. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  9. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

随机推荐

  1. document.documentElement.clientHeight 和 $(window).height() 无法正确获取页面可视区高度

    背景: 弹出层插件(自适应) 实现过程中突然发现在获取可视区高度时,无论document.documentElement.clientHeight 还是 $(window).height()都无法正确 ...

  2. javabean和jsp动作元素

    model1就是利用了jsp和javabean 的组合来处理问题.jsp页面如果有太多的逻辑代码的话,维护起来和扩展起来是相当的麻烦的.所以jsp的逻辑代码部分都打包到一种java类当中进行编写.这种 ...

  3. &lt;&lt;&lt; Tomcat运行报错IOException while loading persisted sessions: java.io.EOFException

    解决方法:将work下面的文件清空,主要是*.ser文件,或者只是删除掉session.ser即可以解决.

  4. 关于angularjs中ajax请求php接口参数个是转换的问题

    mainApp.config(function($httpProvider){ $httpProvider.defaults.transformRequest = function(obj){ var ...

  5. smarty模板引擎部分内容(思维导图)

  6. 优化 从Draw Calls到GC

    原文出处: 慕容小匹夫的博客(@慕容小匹夫)   欢迎分享原创到伯乐头条 前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章 ...

  7. 限制scrollView的上下移动

    只要把scrollView.contentSize 中的hight高设为0,就不会上下移动了.如果不想水平移动,就把宽设0.

  8. Bootstrap_Datatable Ajax请求两次问题的解决

    最近一个项目中使用JQuery Datatable,用起来比较方便,但在测试过程中,发现当条件改变时,有时查询结果中的数据不正确. 使用FireBug跟踪时,发现在使用Ajax请求时,点击一次搜索按钮 ...

  9. Greedy:三角形问题

    题目大意:有n根长度的为a1,a2....an的棒子,如果棒子可以组成三角形,求这些棒子能组成的三角形的最大周长? 这一题,一般人只能想到三重循环,当然我们是CS专业的,不能这样想,其实这题可以用DP ...

  10. ember.js:使用笔记9 开始单元测试

    单元测试被限定在一个范围内,并且不需要Ember应用运行. 使用前准备: 加入Ember-QUnit:获取一系列测试助手帮助单元测试:加入 mian.js; 加入根元素(与集成测试的时候一样):App ...