本文讲解:如何把控制器内的任意一个 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 => 实际的动作。
类似 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; } } ); } 或者在配置内定义也可以:
PHPer 们应该都知道 str_replace 函数,而如何使用数组批量替换某字符串内的子串,这里有个骚操作。
话不多说,直接上代码:
$map = [ 'foo' => 'bar', // ... ]; $str = str_replace(array_keys($map), array_values($map), $str);
讲个 PHP 的骚操作。论如何实现:把二维数组内某二维元素的值,单独提出来组成一维数组。
0x00 传统操作 $pieces = []; foreach($whole as $item) { $pieces[] = $item['foo']; } return $pieces; 0x01 骚操作 return array_map( function ($item) { return $item['foo']; }, $whole ); 省掉两个变量($pieces、$item),对于业务逻辑比较复杂的位置,省一个变量说不定就少死十个脑细胞…
最近突然对代码质量检查感兴趣,决定对公司项目的代码冗余进行彻查。经过搜索发现一款不错的工具,针对复制粘贴的代码有不错的识别率,在此推荐。
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 使用 使用方法非常简单,只要带上代码文件夹路径即可。
说到字符串转整型,PHP 里常用的两个方法相信各位都有了解,但其中微小的区别缺鲜为人知。本文简单梳理,以备日后查阅。
功能 对于十进制的转换,两种方式的功能是完全一致的:
$int = intval($str); // 等价于 $int = (int) $str; 而 intval() 具备一个可选参数 $base 默认值为 10,用于转换不同来自进制的数据:
$int = intval('0123', 8); // == 83 由这个参数,又引起另一条需要注意的点,先看例子:
真是天下没有不坑的面板… 相继宝塔和 WDCP 之后,AMH 也出了问题。
0x00 表象 报错如下:
PHP Warning: Module 'mysql' already loaded in Unknown on line 0
logs/amh-php-errors.log 文件内也有偶尔出现的记录。
近期在使用宝塔面板部署 PHP 项目时,上传文件的场景,PHP 无法对临时文件进行打开操作,无法计算sha1、md5,遂进行排查。
0x00 报错 sha1_file(): open_basedir restriction in effect. File(/www/wwwroot/tmp/***) is not within the allowed path(s): (***)
0x01 原因 新版宝塔面板创建站点时默认添加 .
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:
近期项目过程中,有一处场景需要使用 json_encode 方法序列化某对象内的 protected 属性。
0x00 实现 谈到 json_encode 自然想到 <code>JsonSerializable</code> 接口,此接口提供一个抽象方法:
abstract public mixed JsonSerializable::jsonSerialize ( void ) 于是我们可以这样实现: