Laravel5.0学习--02 实例进阶
本文以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支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是:
- 方法的名称应由它们所响应的 HTTP 动词作为开头,紧跟着首字母大写的 URI 所组成:控制器里方法必须以
get
、post
开头 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.php
为BlogController.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的下列知识点:
- 表单验证:http://laravel-china.org/docs/5.0/validation
- 请求:http://laravel-china.org/docs/5.0/requests
- Facades:http://laravel-china.org/docs/5.0/facades
- 响应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 实例进阶的更多相关文章
- Laravel5.0学习--01 入门
本文以laravel5.0.22为例. 生产环境建议使用laravel5.1版本,因为该版本是长期支持版本.5.1文档更详细:http://laravel-china.org/docs/5.1. 环境 ...
- Laravel5.0学习--03 Artisan命令
本文以laravel5.0.22为例. 简介 Artisan 是 Laravel 内置的命令行接口.它提供了一些有用的命令协助您开发,它是由强大的 Symfony Console 组件所驱动.利用它, ...
- Django 2.0 学习(02):Django视图和URL(上)
接上篇博文,接下来我们以具体代码例子来说明Django的基本流程. 创建项目 使用Win+R,输入cmd进图windows命令行模式: 再你想要存放项目工作的磁盘,输入下面命令: django-adm ...
- 大数据学习之Linux进阶02
大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...
- Django 2.0 学习(07):Django 视图(进阶-续)
接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...
- Oracle RMAN 学习:演练进阶篇
Oracle RMAN 学习:演练进阶篇 5 Rman备份演练进阶篇 5.1 是否选择增量备份 Backup命令生成的备份集中只备份了那些使用了的数据块,备份集实际大小已经较目标数据库的数据文件小了很 ...
- SQL语句学习手册实例版
SQL语句学习手册实例版 表操作 例1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, ...
- Python学习02 列表 List
Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...
- Android Testing学习02 HelloTesting 项目建立与执行
Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...
随机推荐
- LeetCode OJ-- Single Number II **@
有一列数,其中有1个数出现了1次,其它数都出现了3次,求这个数. class Solution { public: int singleNumber(int A[], int n) { ) ; ; ; ...
- IQD文件模板以及cs7g.ini信息
COGNOS QUERY STRUCTURE,1,1 DATABASE, cognos TITLE,test BEGIN SQL { select time, city_id, city_name, ...
- (bzoj2330)糖果
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋 ...
- 最喜欢的算法(们) - Levenshtein distance
String Matching: Levenshtein distance Purpose: to use as little effort to convert one string into th ...
- A List of Social Tagging Datasets Made Available for Research
This list is not exhaustive - help expand it! Social Tagging Systems Research Group Source Year Obta ...
- hdu acm 1028 数字拆分Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 后台设置gridview不换行
GridView1.Style.Add("word-break", "keep-all"); GridView1.Style.Add(&q ...
- C# .NET 隐藏窗体
隐藏窗体,打开窗体后如果想让它隐藏,然后再显示出来,就判断是不是NULL或者有没有关闭,不然就NEW一个出来,否则就SHOW出来. 当然如果有隐藏的话退出的时候最好用Application.Exit( ...
- docker pull certification error
export DOMAIN_NAME=<my-dtr-domain> echo -n | openssl s_client -showcerts -connect itapregistry ...
- 百度ueditor 实例化 Cannot set property 'innerHTML' of null 完美解决方案
此时此刻,我正在用博客园推荐的TinyMCE编辑器写这个博客,突然想起最近在项目中使用百度ueditor编辑器中的一些经历.所以记录在此,与大家分享. 不得不说,百度ueditor是一款很好的在线编辑 ...