本文以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. 大数据学习之Linux进阶02

    大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...

  5. Django 2.0 学习(07):Django 视图(进阶-续)

    接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...

  6. Oracle RMAN 学习:演练进阶篇

    Oracle RMAN 学习:演练进阶篇 5 Rman备份演练进阶篇 5.1 是否选择增量备份 Backup命令生成的备份集中只备份了那些使用了的数据块,备份集实际大小已经较目标数据库的数据文件小了很 ...

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

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

  8. Python学习02 列表 List

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

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

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

随机推荐

  1. java.net.SocketException: Software caused connection abort: socket write error

    用Java客户端程序访问Java Web服务器时出错: java.net.SocketException: Software caused connection abort: socket write ...

  2. 设计模式C#实现(二)——适配器模式

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 如果它走起路来像只鸭子,叫起来像只鸭子,那么它必定可能是一只鸭子包装了鸭子适配器的火鸡…… 最近有一个 ...

  3. [转]Asp.Net MVC 扩展联想控件

    本文转自:http://www.cnblogs.com/bright-lin/archive/2013/02/06/MVC_SuggestBox.html 在web中,为改善用户体验,我们常会将一些文 ...

  4. [一]初识Poi

    示例代码: package com.lxl.poi; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSS ...

  5. [置顶] mmog游戏开发之业务篇

    这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了. 感觉超级的不爽啊.因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实 ...

  6. WinForm - ListView点击空白事件

    有时看似很小的一个问题却可能困扰我们许久,比如ListView这个问题,其Click事件只是在有选中项的时候才触发,点击其空白处(无选中项)是不会触发Click事件的,找了许久才终于找到解决这个问题的 ...

  7. MongoDB学习笔记(二) 通过samus驱动实现基本数据操作

    传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由(database).集合(collection).文档对象(documen ...

  8. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

  9. Ruby on Rails Tutorial 第一章笔记

    搭建开发环境 作者介绍了 Cloud9\ Coding.net 这样的云端开发环境 安装 Rails 1. 新建 rails 应用 首先,调用 rails new 命令创建一个新的 Rails 应用, ...

  10. 百度地图API 自定义坐标点及图片

    var map = new BMap.Map("allmap");var point = new BMap.Point(105.955754,36.525109);map.cent ...