yii2在使用的時(shí)候,訪問(wèn)控制器的時(shí)候,如果控制器的名稱(chēng)是駝峰命名法,那訪問(wèn)的url中要改成橫線的形式。例如:
public function actionRoomUpdate()
{
//
}
//訪問(wèn)的時(shí)候就要www.test.com/room-update這樣訪問(wèn)
最近在做某渠道的直連的時(shí)候,他們提供的文檔上明確指出接口的形式:
剛開(kāi)始以為YII2中肯定有這樣的設(shè)置,然后就去google了下,發(fā)現(xiàn)都說(shuō)不行,自己去看了下,果然,框架里面直接是寫(xiě)死的:(源碼)\vendor\yiisoft\yii2\base\Controller.php
/**
* Creates an action based on the given action ID.
* The method first checks if the action ID has been declared in [[actions()]]. If so,
* it will use the configuration declared there to create the action object.
* If not, it will look for a controller method whose name is in the format of `actionXyz`
* where `Xyz` stands for the action ID. If found, an [[InlineAction]] representing that
* method will be created and returned.
* @param string $id the action ID.
* @return Action the newly created action instance. Null if the ID doesn't resolve into any action.
*/
public function createAction($id)
{
if ($id === '') {
$id = $this->defaultAction;
}
$actionMap = $this->actions();
if (isset($actionMap[$id])) {
return Yii::createObject($actionMap[$id], [$id, $this]);
} elseif (preg_match('/^[a-z0-9\\-_]+$/', $id) strpos($id, '--') === false trim($id, '-') === $id) {
$methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id))));
if (method_exists($this, $methodName)) {
$method = new \ReflectionMethod($this, $methodName);
if ($method->isPublic() $method->getName() === $methodName) {
return new InlineAction($id, $this, $methodName);
}
}
}
return null;
}
這點(diǎn)有點(diǎn)low,不過(guò)問(wèn)題倒不大,這個(gè)代碼很容易理解,我們發(fā)現(xiàn),其實(shí)如果在這個(gè)源碼的基礎(chǔ)上再加上一個(gè)else就可以搞定,但是還是不建議直接改源碼。
由于我們的項(xiàng)目用的事yii2的advanced版本,并且里面有多個(gè)項(xiàng)目,還要保證其他項(xiàng)目使用正常(也就是個(gè)別的控制器才需要使用駝峰命名的方式訪問(wèn)),這也容易:
我們可以寫(xiě)個(gè)components處理:\common\components\zController.php
?php
/**
* Created by PhpStorm.
* User: Steven
* Date: 2017/10/26
* Time: 16:50
*/
namespace common\components;
use \yii\base\Controller;
use yii\base\InlineAction;
class zController extends Controller //這里需要繼承自\yii\base\Controller
{
/**
* Author:Steven
* Desc:重寫(xiě)路由,處理訪問(wèn)控制器支持駝峰命名法
* @param string $id
* @return null|object|InlineAction
*/
public function createAction($id)
{
if ($id === '') {
$id = $this->defaultAction;
}
$actionMap = $this->actions();
if (isset($actionMap[$id])) {
return \Yii::createObject($actionMap[$id], [$id, $this]);
} elseif (preg_match('/^[a-z0-9\\-_]+$/', $id) strpos($id, '--') === false trim($id, '-') === $id) {
$methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id))));
if (method_exists($this, $methodName)) {
$method = new \ReflectionMethod($this, $methodName);
if ($method->isPublic() $method->getName() === $methodName) {
return new InlineAction($id, $this, $methodName);
}
}
} else {
$methodName = 'action' . $id;
if (method_exists($this, $methodName)) {
$method = new \ReflectionMethod($this, $methodName);
if ($method->isPublic() $method->getName() === $methodName) {
return new InlineAction($id, $this, $methodName);
}
}
}
return null;
}
}
ok ,這就可以支持使用駝峰形式訪問(wèn)了,當(dāng)然這個(gè)的形式很多,也可以寫(xiě)成一個(gè)控制器,然后其它控制器繼承這個(gè)控制器就行了,但是原理是一樣的
如果使用? 是需要用駝峰命名形式訪問(wèn)的控制器中,繼承下這個(gè)zController就可以了,
?php
/**
* Created by PhpStorm.
* User: Steven
* Date: 2017/10/18
* Time: 15:57
*/
namespace backend\modules\hotel\controllers;
use yii\filters\AccessControl;
use yii\filters\ContentNegotiator;
use yii\web\Response;
use common\components\zController;
class QunarController extends zController
{
public $enableCsrfValidation = false;
public function behaviors()
{
$behaviors = parent::behaviors();
unset($behaviors['authenticator']);
$behaviors['corsFilter'] = [
'class' => \yii\filters\Cors::className(),
'cors' => [ // restrict access to
'Access-Control-Request-Method' => ['*'], // Allow only POST and PUT methods
'Access-Control-Request-Headers' => ['*'], // Allow only headers 'X-Wsse'
'Access-Control-Allow-Credentials' => true, // Allow OPTIONS caching
'Access-Control-Max-Age' => 3600, // Allow the X-Pagination-Current-Page header to be exposed to the browser.
'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
],
];
//配置ContentNegotiator支持JSON和XML響應(yīng)格式
/*$behaviors['contentNegotiator'] = [
'class' => ContentNegotiator::className(), 'formats' => [
'application/xml' => Response::FORMAT_XML
]
];*/
$behaviors['access'] = [
'class' => AccessControl::className(),
'rules' => [
[
'ips' => ['119.254.26.*', //去哪兒IP訪問(wèn)白名單
'127.0.0.1','106.14.56.77','180.168.4.58' //蜘蛛及本地IP訪問(wèn)白名單
], 'allow' => true,
],
],
];
return $behaviors;
}
}
?>
示例:
/**
* Author:Steven
* Desc:酒店靜態(tài)數(shù)據(jù)接口
*/
public function actiongetFullHotelInfo()
{
}
訪問(wèn)的時(shí)候url為www.test.com/getFullHotelInfo
總結(jié)
以上所述是小編給大家介紹的Yii2使用駝峰命名的形式訪問(wèn)控制器,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
您可能感興趣的文章:- 詳解PHP的Yii框架中的Controller控制器
- Yii2創(chuàng)建控制器(createController)方法詳解
- yii2控制器Controller Ajax操作示例
- Yii2使用$this->context獲取當(dāng)前的Module、Controller(控制器)、Action等
- Yii2設(shè)置默認(rèn)控制器的兩種方法
- Yii控制器中操作視圖js的方法
- Yii控制器中filter過(guò)濾器用法分析
- Yii2使用駝峰命名的形式訪問(wèn)控制器(實(shí)例講解)
- Yii2框架控制器、路由、Url生成操作示例
- yii2 在控制器中驗(yàn)證請(qǐng)求參數(shù)的使用方法
- Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作示例