安装

直接从Laravel学院下载一键安装包。

或者使用composer安装

1
composer create-project --prefer-dist laravel/laravel blog

路由

常规

文档

写在 /routes/api.php/routes/web.php,我也不知道为啥。

这个url

1
http://your-app.dev/user

对应的是

1
Route::get('/user', 'UserController@index');

允许的路由方式

1
2
3
4
5
6
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

如果需要相应多个路由

1
2
3
4
5
6
7
Route::match(['get', 'post'], '/', function () {
//
});

Route::any('foo', function () {
//
});

重定向

1
Route::redirect('/here', '/there');

视图路由

1
2
3
4
Route::view('/welcome',  'welcome');

// 向前端传递参数
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

必填参数

1
2
3
4
5
6
7
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});

路由的参数通常都会被放在 {} 内,并且参数名只能为字母,同时路由参数不能包含 - 符号,如果需要可以用下划线 (_) 代替。路由参数会按顺序依次被注入到路由回调或者控制器中,而不受回调或者控制器的参数名称的影响。

可选参数

1
2
3
4
5
6
7
Route::get('user/{name?}', function ($name = null) {
return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
return $name;
});

正则表达式约束

1
2
3
4
5
6
7
8
9
10
11
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

路由组、中间件

1
2
3
4
5
6
7
8
9
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// // 使用 first 和 second 中间件
});

Route::get('user/profile', function () {
// // 使用 first 和 second 中间件
});
});

中间件

花里胡哨的,看不懂

控制器

常规

控制器写在/app/Http/Controllers里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
/**
* 显示给定用户的概要文件.
*
* @param int $id
* @return View
*/
public function show($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}

extends Controller继承了基类控制器,不是必须继承,只是基类控制器里有好用的方法。

在路由中这样指定控制器

1
Route::get('user/{id}', 'UserController@show');

控制器 & 命名空间

控制器路由中指定控制器只需要以App\Http\Controllers作为根目录,指定其后的路径即可。

如果完整的控制器类名是

1
App\Http\Controllers\Photos\AdminController

在路由中要这样定义

1
Route::get('foo', 'Photos\AdminController@method');

单个行为控制器

如果一个控制器中只需要处理一个行为,那么放置一个__invoke方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
class ShowProfile extends Controller
{
/**
* 展示给定用户的资料.
*
* @param int $id
* @return View
*/
public function __invoke($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}

当路由中注册单个行为时,不用指明方法。

1
Route::get('user/{id}', 'ShowProfile');

控制器中间件

看不懂,一会弄你。

后边还有一堆乱七八糟的控制器,回头弄你。

请求

接受请求

需要先在控制器中引入Illuminate\Http\Request类,然后通过依赖注入的方式来获取当前请求实例。

1
2
3
4
5
6
7
8
9
10
11
namespace ...
use Illuminate\Http\Request;
class ...

// 这是一个控制器方法
public function store(Request $request)
{
$name = $request->input('name');

//
}

依赖注入 & 路由参数

如果是用控制器参数的方式获取数据,需要在其他依赖项之后列入参数。例如

1
2
3
4
5
6
Route::put('user/{id}', 'UserController@update');
...
public function update(Request $request, $id)
{
//
}

通过闭包获取路由参数

1
2
3
4
5
use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
//
});

获取请求路径

1
$uri = $request->path();

如果请求的地址是http://domain.com/foo/barpath方法会返回foo/bar

is方法可以验证请求路径是否与给定的模式匹配。可以使用通配符。

1
2
3
if ($request->is('admin/*')) {
//
}

获取请求url

1
2
3
4
5
// 不附带查询串...
$url = $request->url();

// 附带查询串...
$url = $request->fullUrl();

获取请求方法

1
2
3
4
5
$method = $request->method();

if ($request->isMethod('post')) {
//
}

获取输入

获取所有输入

1
$input = $request->all();

获取单个输入值

1
$name = $request->input('name');

input方法可以获取任何http请求方式的数据。

input方法接受第二个参数作为默认值。

1
$name = $request->input('name', 'Sally');

可以使用.来访问数组元素。

1
2
3
$name = $request->input('products.0.name');
// 好像也支持通配符
$names = $request->input('products.*.name');

不带参数的input方法能获取全部输入的值。

1
$input = $request->input();

从查询串获取输入

query仅从查询串中获取值

1
$name = $request->query('name');

指定默认值

1
$name = $request->query('name', 'Helen');

获取所有

1
$query = $request->query();

动态属性获取输入

1
$name = $request->name;

获取json输入

1
$name = $request->input('user.name');

Content-Type 头设置为 application/json即可使用.来访问json数组。

获取部分输入

1
2
3
4
5
6
7
8

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

判断输入是否存在

1
2
3
if ($request->has('name')) {
//
}
1
2
3
if ($request->has(['name', 'email'])) {
//
}

存在且不为空

1
2
3
if ($request->filled('name')) {
//
}

获取cookie

1
$value = $request->cookie('name');

或者

1
$value = Cookie::get('name');

文件

获取上传的文件

1
2
3
$file = $request->file('photo');

$file = $request->photo;

判断是否存在文件

1
2
3
if ($request->hasFile('photo')) {
//
}

验证文件存在

1
2
3
if ($request->file('photo')->isValid()) {
//
}

文件路径

1
2
3
$path = $request->photo->path();

$extension = $request->photo->extension();

extension基于文件内容猜测文件扩展名。

存储上传文件

1
$path = $request->photo->store('images');

将传过来的键名为photo的文件复制到/images下。

可以传入第二个参数指定文件名,否则系统生成唯一的id。

1
$path = $request->photo->store('images', 's3');

storeAs接受路径、文件名、磁盘名。

1
2
3
$path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');