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

PHP 批量替换字符串

PHPer 们应该都知道 str_replace 函数,而如何使用数组批量替换某字符串内的子串,这里有个骚操作。 话不多说,直接上代码: $map = [ 'foo' => 'bar', // ... ]; $str = str_replace(array_keys($map), array_values($map), $str);

July 11, 2018 · Wi1dcard

PHP 使用 array_map 替代 foreach

讲个 PHP 的骚操作。论如何实现:把二维数组内某二维元素的值,单独提出来组成一维数组。 0x00 传统操作 $pieces = []; foreach($whole as $item) { $pieces[] = $item['foo']; } return $pieces; 0x01 骚操作 return array_map( function ($item) { return $item['foo']; }, $whole ); 省掉两个变量($pieces、$item),对于业务逻辑比较复杂的位置,省一个变量说不定就少死十个脑细胞…

July 11, 2018 · Wi1dcard

PHPCPD - 检查复制粘贴的 PHP 代码

最近突然对代码质量检查感兴趣,决定对公司项目的代码冗余进行彻查。经过搜索发现一款不错的工具,针对复制粘贴的代码有不错的识别率,在此推荐。 0x00 准备 项目地址:https://github.com/sebastianbergmann/phpcpd 0x01 安装 直接下载代码包 wget https://phar.phpunit.de/phpcpd.phar chmod +x phpcpd.phar 或使用 Composer 全局安装 composer global require sebastian/phpcpd 0x02 使用 使用方法非常简单,只要带上代码文件夹路径即可。

July 4, 2018 · Wi1dcard

PHP intval() 与 (int) 转换的区别

说到字符串转整型,PHP 里常用的两个方法相信各位都有了解,但其中微小的区别缺鲜为人知。本文简单梳理,以备日后查阅。 功能 对于十进制的转换,两种方式的功能是完全一致的: $int = intval($str); // 等价于 $int = (int) $str; 而 intval() 具备一个可选参数 $base 默认值为 10,用于转换不同来自进制的数据: $int = intval('0123', 8); // == 83 由这个参数,又引起另一条需要注意的点,先看例子:

June 18, 2018 · Wi1dcard

AMH 面板重复加载 MySQL 扩展

真是天下没有不坑的面板… 相继宝塔和 WDCP 之后,AMH 也出了问题。 0x00 表象 报错如下: PHP Warning: Module 'mysql' already loaded in Unknown on line 0 logs/amh-php-errors.log 文件内也有偶尔出现的记录。

June 14, 2018 · Wi1dcard

宝塔面板 PHP 打开文件失败原因排查

近期在使用宝塔面板部署 PHP 项目时,上传文件的场景,PHP 无法对临时文件进行打开操作,无法计算sha1、md5,遂进行排查。 0x00 报错 sha1_file(): open_basedir restriction in effect. File(/www/wwwroot/tmp/***) is not within the allowed path(s): (***) 0x01 原因 新版宝塔面板创建站点时默认添加 .

June 13, 2018 · Wi1dcard

PHP 相对路径转绝对路径

PHP has a very handy function to convert relative pathnames to absolute paths: realpath(). However, it’s limited in at least two aspects which both make it inconvenient (and sometimes impossible) to use:

June 8, 2018 · Wi1dcard

json_encode() 序列化非公开属性

近期项目过程中,有一处场景需要使用 json_encode 方法序列化某对象内的 protected 属性。 0x00 实现 谈到 json_encode 自然想到 <code>JsonSerializable</code> 接口,此接口提供一个抽象方法: abstract public mixed JsonSerializable::jsonSerialize ( void ) 于是我们可以这样实现:

June 8, 2018 · Wi1dcard