Yii2 获取当前请求的路由信息

如题,有两种方案实现。 方案一: Yii::$app->controller->route; 方案二: Yii::$app->requestedRoute 看过源码后才知道这俩的区别。 方案一是根据当前请求已创建的 module / controller / action,也就是实际处理当前请求的模块、控制器、方法所组合而成的路由,绝对规范。 方案二是根据 UrlManager::routeParam 等配置,解析请求 URL 取得的访问路由,不一定规范,但对用户可见。 通常情况下两种方法应该是等效的;某些特殊场景,例如修改过根据路由解析创建控制器的过程、内部反代重写过 URL 等,则有可能导致两方得到的值不一致。

August 29, 2018 · Wi1dcard

Yii2 输出文件下载响应

最近为了尽可能优雅地实现产品需求,天天看 Yii 源码,感觉还是非常爽的。本文将要介绍如何使用 Yii 内置的方法,输出文件、流、字符串为下载响应。 通过查看 yii\web\Response 源码可知,其提供如下方法: public function sendFile($filePath, $attachmentName = null, $options = []); public function sendContentAsFile($content, $attachmentName, $options = []); public function sendStreamAsFile($handle, $attachmentName, $options = []); 那么如何在控制器内调用此方法输出呢?

July 14, 2018 · Wi1dcard

Yii2 在模块内映射 Controller 到其它控制器

上文讲解关于如何映射 Action,本文讲解如何映射 Controller。 0x00 实现 首先,在你的 Module 里,定义一个 $controllerRedirectMap 变量。 public $controllerRedirectMap = []; 重写 createControllerByID 方法。 public function createControllerByID($id) { if(isset($this->controllerRedirectMap[$id])) { $id = $this->controllerRedirectMap[$id]; } return parent::createControllerByID($id); } 0x01 用法 public $controllerRedirectMap = [ 'foo' => 'bar' // 访问 `module/foo/index` 将会被重定向至 `module/bar/index` 'foo/bar' => 'bar/foo' // 访问 `module/foo/bar/index` 将会被重定向至 `module/bar/foo/index` ]; 0x02 感想 一口气写三篇关于 Yii2 的博文,算是对自己近期项目中用到 Yii 以来的技巧小结吧。

July 13, 2018 · Wi1dcard

Yii2 在控制器内映射 Action 到其它动作

本文讲解:如何把控制器内的任意一个 Action 映射到另一个 Action。 0x00 准备 Yii ^ 2.0.7 0x01 代码 首先定义一个 RedirectAction 类。 class RedirectAction { protected $actionId; public function __construct($actionId) { $this->actionId = $actionId; } public function __invoke($id, \yii\base\Controller $controller) { return $controller->createAction($this->actionId); } } 接着在控制器内重写实现 actions() 方法,用于映射 Action ID => 实际的动作。

July 13, 2018 · Wi1dcard

Yii2 允许控制器内直接返回数组

类似 Laravel 的效果:直接 return 数组输出 JSON 响应。办法有很多,目前我找到的最优解决方案如下。 /** * Enable JSON response if app returns Array or Object * * @return void */ protected function enableJsonResponse() { $this->response->on(\yii\web\Response::EVENT_BEFORE_SEND, function ($event) { /** @var \yii\web\Response $response */ $response = $event->sender; if (is_array($response->data) || is_object($response->data)) { $response->format = \yii\web\Response::FORMAT_JSON; } } ); } 或者在配置内定义也可以:

July 13, 2018 · Wi1dcard