1. 控制器基础
1.1 命令创建控制器
可以通过命令 php artisan make:controller Index
来创建一个Index 的控制器,它在 app\Http\Controllers\Index.php
下,默认创建的这个控制器是空的。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Index extends Controller
{
//
}
1.2 路由绑定控制器
继续在上一次的 my.php
这个route 文件下从新定义一个路由,将它与我们感刚刚创建的控制器 Index
进行绑定。my.php
文件下添加下面的方法,第二个参数绑定控制器和控制器的方法,中间用@来隔开
<?php
/**
* 路由绑定控制器方法
*/
Route::get('user', 'Index@index');
<br />`Index.php` 这个控制器下添加对应的方法 `index`
<?php
public function index()
{
return '来自控制器Index,方法index()';
}
1.3 路由命名空间
上述通过命令 php artisan make:controller 控制器名称
创建的控制器 在App\Http\Contrlooer
目录下,如果不进行分组,当业务功能上去后势必会站目录结构占满控制器文件,所以我们需要分层,也就是额外添加目录,如: php artisan make:controller my/index
来创建我需要的分层,如下图:
现在,向这个 my/index.php
添加代码如下
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class index extends Controller
{
// 添加一个最基本的方法
public function fun1()
{
return 'from my fun1()';
}
}
然后向 my.php
中添加代码
<?php
/**
* 基本路由命名空间的使用
*/
Route::get('user', 'my\Index@fun1');
1.4 参数传递
和路由中的使用别无二至,先去 my.php
中定义路由
<?php
/**
* 传递参数
*/
Route::get('say/{name}/{msg?}', 'my\Index@fun2');
然后去对应控制下,添加 fun2()
<?php
public function fun2($name, $msg = 'to my fun2()')
{
return '我是' . $name ."\t" . $msg;
}
1.5 使用组+空间
1.5.1 基本操作
注释掉上面在 my.php
中定义的方法,现在从写下面代码
<?php
/**
* 命名空间组
* 在 APP\Http\Controllers\my 命名空间下的控制器
*/
Route::namespace('my')->group(function () {
Route::get('fun1', 'Index@fun1');
Route::get('fun2/{name}/{msg?}', 'Index@fun2');
});
1.5.2 添加name+重定向
再次向 my.php
中添加如下代码
<?php
/**
* 命名空间组 + name + 重定向路由
*/
Route::namespace('my')->group(function () {
Route::get('addUser/{name}/{age}', 'Index@addUser')->name('add');
Route::get('delUser/{id}', 'Index@delUser')->name('del');
Route::get('updUser', 'Index@updUser')->name('upd');
Route::get('selUser', 'Index@selUser')->name('sel');
});
// 路由重定向
Route::get('1/{name}/{age}', function ($name, $age) {
return redirect()->route('add', [$name, $age], 301);
});
Route::get('2/{id}', function ($id) {
return redirect()->route('del', [$id], 301);
});
Route::get('3', function () {
return redirect()->route('upd');
});
Route::get('4', function () {
return redirect()->route('sel');
});
向对应的控制器 my\Index.php
中添加 CURD 这四个方法
<?php
public function addUser($name, $age)
{
return "[addUser] name: $name, age: $age";
}
public function delUser($id)
{
return "[delUser] id: $id";
}
public function updUser()
{
return "[updUser]";
}
public function selUser()
{
return "[selUser]";
}
测试:
测试1
测试2
测试3
测试4
2. 单行为控制器
只会处理一个行为,也就是说就干一件事,可以在 __invoke 方法中进行设置。创建命令 php artisan make:controller ShowProfile --invokable
例如:我这里在 my 下创建 php artisan make:controller Single --invokable
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class Single extends Controller
{
public function __invoke(Request $request)
{
return 'in my\Single\__invoke()'; // 添加代码
}
}
访问的时候,我们不需要指定控制器下的方法,更不需要继续在定义的单行为控制器下去写其他方法(这是无效的)
3. 资源控制器
创建 php artisan make:controller my/Resource --resource
, 里面已经定义好了方法和使用的标准。
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class Resource extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
填充控制器方法
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class Resource extends Controller
{
public function index()
{
return 'index()';
}
public function create()
{
return 'creat()';
}
public function store(Request $request)
{
return 'store()';
}
public function show($id)
{
return 'show()';
}
public function edit($id)
{
return 'edit';
}
public function update(Request $request, $id)
{
return 'update';
}
public function destroy($id)
{
return 'destroy';
}
}
my.php
下添加路由
<?php
/**
* 资源控制器组
* 请求方式 对应方法
* GET index()
* GET cretate()
* POST store()
* GET show()
* GET edit()
* PUT/PATCH update()
* DELETE DELETE
*/
Route::namespace('my')->group(function () {
// index()
Route::get('index', 'Resource@index');
// create()
Route::get('create', 'Resource@create');
// store()
Route::post('store', 'Resource@store');
// show()
Route::get('show', 'Resource@show');
// update()
Route::PUT('update', 'Resource@update');
// destroy()
Route::DELETE('destroy', 'Resource@destroy');
});
测试资源方法
index()一需要get请求访问
create()一需要get请求访问
store()一需要post请求访问,需要加入白名单
4. 控制器中间件
先创建一个测试的控制器 php artisan make:controller my/Mid
,并且加入三个方法fun1、fun2、fun3
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class Mid extends Controller
{
public function fun1()
{
return '我是fun1()';
}
public function fun2()
{
return '我是fun2()';
}
public function fun3()
{
return '我是fun3()';
}
}
my.php
中添加自定义的路由
<?php
/**
* 控制器中间件
*/
Route::namespace('my')->group(function () {
Route::get('fun1', 'Mid@fun1');
Route::get('fun2', 'Mid@fun2');
Route::get('fun3', 'Mid@fun3');
});
4.1 所有方法都使用这个中间件
<?php
// 在构造方法中使用中间件可以有效的控制
public function __construct()
{
// 使用这种方式,所有的方法都走中间件
$this->Middleware('test');
}
4.2 限制哪些方法可以用到这个中间件
<?php
// 在构造方法中使用中间件可以有效的控制
public function __construct()
{
// 限制只有 fun1和fun2方法会使用到中间件
$this->Middleware('test')->only(['fun1','fun2']);
}
4.3 限制哪些方法不可以用到这个中间件
<?php
// 在构造方法中使用中间件可以有效的控制
public function __construct()
{
// 限制只有 fun1和fun2方法会不会使用这个·中间件
$this->Middleware('test')->except(['fun1','fun2']);
}