前言
在tp8默认规则下使用注解路由默认只在app\controller 初始化创建的控制器中才会生效 并且不在使用/***/注解方式 而是采用php8 #[Route(“get” , ‘index/index’)] 的方式
注解路由
ThinkPHP支持使用注解方式定义路由(也称为注解路由),如果需要使用注解路由需要安装额外的扩展:
composer require topthink/think-annotation
然后只需要直接在控制器类的方法注释中定义,例如:
<?php
namespace app\controller;
use think\annotation\route\{Group , Route};
#[Group("index")]
class Index
{
/**
* @param string $name 数据名称
* @return mixed
*/
#[Route('GET','test/hello/:name')]
public function hello($name)
{
return 'hello,'.$name;
}
}
然后我们在命令行输入
php think route:list
以上我们可以看出 路由规则已经被读取到了
最后我们访问一下
http:/localhost//index/test/hello/thinkphp
此时 我们可以看到 路由已经生效了
多应用模式下如何使用路由
当我们创建一个admin应用时
<?php
declare (strict_types = 1);
namespace app\admin\controller;
use think\Request;
use think\annotation\route\{Group , Route};
#[Group('api')]
class IndexController
{
/**
* 显示资源列表
*
* @return \think\Response
*/
#[Route('get' , 'login')]
public function login()
{
echo 'hello admin thinkphp 8';
}
}
我们查询一下路由 是否生效
php think route:list
看来是没有生效
原因:
在 topthink/think-annotation 规则中 默认的是app/controller 哪怕你创建一个app/index 模块 它同样不生效
因为在 thinkphp 除了 默认的controller 以外 都属于多应用模式
那我们如何让 admin 应用生效
第一步
在创建 composer require topthink/think-annotation 的同时,也会在config 目录中创建一个annotation.php 文件
<?php
return [
'inject' => [
'enable' => true,
'namespaces' => [],
],
'route' => [
'enable' => true,
'controllers' => [
],
],
'model' => [
'enable' => true,
],
'ignore' => [],
];
第二步
我们在config/annotation.php 文件中修改 route 配置
<?php
return [
'inject' => [
'enable' => true,
'namespaces' => [],
],
'route' => [
'enable' => true,
'controllers' => [
app_path() . 'admin/controller' => [
'middleware' => [],
],
],
],
'model' => [
'enable' => true,
],
'ignore' => [],
];
既 让注解路由读取 绝对路径/app/admin/controller 控制器层
php think route:list
ps 注意
#[group(‘名称’)] 不要设置为和应用名一样 不然你还是在访问默认的控制器 而不是注解路由中的route