控制器用于将相关的 HTTP 请求封装到一个类中进行处理,如同TP6一样,默认情况下,控制器没有分组,默认都存放在 app/Http/Controllers
目录下。
1、基本控制器
创建一基本控制器()
1、创建普通控制器 默认在/app/Http/Controllers/目录下生成
# php artisan make:controller IndexController
2、创建admin应用下的控制器
# php artisan make:controller admin/ArticleController
此命令在/app/Http/Controllers/下生成一个admin目录并,并创建了ArticleController.php控制器文件
生成的控制器位于 app/Http/Controllers 目录下
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class IndexController extends Controller
{
}
2、资源控制器
1、创建资源控制器
# php artisan make:controller admin/ArticleController --resource
2、创建资源控制器,并指定模型
# php artisan make:controller admin/ArticleController --resource --model=Article
生成的控制器包含了index、create、store等七个方法,资源控制器处理的动作:
请求方式 | URI路径 | 控制器方法 | 路由名称 |
---|---|---|---|
GET | /admin/article | index | posts.index |
GET | /posts/create | create | posts.create |
POST | /posts | store | posts.store |
GET | /posts/{post} | show | posts.show |
GET | /posts/{post}/edit | edit | posts.edit |
PUT/PATCH | /posts/{post} | update | posts.update |
DELETE | /posts/{post} | destroy | posts.destroy |
对应的路由可以设置为如下:
Route::get('admin/article/index', [ArticleController::class, 'index']);
Route::get('admin/article/create', [ArticleController::class, 'create']);
Route::post('admin/article/store', [ArticleController::class, 'store']);
Route::get('admin/article/show/{id}', [ArticleController::class, 'show']);
Route::get('admin/article/edit/{id}', [ArticleController::class, 'edit']);
Route::put('admin/article/update/{id}', [ArticleController::class, 'update']);
Route::delete('admin/article/destroy/{id}', [ArticleController::class, 'destroy']);
3、路由绑定控制器
这里的绑定方式与Laravel7.x以前的版本不同。
在Laravel7.x中路由指向控制器使用的是如下:
Route::get('article/index', 'ArticleController@index');
Route::get('article/create', 'ArticleController@create');
Route::post('article/store', 'ArticleController@store');
而从Laravel8开始使用标准的PHP调用语法
如要设置./Controllers/IndexController.php控制器下index()方法的路由
//首先引入
use App\Http\Controllers\IndexController;
//创建路由 http://blog.laravel8.cn/index
Route::get('index', [IndexController::class, 'index']);
//绑定IndexController控制器下的index()方法
//创建类似于TP中的默认控制器、默认方法
// http://blog.laravel8.cn/
Route::get('/', [IndexController::class, 'index']);
//http://blog.laravel8.cn/index
Route::get('index', [IndexController::class, 'index']);
//http://blog.laravel8.cn/index/index
Route::get('index/index', [IndexController::class, 'index']);
如果不引入也可以这样写
Route::get('/article/index', [\App\Http\Controllers\ArticleController::class, 'index']);
4、控制器视图模板载入
public function index()
{
$username = '暮云归';
return view('index', ['username' => $username]);
}
使用 view()助手函数来加载模板。 与TP不同的是,这里第一参数必须指定, 如这里的index 表示加载位于/resources/views/目录下的index.blade.php模板。
如果给定为 return view('index/index', ['username' => $username]); 则便是为/resources/views/index/目录下的index.blade.php模板。
5、仿TP的控制器结构优化
Laravel默认没有对控制器进行分组,所有的控制器都在/app/Http/Controllers/目录下,项目越来越庞大后不利于管理。因此我们采用TP的目录结构:
app
├─Http
│ ├─Controllers 控制器目录
│ │ ├─admin 后台Admin模块
│ │ │ ├─IndexController.php 后台首页控制器
│ │ │ ├─CategoryController.php 分类管理控制器
│ │ ├─home 前台Home模块
│ │ │ ├─IndexController.php 前台首页控制器
│ │ │ ├─ArticleController.php 文章展示控制器
│ │ ├─user 用户User模块
│ │ │ ├─IndexController.php 用户首页控制器
│ │ │ ├─TagController.php 标签管理控制器
对应的视图文件如
namespace App\Http\Controllers\admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class IndexController extends Controller
{
//
public function index()
{
$username = '暮云归--admin模块下Index控制器下index()';
return view('admin.index.index', ['username' => $username]);
}
public function mytest()
{
$username = '暮云归--admin模块下Index控制器下mytest()';
return view('admin.index.mytest', ['username' => $username]);
}
}
web.php下路由设置
...
use App\Http\Controllers\admin\IndexController as AdminIndexController;
//http://blog.laravel8.cn/admin/index/index
Route::get('admin/index/index', [AdminIndexController::class, 'index']);
//http://blog.laravel8.cn/admin/index/mytest
Route::get('admin/index/mytest', [AdminIndexController::class, 'mytest']);