yii2 随笔(七)依赖注入——(1)什么是依赖注入

在学yii2之前,就已经知道了“依赖注入”的这个名词,也尝试了解过,但是都是一直云里雾里的,可能是一直没有机会真实的使用过,所以了解的不太彻底,这次学习yii2顺便把这个所谓“高大上”给搞定!!!哈哈

在开始“依赖注入”之前,我们先说说设计模式,我觉的从这方面入手可能理解的更快一些。
在最开始学程序时,我们学的是“过程式”编程,比如说实现某些功能,从上到下一句一句的来实现,顶多是把某些通用的功能整理出来当做一些通用包(函数)。再然后我们了解到“面向对象”,随之而来的就是如何应用“对象”的观念来设计出更好的程序(各种设计模式),而“依赖注入”也是一种设计模式的实现。它的实现解决了我们实现功能时的对“前后依赖”或者说是“上下文的依赖”的关注。这句话听起来比较难懂,下面简单解释一下。
怎么理解“前后依赖”
比如说我们要分别制造一辆“宝马”和一辆“保时捷”,在制造宝马时,要严格的遵守下面的顺序(1、2可以不固定顺序):
1. 找到宝马工厂,(require或include)
2. 准备好制造宝马前的准备(初始化对象的参数,如果参数是对象的话,可能同样需要准备一些参数。。。)
3. 必须1和2 都准备完全了之后,才可以生成“宝马”(new BaoMa($params1,$params2….)),就是1 和 2 必须在3之前。
制造“保时捷”要同样的过程,当然,制造其他的车的时候,也都要走一遍这个过程。这就是“前后依赖”的问题。有没有一种办法可以把实现车的这个过程单独整理出来实现通用呢?也就是说先把实现过程准备好,然后再提供“原材料”,要实现什么东西,就要看你提供的什么“原材料”(依赖注入)。

发表在 yii2 | 标签为 , , , | 一条评论

php isset 和 array_key_exists 检查数组中是否存在某值的区别

先看看下面这段代码,你觉得结果是什么呢?

//定义一个数组, > 5.4
$arr = ['a' => null];
var_dump(isset($arr), array_key_exists('a', $arr));

———————下面是结果—————————

/*
 * 输出
 *bool(false)
 *bool(true)
 */

//isset 的用法是: 检测变量是否设置,并且不是 NULL。所以会有上面的输出
//如果判断数组中是否存在某个键值,还是乖乖的用 array_key_exists 吧,不然就是给自己挖了一个巨隐藏的坑啊!!!
发表在 php 优化 | 留下评论

yii2 随笔(六)利用事件触发修改请求参

yii2 可以使用事件机制来触发特殊的处理,实现了代码扩展,可以理解为在yii2内核层已经埋下了隐藏的“钩子”,用于后期扩展,比如 yii\base\application::run() 方法就埋下了两个“钩子”

public function run()  
    {  
        try {  
  
            $this->state = self::STATE_BEFORE_REQUEST;  
            //触发第一个事件(钩子) ,在执行主体之前方面修改一些参数  
            $this->trigger(self::EVENT_BEFORE_REQUEST);  
  
            $this->state = self::STATE_HANDLING_REQUEST;  
            $response = $this->handleRequest($this->getRequest());  
            //触发第二个事件(“钩子”),用于处理运行主体之后,触发一些逻辑  
            $this->state = self::STATE_AFTER_REQUEST;  
            $this->trigger(self::EVENT_AFTER_REQUEST);  
  
            $this->state = self::STATE_SENDING_RESPONSE;  
            $response->send();  
  
            $this->state = self::STATE_END;  
  
            return $response->exitStatus;  
  
        } catch (ExitException $e) {  
  
            $this->end($e->statusCode, isset($response) ? $response : null);  
            return $e->statusCode;  
  
        }  
    } 

我们利用第一个事件,触发修改路由控制,仅作测试使用
1. 在 config/web.php 中添加配置

//添加一个路径别名,可以理解为注册一个新的包为sdk,包的路径为 指定的文件夹。  
yii::setAlias('sdk', dirname(__DIR__).'/sdk');  
//注册一个名为test 的组件,并指定组件所对应的对象,yii2 使用 createObject 方法自动创建这个对象。其他的键可以代表 test 组件的属性值(如果有的话)。  
$config['components']['test'] => ['class'=>'sdk\Test'];  
//test 组件自动加载  
$config['bootstrap'][] = 'test';  

2. 在根目录(和config同级目录)创建sdk目录,在sdk目录下创建Test.php,代码如下:

<?php
namespace sdk;  
  
use Yii;  
//注意大小写,应完全与文件名一样,首字母大写是yii2的规范。  
//这里继承Object是因为配合yii2的运行方式,使用init()函数作为代码的初识话函数,当然仅仅做本此事需求的话,可以写在构造函数里,而不用继承任何基类  
class Test extends yii\base\Object{  
    //构造函数时运行  
    public function init(){  
        //在App里面注册一个处理事件,该事件对应上面提到的yii\base\Application::run()里的第一个事件  
        Yii::$app->on(yii\base\Application::EVENT_BEFORE_REQUEST, function($event){  
            //得到request 对象  
            $request = Yii::$app->getRequest();  
            //检查该对象源码,发现该对象可以修改的内容均为 set.... 开头的,这里用setPathInfo(),设置路由控制器的(用于指定解析本次处理的控制器)。  
            $request->setPathInfo('message/pros');  
        });  
    }  
}  
发表在 yii2 | 留下评论

yii2随笔(五):mysql 防注入 实现 mysql_real_escape_string 功能

用yii2写程序时,一般的简单的sql用yii2封装好的DB库http://www.yiichina.com/doc/guide/2.0/db-dao#w0-6,但是如果不得不写比较复杂的sql,或者你的sql功力足够强大,那么你更愿意自己写sql,是在不再想研究 yii2 封装的DB,总感觉用起来麻烦,那么放sql注入是很重要的,yii2使用的是 Yii::$app->db->quoteValue() (等价 PDO::quote) ,用例如下:

//..else code
$where['channel'] = Yii::$app->db->quoteValue($channel);
//..else code
$all = Yii::$app->db->createCommand($sql)->queryAll();
发表在 yii2 | 留下评论

yii2 随笔(四):文件日志监控

日志使用方式:http://www.yiifans.com/yii2/guide/runtime-logging.html
使用时注意日志的权限
基本配置如下:

[  
    'bootstrap' => ['log'], // ensure logger gets loaded before application starts  
    'components' => [  
        'log' => [  
            'targets' => [  
                'file' => [  
                    'class' => 'yii\log\FileTarget',  //日志处理类
                    'levels' => ['trace', 'info'],  //trace,info 级别的日志写入到文件
                    'categories' => ['yii\*'],  // 指所有以 yii\ 开头的类别
                ],  
                'email' => [  
                    'class' => 'yii\log\EmailTarget',  //日志处理类
                    'levels' => ['error', 'warning'],  //error,warning级别的日志发送邮件
                    'message' => [  
                        'to' => ['admin@techbrood.com', 'support@techbrood.com'],  
                        'subject' => 'New example.com log message',  
                    ],  
                ],  
            ],  
        ],  
    ],  
]  

基本使用方法如下:

//还有其他参数,请参考手册或者源码
\Yii::info('Hello, I am a test log message');
\Yii::error('Hello, I am a test log message');
\Yii::trace('Hello, I am a test log message');
\Yii::warning('Hello, I am a test log message');
发表在 yii2 | 留下评论

yii随笔(三) 开启友好路径

概述:实现 localhost/site/login 访问 localhost/index.php?r=site/login
1. web server 配置
a. nginx 配置
location / {

try_files $uri $uri/ /index.php?$args;
}

b. apache 配置

DocumentRoot “webroot”


RewriteEngine on

# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php

# …other settings…

2. 在配置文件中的 components 里 添加如下(配置urlManager)
‘urlManager’ =>[
‘class’ => ‘yii\web\UrlManager’,
‘showScriptName’ => false,
‘enablePrettyUrl’ => true,
],

发表在 yii2 | 留下评论

yii 随笔(二):创建第一个用户(yii2脚本程序初识)

1. 进入到 webroot/advanced (yii安装目录)

2.创建数据库, 配置数据库
配置文件路径为:webroot/advanced/common/config/main-local.php

3. 进入到 webroot/advanced目录, 执行 yii migrate 命令(migrate命令是yii自带的数据库转移工具,可对数据库进行备份升级等操作)
该命令实质执行的数据文件是:webroot/advanced/console/migrations/*.php
该命令的执行控制器文件是:webroot/advanced/vendor/yiisoft/yii2/console/controllers/MigrateController.php

4. 现在有了现在数据库里有了 user表,现在建立一个可登陆的用户

5. 用命令行创建password
1). 创建新的命令行控制器

webroot/advanced/console/controllers/testController.php

2). 在新的命令行控制器写下

/**
 * 主命令
 * 本例预计执行示例:在yii根目录执行 yii test(或者 yii test/tes) 
 */

//不可少
namespace console\controllers;
//不可少
use Yii;
//控制器的名字首字母必须为大写,继承 console 控制器
class TestController extends \yii\console\Controller{
    //默认执行的子命令,首字母必须为小写
    public $defaultAction = 'tes';
    
    //执行的子命令
    public function actionTes(){
        echo Yii::$app->getSecurity()->generatePasswordHash('123123');//123123 是需要被设置的密码
        return 0;
    }
}

发表在 yii2 | 留下评论

yii 随笔(一):初始化环境

1. 下载高级模板包(我选择的是解压安装)
http://www.yiiframework.com/download/

2. 解压安装包(我下载的是https://github.com/yiisoft/yii2/releases/download/2.0.6/yii-advanced-app-2.0.6.tgz),到 webroot/advanced

3. 进到 webroot/advanced 执行 init,跟着提示走

4. 开启apache(关于安装,配置略)

5.访问前台 http://localhost/advanced/frontend/web/

发表在 yii2 | 留下评论

php 中 str_replace或者preg_replace对php代码的性能的影响

str_replace或者preg_replace对php代码的性能的影响,如下:


$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
$time = array_sum(explode(' ',microtime() ) );
for($i = 0;$i < 500; $i++){
	$str = $str;
}
echo 'time is: ' .(array_sum(explode(' ',microtime() ) ) - $time).'<br />';
$time = array_sum(explode(' ',microtime() ) );
for($i = 0;$i < 500; $i++){
	$str = str_replace('dolor','dolor',$str);
}
echo 'time is: ' .(array_sum(explode(' ',microtime() ) ) - $time).'(str_replace)<br />';
$time = array_sum(explode(' ',microtime() ) );
for($i = 0;$i < 500; $i++){
	$str = preg_replace("/dolor/",'dolor', $str);
}
echo 'time is: ' .(array_sum(explode(' ',microtime() ) ) - $time).'(preg_replace)<br />';
exit;
//time is: 0.000119924545288
//time is: 0.0014500617981(str_replace)
//time is: 0.00306391716003(preg_replace)
发表在 php 优化 | 留下评论

mysql left join,right join,inner join 的区别

mysql> select * from str;
+----+-----------+-----------+
| id | string    | scenario  |
+----+-----------+-----------+
|  1 | dddd      |           | 
|  2 | ssssff    | ffff      | 
|  3 | 1231      | 23123123  | 
|  4 | 123123123 | 123123123 | 
|  5 | ssssff    | ffff      | 
|  6 | asdfas    | fffffdsdf | 
+----+-----------+-----------+
6 rows in set (0.00 sec)

mysql> select * from str1;
+------+------+
| s_id | tag  |
+------+------+
|    1 | 33   | 
|    4 | aas  | 
|    5 | asdf | 
|    7 | sdf  | 
|    8 | asdf | 
+------+------+
5 rows in set (0.00 sec)

mysql> select * from str s left join str1  t on s.id = t.s_id;
+----+-----------+-----------+------+------+
| id | string    | scenario  | s_id | tag  |
+----+-----------+-----------+------+------+
|  1 | dddd      |           |    1 | 33   | 
|  2 | ssssff    | ffff      | NULL | NULL | 
|  3 | 1231      | 23123123  | NULL | NULL | 
|  4 | 123123123 | 123123123 |    4 | aas  | 
|  5 | ssssff    | ffff      |    5 | asdf | 
|  6 | asdfas    | fffffdsdf | NULL | NULL | 
+----+-----------+-----------+------+------+
6 rows in set (0.00 sec)

mysql> select * from str s right join str1  t on s.id = t.s_id;
+------+-----------+-----------+------+------+
| id   | string    | scenario  | s_id | tag  |
+------+-----------+-----------+------+------+
|    1 | dddd      |           |    1 | 33   | 
|    4 | 123123123 | 123123123 |    4 | aas  | 
|    5 | ssssff    | ffff      |    5 | asdf | 
| NULL | NULL      | NULL      |    7 | sdf  | 
| NULL | NULL      | NULL      |    8 | asdf | 
+------+-----------+-----------+------+------+
5 rows in set (0.00 sec)

mysql> select * from str s inner join str1  t on s.id = t.s_id;
+----+-----------+-----------+------+------+
| id | string    | scenario  | s_id | tag  |
+----+-----------+-----------+------+------+
|  1 | dddd      |           |    1 | 33   | 
|  4 | 123123123 | 123123123 |    4 | aas  | 
|  5 | ssssff    | ffff      |    5 | asdf | 
+----+-----------+-----------+------+------+
3 rows in set (0.00 sec)

mysql> select * from str s inner join str1  t ;
+----+-----------+-----------+------+------+
| id | string    | scenario  | s_id | tag  |
+----+-----------+-----------+------+------+
|  1 | dddd      |           |    1 | 33   | 
|  1 | dddd      |           |    4 | aas  | 
|  1 | dddd      |           |    5 | asdf | 
|  1 | dddd      |           |    7 | sdf  | 
|  1 | dddd      |           |    8 | asdf | 
|  2 | ssssff    | ffff      |    1 | 33   | 
|  2 | ssssff    | ffff      |    4 | aas  | 
|  2 | ssssff    | ffff      |    5 | asdf | 
|  2 | ssssff    | ffff      |    7 | sdf  | 
|  2 | ssssff    | ffff      |    8 | asdf | 
|  3 | 1231      | 23123123  |    1 | 33   | 
|  3 | 1231      | 23123123  |    4 | aas  | 
|  3 | 1231      | 23123123  |    5 | asdf | 
|  3 | 1231      | 23123123  |    7 | sdf  | 
|  3 | 1231      | 23123123  |    8 | asdf | 
|  4 | 123123123 | 123123123 |    1 | 33   | 
|  4 | 123123123 | 123123123 |    4 | aas  | 
|  4 | 123123123 | 123123123 |    5 | asdf | 
|  4 | 123123123 | 123123123 |    7 | sdf  | 
|  4 | 123123123 | 123123123 |    8 | asdf | 
|  5 | ssssff    | ffff      |    1 | 33   | 
|  5 | ssssff    | ffff      |    4 | aas  | 
|  5 | ssssff    | ffff      |    5 | asdf | 
|  5 | ssssff    | ffff      |    7 | sdf  | 
|  5 | ssssff    | ffff      |    8 | asdf | 
|  6 | asdfas    | fffffdsdf |    1 | 33   | 
|  6 | asdfas    | fffffdsdf |    4 | aas  | 
|  6 | asdfas    | fffffdsdf |    5 | asdf | 
|  6 | asdfas    | fffffdsdf |    7 | sdf  | 
|  6 | asdfas    | fffffdsdf |    8 | asdf | 
+----+-----------+-----------+------+------+
30 rows in set (0.00 sec)
发表在 mysql | 留下评论