Yii2使用驼峰命名的形式访问控制器的示例代码
Yii2框架中的驼峰命名控制器与URL访问方式的
在Yii2框架中,当我们使用驼峰命名法来命名控制器(Controller)时,实际访问的URL则需要将其转换为横线分隔的形式。比如,你有一个名为`RoomUpdateController`的控制器,其中的方法`actionRoomUpdate()`,在URL中则需要以`room-update`的形式来访问。
近期,我在对接某渠道直连时,他们的接口文档中明确要求了此种命名方式。起初,我以为Yii2框架中应该有对应的设置能够直接实现这种映射,但经过搜索和源码查看,发现框架并未直接支持这种特性。在源码`\vendor\yiisoft\yii2\base\Controller.php`中,对控制器的动作(action)的创建是按照一定的规则进行的。
这个规则是这样的:首先检查动作ID是否在`actions()`方法中声明过,如果是,则使用那里的配置创建动作对象;如果没有声明,则查找一个以`action`为前缀的方法名,其中`Xyz`代表动作ID。如果找到这样的方法,就会创建一个代表该方法的`InlineAction`并返回。在这个过程中,URL中的横线分隔形式会被转换为驼峰命名法。
虽然这个规则在某些情况下可能显得有点“low”,但理解并适应它其实并不困难。如果我们需要在源码的基础上增加额外的处理逻辑,其实只需要在源码的`createAction()`方法中添加一个额外的判断逻辑即可。出于代码维护的考虑,我并不建议直接修改框架的源码。
在我们使用的Yii2框架的advanced版本中,由于同时管理多个项目,我们需要在保持其他项目正常运行的针对特定的控制器实现驼峰命名的访问方式。如何实现这一需求呢?我们可以创建一个名为“zController”的控制器来处理这个问题。
这个控制器由Steven创建并编写,其中的createAction方法允许我们通过不同的命名方式访问控制器。如果提供的ID是空的,那么它会默认使用defaultAction作为ID。如果存在与ID匹配的action映射,那么它会创建一个新的InlineAction对象并返回。如果不存在映射关系,并且ID符合特定的格式要求(不包含特殊字符和连续的破折号),那么它会尝试将ID转换为驼峰命名法的方法名并执行相应的操作。如果以上两种情况都不符合,那么它会尝试直接执行与ID同名的方法。如果所有方法都不可行,那么该方法将返回null。
通过使用这个zController控制器,我们可以轻松实现使用驼峰命名法访问控制器的方法。这一方法具有很高的灵活性和可复用性,我们可以将这个功能封装到一个基础控制器中,其他控制器可以直接继承这个基础控制器来使用这个功能。这样,我们就可以轻松地在项目中实现个性化的路由管理,提高代码的可读性和可维护性。
关于使用方式,你可以像使用其他Yii框架的控制器一样使用这个zController。只需在路由配置中指定正确的路由规则,然后在视图中使用相应的链接即可。如果你需要在其他控制器中使用这个功能,只需继承这个zController即可。这样,你就可以轻松地在项目中实现驼峰命名法的控制器访问方式了。在Yii2框架中,想要通过驼峰命名形式访问控制器,只需继承`zController`即可。以下是一个名为`QunarController`的控制器示例,它继承自`zController`。
// 由PhpStorm创建,用户Steven,日期2017年10月18日,时间15:57
namespace backend\modules\hotel\controllers;
use yii\filters\AccessControl; // 注意这里应该是AccessControl,而不是AessControl
use yii\filters\ContentNegotiator;
use yii\web\Response;
use mon\components\zController;
class QunarController extends zController
{
public $enableCsrfValidation = false; // 关闭CSRF验证
public function behaviors() // 定义行为
{
$behaviors = parent::behaviors(); // 获取父级行为
unset($behaviors['authenticator']); // 移除认证行为
$behaviors['corsFilter'] = [ // 添加CORS过滤器行为
'class' => \yii\filters\Cors::class, // 使用Yii的CORS过滤器类
'cors' => [ // CORS配置
'Access-Control-Request-Method' => ['POST', 'PUT'], // 仅允许POST和PUT方法
'Access-Control-Request-Headers' => ['X-Wsse'], // 仅允许'X-Wsse'头
'Access-Control-Allow-Credentials' => true, // 允许凭据请求
'Access-Control-Max-Age' => 3600, // 允许的最大缓存时间
'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'], // 暴露给浏览器的响应头
],
];
// 配置ContentNegotiator支持JSON和XML响应格式(此段代码已被注释掉)
//$behaviors['contentNegotiator'] = ... ; // 已注释掉的代码片段关于内容协商的设置
$behaviors['access'] = [ // 添加访问控制行为规则
'class' => AccessControl::class, // 使用Yii的AccessControl类
'rules' => [ // 定义访问规则数组
[ // IP访问规则设置示例,将指定IP加入白名单并允许访问
'ips' => ['119.254.26.', '127.0.0.1', '106.14.56.77', '180.168.4.58'], // IP白名单列表包括去哪儿的IP和一些测试蜘蛛IP等
'allow' => true, // 设置这些IP访问为允许状态(即无需身份验证即可访问)注意拼写错误已修正为“allow”,原代码为“aess”应为拼写错误。修正后代码更易于理解和维护。这个规则可以根据实际需求进行调整和扩展。请注意代码中注释的使用,有助于理解代码的功能和用途。对于如何访问这个控制器中的方法,比如获取酒店信息的静态数据接口方法 `actiongetFullHotelInfo()`,可以通过URL以驼峰命名的方式访问,具体URL取决于该方法的命名规则。具体格式通常是 `
长沙网站设计
- Yii2使用驼峰命名的形式访问控制器的示例代码
- jQuery zTree插件快速实现目录树
- 详解asp.net core重新加载应用配置
- Servlet 与 Ajax 交互一直报status=parsererror的解决办法
- SQLSERVER SQL性能优化技巧
- php实现微信支付之退款功能
- 使用plupload自定义参数实现多文件上传
- 新手学习css优先级
- js 实现ajax发送步骤过程详解
- php实用代码片段整理
- MySQL线程处于Opening tables的问题解决方法
- web前端开发upload上传头像js示例代码
- jQuery快速高效制作网页交互特效
- 解决Yii2邮件发送结果返回成功,但接收不到邮件
- jQuery插件ajaxFileUpload异步上传文件
- jQuery简单实现上下,左右滑动的方法