Yii框架学习

Yii框架学习

如何通过GuzzleHttp组件下载远程文件并保存在本地?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4094 次浏览 • 2023-03-05 12:11 • 来自相关话题

Yii2的beforeAction中如何进行重定向?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3986 次浏览 • 2022-12-21 11:27 • 来自相关话题

Yii2框架Model的save方法保存数据返回成功,但数据库数据没有保存成功

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3420 次浏览 • 2022-10-26 17:14 • 来自相关话题

Yii2中如何在视图间传递数据?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1629 次浏览 • 2022-10-20 13:40 • 来自相关话题

在Yii2框架中使用rbac功能时,报错如何解决?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3348 次浏览 • 2022-10-19 20:37 • 来自相关话题

Yii2中怎么判断MySQL库中是否存在某张表?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3839 次浏览 • 2021-04-29 11:39 • 来自相关话题

Yii2怎么在ActivityRecorder中直接生成插入时间?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 6016 次浏览 • 2021-01-19 11:37 • 来自相关话题

Yii2框架如何在数据表Model中自动设置时间戳?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5822 次浏览 • 2019-08-01 15:17 • 来自相关话题

Yii2 tableName如何动态赋值?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5551 次浏览 • 2019-07-30 18:51 • 来自相关话题

Yii2 如何获取Header参数?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 7669 次浏览 • 2019-07-30 15:05 • 来自相关话题

条新动态, 点击查看
【当取出的结果是一条记录时】[code]$result = $aptitude->findOne($params )->attributes; 结果为数组:[code]array(13) {
["id"]=>
in... 显示全部 »
【当取出的结果是一条记录时】[code]$result = $aptitude->findOne($params )->attributes; 结果为数组:[code]array(13) {
["id"]=>
int(1)
["uid"]=>
string(36) "580bcd13-3701-8691-97dd-94ec320fdbc1"
["social_proof"]=>
int(2)
["certifier_name"]=>
string(6) "张丽"
["certifier_phone"]=>
string(11) "18600215587"
["work_name"]=>
string(36) "北京自如信息科技有限公司"
["work_address"]=>
string(60) "北京市朝阳区将台路5号院16号楼(链家总部)"
["urgency_name"]=>
string(9) "谢廖华"
["urgency_phone"]=>
string(11) "13693371920"
["urgency_relation"]=>
string(6) "领导"
["is_del"]=>
int(2)
["add_time"]=>
int(1470649536)
=>
string(19) "2016-08-08 17:45:58"
} 【当取出的结果是多条记录时,需要循环输出】[code]$result = $aptitude->find()->where(['catid'=>2])->all();
foreach($result as $key => $value) {
$newData[$key] = $value->attributes;
}

/**
* 统一方法
* */
function simplifyData($data){
foreach($data as $key=>$val){
$newData = $val->attributes;
}
return $newData;
} $activity->find()->select($files)->where($where)->asArray()->all();

如何通过GuzzleHttp组件下载远程文件并保存在本地?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4094 次浏览 • 2023-03-05 12:11 • 来自相关话题

Yii2的beforeAction中如何进行重定向?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3986 次浏览 • 2022-12-21 11:27 • 来自相关话题

Yii2框架Model的save方法保存数据返回成功,但数据库数据没有保存成功

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3420 次浏览 • 2022-10-26 17:14 • 来自相关话题

Yii2中如何在视图间传递数据?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1629 次浏览 • 2022-10-20 13:40 • 来自相关话题

在Yii2框架中使用rbac功能时,报错如何解决?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3348 次浏览 • 2022-10-19 20:37 • 来自相关话题

Yii2中怎么判断MySQL库中是否存在某张表?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3839 次浏览 • 2021-04-29 11:39 • 来自相关话题

Yii2怎么在ActivityRecorder中直接生成插入时间?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 6016 次浏览 • 2021-01-19 11:37 • 来自相关话题

Yii2框架如何在数据表Model中自动设置时间戳?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5822 次浏览 • 2019-08-01 15:17 • 来自相关话题

Yii2 tableName如何动态赋值?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5551 次浏览 • 2019-07-30 18:51 • 来自相关话题

Yii2 如何获取Header参数?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 7669 次浏览 • 2019-07-30 15:05 • 来自相关话题

Yii2框架中如何实现操作数据库某字段增加或减少一定数值?

Yii框架zkbhj 发表了文章 • 0 个评论 • 3828 次浏览 • 2018-05-17 17:41 • 来自相关话题

$user = UserList::find()->where(['id' => $id])->one();
$user->updateCounters(['login_counts'=>1]);
$user = UserList::find()->where(['id' => $id])->one();
$user->updateCounters(['login_counts'=>1]);

Yii2框架如何实现邮件发送

Yii框架zkbhj 发表了文章 • 0 个评论 • 2493 次浏览 • 2017-12-21 19:11 • 来自相关话题

今天在一个项目开发中遇到了邮件发送的需求,现在记录下如何在yii2中实现邮件发送:
我们需要用到一个组件——swiftmailer。
 
首先,在main.php中增加配置:'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' =>false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => 'mymail',
'password' => 'mymail',
'port' => '456',
//'encryption' => 'ssl',
],
'messageConfig'=>[
'charset'=>'UTF-8',
'from'=>['mymail@qq.com'=>'zkbhj']
],
]然后,在程序中:$userList = ['zkbhj@qq.com'];
$mail = Yii::$app->mailer;
$mail->useFileTransport = false;
$mail->compose()->setFrom('zkbhj@qq.com')
->setTo($userList)
->setSubject('数据统计')
->setHtmlBody($txt)
->send(); 
如果执行时发生如下报错,可以注释掉'encryption' => 'ssl',试试。 
Error: Connection could not be established with host smtp.qq.com 查看全部
今天在一个项目开发中遇到了邮件发送的需求,现在记录下如何在yii2中实现邮件发送:
我们需要用到一个组件——swiftmailer。
 
首先,在main.php中增加配置:
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' =>false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => 'mymail',
'password' => 'mymail',
'port' => '456',
//'encryption' => 'ssl',
],
'messageConfig'=>[
'charset'=>'UTF-8',
'from'=>['mymail@qq.com'=>'zkbhj']
],
]
然后,在程序中:
$userList = ['zkbhj@qq.com'];
$mail = Yii::$app->mailer;
$mail->useFileTransport = false;
$mail->compose()->setFrom('zkbhj@qq.com')
->setTo($userList)
->setSubject('数据统计')
->setHtmlBody($txt)
->send();
 
如果执行时发生如下报错,可以注释掉'encryption' => 'ssl',试试。 
Error: Connection could not be established with host smtp.qq.com

Yii2框架项目中实现excel的导入和导出

Yii框架zkbhj 发表了文章 • 0 个评论 • 9436 次浏览 • 2017-09-01 17:37 • 来自相关话题

导入导出Excel的需求场景
公司要做一个卡券系统的管理后台,经常会有大批量导入第三方卡券的需求,这时候,我们就需要后台系统支持excel文件的导入和导出功能,要实现这个功能,我们不能自己去从0研究Excel吧,即使可以,产品和项目进度也不允许呢,所以还是找轮子吧!我们都知道,yii2 框架有个composer组件功能,已经有很多大牛做了一些靠谱的组件给我们用了!
 
选择合适的组件
 
对比了官网和github上的一些composer组件,最终选择了老牌儿的PHPExcel,就是这个:phpoffice/phpexcel https://github.com/phpoffice/phpexcel
是的,有了这货,就可以帮我们完成了一切想要的功能了,它是一个很老牌很强大的Excel操作类,可以轻松生成一个电子表(csv、xls、xlsx),还能导入并分析电子表格,当然还有其他比如生成pdf等等。
 
如何使用?
 
首先要安装PHPExcel组件,方法非常简单,直接用包以来工具composer安装即可:composer require phpoffice/phpexcel安装成功后,程序vendor里应该多了一个phpoffice文件夹,就是它了。接下来,我们就可以使用了 ~





在包里配置上依赖关系





安装过程





安装成功后,vendor目录下发现了组件的身影~

PS:当然你要按照组件介绍中说明的系统环境安装使用,如下:





 
真正实现我们的需求:从excel表格导入数据





 
首先,准备好一个要导入的excel文档,文档内有6个要导入到库中的优惠券。
 
我们首先,要将excel中的优惠码数据,导入到一个数组变量中,然后再插入到数据库中。
 
接下来,我们写一个action来做这个事情:

 // 引入PHPExcel库
use PHPExcel;

public function actionImport(){
$file = Yii::getAlias("@webroot")."/import_test.xls";
$objReader = new \PHPExcel_Reader_Excel5();
$objPHPExcel = $objReader->load($file);

$objWorksheet = $objPHPExcel->getSheet(0);
//最大行数,为数字
$highestRow = $objWorksheet->getHighestRow();
//最大列数 为字母
$highestColumn = $objWorksheet->getHighestColumn();
//将字母变为数字
$highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn);

$tableData = [];
for($row = 1;$row<=$highestRow;$row++){
for($col=0;$col< $highestColumnIndex;$col++){
$tableData[$row][$col] = $objWorksheet->getCellByColumnAndRow($col,$row)->getValue();
}
}
var_dump($tableData);
}最终,我们将得到如下结果:






ok!excel中的数据顺利来到了数组里,接下来的事情应该都会了,就不在这篇文章里赘述了!

真正实现我们的需求:从数据表中导出数据到excel文件
 
我们从库中读出几个优惠码,然后点击生成电子表格,直接浏览器下载,同样的,我们在一个action里来实现这个功能:
use PHPExcel;
$headerArr = ['优惠券编码'];

$fileName = "export_test.xls";
$objPHPExcel = new PHPExcel();
$objProps = $objPHPExcel->getProperties();

$hk = ord('A');
foreach($headerArr as $v){
$colum = chr($hk);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum.'1',$v);
$hk += 1;
}

$column = 2;
$data = ['adf5t56','5g6HTT4','9QWabh5','xcvTg7'];
$objActSheet = $objPHPExcel->getActiveSheet();
foreach($data as $key => $rows) //行写入
{
$span = 0;
foreach($rows as $keyName => $value) // 列写入
{
$j = \PHPExcel_Cell::stringFromColumnIndex($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}

$objPHPExcel->getActiveSheet()->setTitle('Export Test');
$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"$fileName\"");
header('Cache-Control: max-age=0');

$writer = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
$writer->save('php://output');
bingo!一切顺利完成~ 查看全部
导入导出Excel的需求场景
公司要做一个卡券系统的管理后台,经常会有大批量导入第三方卡券的需求,这时候,我们就需要后台系统支持excel文件的导入和导出功能,要实现这个功能,我们不能自己去从0研究Excel吧,即使可以,产品和项目进度也不允许呢,所以还是找轮子吧!我们都知道,yii2 框架有个composer组件功能,已经有很多大牛做了一些靠谱的组件给我们用了!
 
选择合适的组件
 
对比了官网和github上的一些composer组件,最终选择了老牌儿的PHPExcel,就是这个:
phpoffice/phpexcel https://github.com/phpoffice/phpexcel

是的,有了这货,就可以帮我们完成了一切想要的功能了,它是一个很老牌很强大的Excel操作类,可以轻松生成一个电子表(csv、xls、xlsx),还能导入并分析电子表格,当然还有其他比如生成pdf等等。
 
如何使用?
 
首先要安装PHPExcel组件,方法非常简单,直接用包以来工具composer安装即可:
composer require phpoffice/phpexcel
安装成功后,程序vendor里应该多了一个phpoffice文件夹,就是它了。接下来,我们就可以使用了 ~

QQ截图20170901172949.png

在包里配置上依赖关系

QQ截图20170901173848.png

安装过程

QQ截图20170901173320.png

安装成功后,vendor目录下发现了组件的身影~

PS:当然你要按照组件介绍中说明的系统环境安装使用,如下:

QQ截图20170901172707.png

 
真正实现我们的需求:从excel表格导入数据

QQ截图20170901173638.png

 
首先,准备好一个要导入的excel文档,文档内有6个要导入到库中的优惠券。
 
我们首先,要将excel中的优惠码数据,导入到一个数组变量中,然后再插入到数据库中。
 
接下来,我们写一个action来做这个事情:

 
// 引入PHPExcel库
use PHPExcel;

public function actionImport(){
$file = Yii::getAlias("@webroot")."/import_test.xls";
$objReader = new \PHPExcel_Reader_Excel5();
$objPHPExcel = $objReader->load($file);

$objWorksheet = $objPHPExcel->getSheet(0);
//最大行数,为数字
$highestRow = $objWorksheet->getHighestRow();
//最大列数 为字母
$highestColumn = $objWorksheet->getHighestColumn();
//将字母变为数字
$highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn);

$tableData = [];
for($row = 1;$row<=$highestRow;$row++){
for($col=0;$col< $highestColumnIndex;$col++){
$tableData[$row][$col] = $objWorksheet->getCellByColumnAndRow($col,$row)->getValue();
}
}
var_dump($tableData);
}
最终,我们将得到如下结果:

QQ截图20170901174923.png


ok!excel中的数据顺利来到了数组里,接下来的事情应该都会了,就不在这篇文章里赘述了!

真正实现我们的需求:从数据表中导出数据到excel文件
 
我们从库中读出几个优惠码,然后点击生成电子表格,直接浏览器下载,同样的,我们在一个action里来实现这个功能:
use PHPExcel;
$headerArr = ['优惠券编码'];

$fileName = "export_test.xls";
$objPHPExcel = new PHPExcel();
$objProps = $objPHPExcel->getProperties();

$hk = ord('A');
foreach($headerArr as $v){
$colum = chr($hk);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum.'1',$v);
$hk += 1;
}

$column = 2;
$data = ['adf5t56','5g6HTT4','9QWabh5','xcvTg7'];
$objActSheet = $objPHPExcel->getActiveSheet();
foreach($data as $key => $rows) //行写入
{
$span = 0;
foreach($rows as $keyName => $value) // 列写入
{
$j = \PHPExcel_Cell::stringFromColumnIndex($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
}

$objPHPExcel->getActiveSheet()->setTitle('Export Test');
$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"$fileName\"");
header('Cache-Control: max-age=0');

$writer = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
$writer->save('php://output');

bingo!一切顺利完成~

Yii2框架对入参进行验证的方法

Yii框架zkbhj 发表了文章 • 0 个评论 • 2506 次浏览 • 2017-08-08 20:22 • 来自相关话题

//获取验证参数
$model = \yii\base\DynamicModel::validateData([
'activity_code' => Yii::$app->getRequest()->post('activity_code'),
'uid' => Yii::$app->getRequest()->post('uid'),
'username' => Yii::$app->getRequest()->post('username'),
'phone' => Yii::$app->getRequest()->post('phone'),
'answer_1' => Yii::$app->getRequest()->post('answer_1'),
'answer_2' => Yii::$app->getRequest()->post('answer_2'),
'answer_3' => Yii::$app->getRequest()->post('answer_3')
], [
[['uid', 'activity_code', 'username', 'phone'], 'required'],
[['answer_1', 'answer_2', 'answer_3'], 'safe']
]);

if ($model->hasErrors()) {
FnModel::failureRespone('100001', $model->getErrors());
Yii::$app->end();
} 查看全部
//获取验证参数
$model = \yii\base\DynamicModel::validateData([
'activity_code' => Yii::$app->getRequest()->post('activity_code'),
'uid' => Yii::$app->getRequest()->post('uid'),
'username' => Yii::$app->getRequest()->post('username'),
'phone' => Yii::$app->getRequest()->post('phone'),
'answer_1' => Yii::$app->getRequest()->post('answer_1'),
'answer_2' => Yii::$app->getRequest()->post('answer_2'),
'answer_3' => Yii::$app->getRequest()->post('answer_3')
], [
[['uid', 'activity_code', 'username', 'phone'], 'required'],
[['answer_1', 'answer_2', 'answer_3'], 'safe']
]);

if ($model->hasErrors()) {
FnModel::failureRespone('100001', $model->getErrors());
Yii::$app->end();
}

Yii框架中rules的一些常见写法总结

Yii框架zkbhj 发表了文章 • 0 个评论 • 2467 次浏览 • 2017-07-21 09:32 • 来自相关话题

/**
* 规则
*/
public function rules()
{
return [
[['real_name','cert_type','cert_num','gender','phone','user_cert1','user_cert2','user_cert3','is_newsign','house_type'],'safe'],
[['cert_type','cert_num','real_name'], 'required','on' => self::SCENARIO_INSERT],
[['cert_type','cert_num','real_name','gender','phone'], 'required','on' => self::SCENARIO_FORSIGN],
['cert_type', 'default', 'value' => 0],
['cert_type','in', 'range'=>Yii::$app->params['allowCertTypeList'],'on' => [self::SCENARIO_UPDATE,self::SCENARIO_INSERT]],
['cert_type','in', 'range'=>[1,2,6,13],'on' => self::SCENARIO_FORSIGN],
['gender','in', 'range'=>Yii::$app->params['allowGenderList']],
['cert_num', function($attribute) {
if (isset($this->$attribute) && !isset($this->cert_type)) {
$this->addError($attribute, '证件类型和证件号码不匹配');
}
$is_cert = \apis\modules\account\models\logics\CertLogic::validateCertNum($this->cert_type,$this->$attribute);
if(!$is_cert){
$this->addError($attribute, '证件类型和证件号码不匹配');
}
}],
['cert_type', function($attribute) {
if($this->$attribute != 1 && (empty($this->user_cert1) || empty($this->user_cert2) || empty($this->user_cert3))){
$this->addError($attribute, '非身份证用户请上传证件照!');
}
},'on' => self::SCENARIO_FORSIGN],
[['user_cert1','user_cert2','user_cert3',],'filter', 'skipOnEmpty'=>true, 'filter'=>function($data){
return \common\models\FnModel::handleUUidToUrl($data);
}],
['real_name', function($attribute) {
$is_name = \apis\modules\account\models\logics\CertLogic::validateRealName($this->real_name);
if(!$is_name){
$this->addError($attribute, '真实姓名不符合规范');
}
},'on' => self::SCENARIO_FORSIGN],
];
}用到了Yii场景的应用,详见:https://ask.zkbhj.com/?/question/4 查看全部
/**
* 规则
*/
public function rules()
{
return [
[['real_name','cert_type','cert_num','gender','phone','user_cert1','user_cert2','user_cert3','is_newsign','house_type'],'safe'],
[['cert_type','cert_num','real_name'], 'required','on' => self::SCENARIO_INSERT],
[['cert_type','cert_num','real_name','gender','phone'], 'required','on' => self::SCENARIO_FORSIGN],
['cert_type', 'default', 'value' => 0],
['cert_type','in', 'range'=>Yii::$app->params['allowCertTypeList'],'on' => [self::SCENARIO_UPDATE,self::SCENARIO_INSERT]],
['cert_type','in', 'range'=>[1,2,6,13],'on' => self::SCENARIO_FORSIGN],
['gender','in', 'range'=>Yii::$app->params['allowGenderList']],
['cert_num', function($attribute) {
if (isset($this->$attribute) && !isset($this->cert_type)) {
$this->addError($attribute, '证件类型和证件号码不匹配');
}
$is_cert = \apis\modules\account\models\logics\CertLogic::validateCertNum($this->cert_type,$this->$attribute);
if(!$is_cert){
$this->addError($attribute, '证件类型和证件号码不匹配');
}
}],
['cert_type', function($attribute) {
if($this->$attribute != 1 && (empty($this->user_cert1) || empty($this->user_cert2) || empty($this->user_cert3))){
$this->addError($attribute, '非身份证用户请上传证件照!');
}
},'on' => self::SCENARIO_FORSIGN],
[['user_cert1','user_cert2','user_cert3',],'filter', 'skipOnEmpty'=>true, 'filter'=>function($data){
return \common\models\FnModel::handleUUidToUrl($data);
}],
['real_name', function($attribute) {
$is_name = \apis\modules\account\models\logics\CertLogic::validateRealName($this->real_name);
if(!$is_name){
$this->addError($attribute, '真实姓名不符合规范');
}
},'on' => self::SCENARIO_FORSIGN],
];
}
用到了Yii场景的应用,详见:https://ask.zkbhj.com/?/question/4

Yii2地址美化prettyURL并隐藏index.php

Yii框架zkbhj 发表了文章 • 0 个评论 • 2995 次浏览 • 2017-05-03 16:36 • 来自相关话题

目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components‘=>[] 中添加如下代码:
urlManager‘ => [
‘enablePrettyUrl‘ => true,
‘showScriptName‘ => false,//隐藏index.php
//‘enableStrictParsing‘ => false,
‘suffix‘ => ‘.html‘,//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
‘rules‘ => [
//‘<controller:\w+>/<action:\w+>‘=>‘<controller>/<action>‘,
],
],如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了! 查看全部
目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components‘=>[] 中添加如下代码:
urlManager‘ => [
‘enablePrettyUrl‘ => true,
‘showScriptName‘ => false,//隐藏index.php
//‘enableStrictParsing‘ => false,
‘suffix‘ => ‘.html‘,//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
‘rules‘ => [
//‘<controller:\w+>/<action:\w+>‘=>‘<controller>/<action>‘,
],
],
如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了!

Yii2数据操作Query Builder

Yii框架zkbhj 发表了文章 • 0 个评论 • 2470 次浏览 • 2017-01-04 11:32 • 来自相关话题

Query Builder$rows = (new \yii\db\Query())
->select(['dyn_id', 'dyn_name'])
->from('zs_dynasty')
->where(['between','dyn_id', 1,30])
->limit(10)
->all();
print_r($rows);use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');SELECT$query->select('*')->
select('dyn_id as id, dynasty.dyn_name')->
$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->
$query->select('user_id')->distinct()->

FORM​$query->from('user');
$query->from(['public.user u', 'public.post p']);
$query->from('public.user u, public.post p');
$query->from(['u' => 'public.user', 'p' => 'public.post']);
----------
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);WHEREwhere('status=1')->
where('status=:status', [':status' => $status])->
where([
'status' => 10,
'type' => null,
'id' => [4, 8, 15],
])->
-------
$userQuery = (new Query())->select('id')->from('user');
// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->...->where(['id' => $userQuery])->...
--------
['and', 'id=1', 'id=2'] //id=1 AND id=2
['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
['between', 'id', 1, 10] //id BETWEEN 1 AND 10
['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
['like', 'name', 'tester'] //name LIKE '%tester%'
['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
['exists','id', $userQuery] //EXISTS (sub-query) | not exists
['>', 'age', 10] //age>10ADD WHERE​$status = 10;
$search = 'yii';
$query->where(['status' => $status]);
if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//WHERE (`status` = 10) AND (`title` LIKE '%yii%')
//andWhere() or orWhere()FILTER WHERE​$query->filterWhere([
'username' => $username,
'email' => $email,
]);
//如果email为空,则 WHERE username=:usernameORDER BY$query->orderBy([
'id' => SORT_ASC,
'name' => SORT_DESC,
]);
//orderBy , addOrderByGROUP BY​$query->groupBy('id, status');
$query->addGroupBy(['created_at', 'updated_at']);
HAVING $query->having(['status' => $status]);
//having,andHaving,orHavingLIMIT OR OFFSET$query->limit(10);
$query->offset(10);
JOIN
innerJoin()leftJoin()rightJoin()
$query->select(['user.name AS author', 'post.title as title'])
->from('user')
->leftJoin('post', 'post.user_id = user.id');
$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION$query = new Query();
$query->select("id, category_id as type, name")->from('post')->limit(10);
$anotherQuery = new Query();
$anotherQuery->select('id, type, name')->from('user')->limit(10);
$query->union($anotherQuery);
QUERY METHODS
all() //所有行列one() //第一行column() //第一列scalar() //第一行第一列exists() //是否有结果存在count() //记录数量sum($q), average($q), max($q), min($q) //$q 为字段或表达式
$count = (new \yii\db\Query())
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->count();
//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name


$command = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->createCommand();
    
// show the SQL statement
echo $command->sql;
// show the parameters to be bound
print_r($command->params);


// returns all rows of the query result
$rows = $command->queryAll();

QUERY RESULTSuse yii\db\Query;
$query = (new Query())
->from('user')
->indexBy('username');
foreach ($query->batch() as $users) {
// $users is indexed by the "username" column
}
foreach ($query->each() as $username => $user) {
}INDEXINGuse yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
foreach ($query->batch() as $users) {
// batch( $batchSize = 100, $db = null )
// 一个批次取100行
}
foreach ($query->each() as $user) {
// 一行一行取
}


 
 
  查看全部
Query Builder
$rows = (new \yii\db\Query())
->select(['dyn_id', 'dyn_name'])
->from('zs_dynasty')
->where(['between','dyn_id', 1,30])
->limit(10)
->all();
print_r($rows);
use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
SELECT
$query->select('*')->
select('dyn_id as id, dynasty.dyn_name')->
$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->
$query->select('user_id')->distinct()->

FORM​
$query->from('user');
$query->from(['public.user u', 'public.post p']);
$query->from('public.user u, public.post p');
$query->from(['u' => 'public.user', 'p' => 'public.post']);
----------
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);
WHERE
where('status=1')->
where('status=:status', [':status' => $status])->
where([
'status' => 10,
'type' => null,
'id' => [4, 8, 15],
])->
-------
$userQuery = (new Query())->select('id')->from('user');
// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->...->where(['id' => $userQuery])->...
--------
['and', 'id=1', 'id=2'] //id=1 AND id=2
['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
['between', 'id', 1, 10] //id BETWEEN 1 AND 10
['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
['like', 'name', 'tester'] //name LIKE '%tester%'
['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
['exists','id', $userQuery] //EXISTS (sub-query) | not exists
['>', 'age', 10] //age>10
ADD WHERE​
$status = 10;
$search = 'yii';
$query->where(['status' => $status]);
if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//WHERE (`status` = 10) AND (`title` LIKE '%yii%')
//andWhere() or orWhere()
FILTER WHERE​
$query->filterWhere([
'username' => $username,
'email' => $email,
]);
//如果email为空,则 WHERE username=:username
ORDER BY
$query->orderBy([
'id' => SORT_ASC,
'name' => SORT_DESC,
]);
//orderBy , addOrderBy
GROUP BY​
$query->groupBy('id, status');
$query->addGroupBy(['created_at', 'updated_at']);

HAVING 
$query->having(['status' => $status]);
//having,andHaving,orHaving
LIMIT OR OFFSET
$query->limit(10);
$query->offset(10);

JOIN
  • innerJoin()
  • leftJoin()
  • rightJoin()

$query->select(['user.name AS author', 'post.title as title'])
->from('user')
->leftJoin('post', 'post.user_id = user.id');
$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION
$query = new Query();
$query->select("id, category_id as type, name")->from('post')->limit(10);
$anotherQuery = new Query();
$anotherQuery->select('id, type, name')->from('user')->limit(10);
$query->union($anotherQuery);

QUERY METHODS
  • all() //所有行列
  • one() //第一行
  • column() //第一列
  • scalar() //第一行第一列
  • exists() //是否有结果存在
  • count() //记录数量
  • sum($q), average($q), max($q), min($q) //$q 为字段或表达式

$count = (new \yii\db\Query())
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->count();
//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name


$command = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->createCommand();
    
// show the SQL statement
echo $command->sql;
// show the parameters to be bound
print_r($command->params);


// returns all rows of the query result
$rows = $command->queryAll();

QUERY RESULTS
use yii\db\Query;
$query = (new Query())
->from('user')
->indexBy('username');
foreach ($query->batch() as $users) {
// $users is indexed by the "username" column
}
foreach ($query->each() as $username => $user) {
}
INDEXING
use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
foreach ($query->batch() as $users) {
// batch( $batchSize = 100, $db = null )
// 一个批次取100行
}
foreach ($query->each() as $user) {
// 一行一行取
}


 
 
 

Yii2框架:命名空间

Yii框架zkbhj 发表了文章 • 0 个评论 • 2088 次浏览 • 2016-12-20 11:17 • 来自相关话题

命名空间概述
 
(PHP 5 >= 5.3.0, PHP 7)
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到/home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
 
如何声明?
 
(PHP 5 >= 5.3.0, PHP 7)
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。test1.php
<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>

test2.php
<html>
<?php
namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句
?>
 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

定义子命名空间

与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:<?php
namespace MyProject\Sub\Level;

const CONNECT_OK = 1; //常量MyProject\Sub\Level\CONNECT_OK
class Connection { /* ... */ } //类 MyProject\Sub\Level\Connection
function connect() { /* ... */ } //函数MyProject\Sub\Level\connect
?>

在同一个文件中定义多个命名空间

也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。
 <?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

namespace AnotherProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>

//不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法

//定义多个命名空间,大括号语法
<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。

将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来。//定义多个命名空间和不包含在命名空间中的代码
<?php
declare(encoding='UTF-8'); //除了开始的declare语句外,命名空间的括号外不得有任何PHP代码。
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace { // global

codesession_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
 使用命名空间:基础
 
在讨论如何使用命名空间之前,必须了解 PHP是如何知道要使用哪一个命名空间中的元素的。可以将 PHP命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
相对文件名形式如foo.txt。它会被解析为currentdirectory/foo.txt,其中 currentdirectory表示当前目录。因此如果当前目录是/home/foo,则该文件名被解析为/home/foo/foo.txt。相对路径名形式如subdirectory/foo.txt。它会被解析为currentdirectory/subdirectory/foo.txt。绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。

PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或foo::staticmethod();。如果当前命名空间是currentnamespace,foo 将被解析为currentnamespace\foo。如果使用 foo的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。限定名称,或包含前缀的名称,例如$a = new subnamespace\foo(); 或subnamespace\foo::staticmethod();。如果当前的命名空间是currentnamespace,则 foo 会被解析为currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo会被解析为subnamespace\foo。完全限定名称,或包含了全局前缀操作符的名称,例如,$a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
file1.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {}
class foo{
static function staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo{
static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
// 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO

/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如\strlen() 或\Exception 或\INI_ALL。
 <?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // 调用全局函数
strlen $b = \INI_ALL; // 访问全局常量
INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception
?>


namespace关键字和__NAMESPACE__常量
 
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
 //__NAMESPACE__ 示例, 在命名空间中的代码
<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

//__NAMESPACE__ 示例,全局代码
<?php

echo '"', __NAMESPACE__, '"'; // 输出 " "
?>

//使用__NAMESPACE__动态创建名称
<?php
namespace MyProject;
function get($classname){
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>

//namespace操作符,命名空间中的代码
<?php
namespace MyProject;

use blah\blah as mine; // see "Using namespaces: importing/aliasing"
blah\mine(); // calls function MyProject\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b

?>

//namespace操作符, 全局代码
<?php
namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname

$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>
 使用命名空间:别名/导入
 
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类
unix 文件系统中可以创建对其它的文件或目录的符号连接。

所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。

在PHP中,别名是通过操作符 use 来实现的.
 //使用use操作符导入/使用别名
<?php
namespace foo;

use My\Full\Classname as Another;
// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。

为了简化操作,PHP还支持在一行中使用多个use语句。
 //通过use操作符导入/使用别名,一行中包含多个use语句
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>

//导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a; // 实际化一个 Another 对象
?>

//另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>
 全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 '\'表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。<?php
namespace A\B\C;

/* 这个函数是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局的fopen函数
return $f;
}
?>

名称解析规则​
 
命名空间名称定义
非限定名称Unqualified name:名称中不包含命名空间分隔符的标识符,例如 Foo限定名称Qualified name:名称中含有命名空间分隔符的标识符,例如 Foo\Bar完全限定名称Fully qualified name:称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。

名称解析遵循下列规则:

对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B。

所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。

在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间A\B\C 导入为C,则 new C()被转换为 new A\B\C() 。
在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数foo() 的调用是这样解析的:

在当前命名空间中查找名为 A\B\foo() 的函数
尝试查找并调用 全局(global) 空间中的函数 foo()。

在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用new C() 及 new D\E() 的解析过程:

new C()的解析:

在当前命名空间中查找A\B\C类。
尝试自动装载类A\B\C。

new D\E()*的解析:

在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
尝试自动装载类 A\B\D\E。

为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。<?php
namespace A;
use B\D, C\E as F;

// 函数调用
foo(); // 首先尝试调用定义在命名空间"A"中的函数foo()
// 再尝试调用全局函数 "foo"

\foo(); // 调用全局空间函数 "foo"

my\foo(); // 调用定义在命名空间"A\my"中函数 "foo"

F(); // 首先尝试调用定义在命名空间"A"中的函数 "F"
// 再尝试调用全局函数 "F"

// 类引用
new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象
// 如果未找到,则尝试自动装载类 "A\B"

new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
// 如果未找到,则尝试自动装载类 "B\D"

new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
// 如果未找到,则尝试自动装载类 "C\E"

new \B(); // 创建定义在全局空间中的类 "B" 的一个对象
// 如果未发现,则尝试自动装载类 "B"

new \D(); // 创建定义在全局空间中的类 "D" 的一个对象
// 如果未发现,则尝试自动装载类 "D"

new \F(); // 创建定义在全局空间中的类 "F" 的一个对象
// 如果未发现,则尝试自动装载类 "F"

// 调用另一个命名空间中的静态方法或命名空间函数

B\foo(); // 调用命名空间 "A\B" 中函数 "foo"

B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
// 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"

D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
// 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"

\B\foo(); // 调用命名空间 "B" 中的函数 "foo"

\B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法
// 如果类 "B" 未找到,则尝试自动装载类 "B"

// 当前命名空间中的静态方法或函数

A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"

\A\B::foo(); // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>
文/洞房花猪(简书作者)
原文链接:http://www.jianshu.com/p/9e01d16a2e1c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  查看全部
命名空间概述
 
(PHP 5 >= 5.3.0, PHP 7)
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到/home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
 
如何声明?
 
(PHP 5 >= 5.3.0, PHP 7)
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
test1.php
<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>

test2.php
<html>
<?php
namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句
?>

 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

定义子命名空间

与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
<?php
namespace MyProject\Sub\Level;

const CONNECT_OK = 1; //常量MyProject\Sub\Level\CONNECT_OK
class Connection { /* ... */ } //类 MyProject\Sub\Level\Connection
function connect() { /* ... */ } //函数MyProject\Sub\Level\connect
?>

在同一个文件中定义多个命名空间

也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。
 
<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

namespace AnotherProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>

//不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法

//定义多个命名空间,大括号语法
<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。

将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来。
//定义多个命名空间和不包含在命名空间中的代码
<?php
declare(encoding='UTF-8'); //除了开始的declare语句外,命名空间的括号外不得有任何PHP代码。
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace { // global

codesession_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

 使用命名空间:基础
 
在讨论如何使用命名空间之前,必须了解 PHP是如何知道要使用哪一个命名空间中的元素的。可以将 PHP命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
  1. 相对文件名形式如foo.txt。它会被解析为currentdirectory/foo.txt,其中 currentdirectory表示当前目录。因此如果当前目录是/home/foo,则该文件名被解析为/home/foo/foo.txt。
  2. 相对路径名形式如subdirectory/foo.txt。它会被解析为currentdirectory/subdirectory/foo.txt。
  3. 绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。


PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
  1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或foo::staticmethod();。如果当前命名空间是currentnamespace,foo 将被解析为currentnamespace\foo。如果使用 foo的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
  2. 限定名称,或包含前缀的名称,例如$a = new subnamespace\foo(); 或subnamespace\foo::staticmethod();。如果当前的命名空间是currentnamespace,则 foo 会被解析为currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo会被解析为subnamespace\foo。
  3. 完全限定名称,或包含了全局前缀操作符的名称,例如,$a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

file1.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {}
class foo{
static function staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo{
static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
// 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO

/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如\strlen() 或\Exception 或\INI_ALL。
 
<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // 调用全局函数
strlen $b = \INI_ALL; // 访问全局常量
INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception
?>


namespace关键字和__NAMESPACE__常量
 
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
 
//__NAMESPACE__ 示例, 在命名空间中的代码
<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

//__NAMESPACE__ 示例,全局代码
<?php

echo '"', __NAMESPACE__, '"'; // 输出 " "
?>

//使用__NAMESPACE__动态创建名称
<?php
namespace MyProject;
function get($classname){
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>

//namespace操作符,命名空间中的代码
<?php
namespace MyProject;

use blah\blah as mine; // see "Using namespaces: importing/aliasing"
blah\mine(); // calls function MyProject\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b

?>

//namespace操作符, 全局代码
<?php
namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname

$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>

 使用命名空间:别名/导入
 
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类
unix 文件系统中可以创建对其它的文件或目录的符号连接。

所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。

在PHP中,别名是通过操作符 use 来实现的.
 
//使用use操作符导入/使用别名
<?php
namespace foo;

use My\Full\Classname as Another;
// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>
注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。

为了简化操作,PHP还支持在一行中使用多个use语句。
 
//通过use操作符导入/使用别名,一行中包含多个use语句
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>

//导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a; // 实际化一个 Another 对象
?>

//另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>

 全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 '\'表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
<?php
namespace A\B\C;

/* 这个函数是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局的fopen函数
return $f;
}
?>

名称解析规则​
 
命名空间名称定义
  • 非限定名称Unqualified name:名称中不包含命名空间分隔符的标识符,例如 Foo
  • 限定名称Qualified name:名称中含有命名空间分隔符的标识符,例如 Foo\Bar
  • 完全限定名称Fully qualified name:称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。


名称解析遵循下列规则:

对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B。

所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。

在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间A\B\C 导入为C,则 new C()被转换为 new A\B\C() 。
在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数foo() 的调用是这样解析的:

在当前命名空间中查找名为 A\B\foo() 的函数
尝试查找并调用 全局(global) 空间中的函数 foo()。

在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用new C() 及 new D\E() 的解析过程:

new C()的解析:

在当前命名空间中查找A\B\C类。
尝试自动装载类A\B\C。

new D\E()*的解析:

在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
尝试自动装载类 A\B\D\E。

为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。
<?php
namespace A;
use B\D, C\E as F;

// 函数调用
foo(); // 首先尝试调用定义在命名空间"A"中的函数foo()
// 再尝试调用全局函数 "foo"

\foo(); // 调用全局空间函数 "foo"

my\foo(); // 调用定义在命名空间"A\my"中函数 "foo"

F(); // 首先尝试调用定义在命名空间"A"中的函数 "F"
// 再尝试调用全局函数 "F"

// 类引用
new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象
// 如果未找到,则尝试自动装载类 "A\B"

new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
// 如果未找到,则尝试自动装载类 "B\D"

new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
// 如果未找到,则尝试自动装载类 "C\E"

new \B(); // 创建定义在全局空间中的类 "B" 的一个对象
// 如果未发现,则尝试自动装载类 "B"

new \D(); // 创建定义在全局空间中的类 "D" 的一个对象
// 如果未发现,则尝试自动装载类 "D"

new \F(); // 创建定义在全局空间中的类 "F" 的一个对象
// 如果未发现,则尝试自动装载类 "F"

// 调用另一个命名空间中的静态方法或命名空间函数

B\foo(); // 调用命名空间 "A\B" 中函数 "foo"

B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
// 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"

D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
// 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"

\B\foo(); // 调用命名空间 "B" 中的函数 "foo"

\B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法
// 如果类 "B" 未找到,则尝试自动装载类 "B"

// 当前命名空间中的静态方法或函数

A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"

\A\B::foo(); // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>

文/洞房花猪(简书作者)
原文链接:http://www.jianshu.com/p/9e01d16a2e1c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
 

Yii2.0中的Url::to(), Url::toRoute(), Url::current()用法总结

Yii框架zkbhj 发表了文章 • 0 个评论 • 2490 次浏览 • 2016-12-17 14:33 • 来自相关话题

[Url::current] 获取当前路径 
现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) 

a: //获取当前路径 - 相对路径
$url = Url::current();
举例:/mobile/hmConnections/user/verify-user
b: //获取当前路径 - 相对路径
$url = Url::current(['id' => 1], false);
例如: /mobile/hmConnections/user/verify-user?id=1
c: //获取当前路径 - 绝对路径
$url = Url::current(['id' => 1], true);
例如: http://daxia.dc.weixin.com/mob ... d%3D1
d: //获取当前路径 - 绝对路径 传输协议-http
$url = Url::current(['id' => 1], 'http');
例如: http://daxia.dc.weixin.com/mob ... d%3D1
e: //获取当前路径 - 绝对路径 传输协议-https
$url = Url::current(['id' => 1], 'https');
例如: https://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user?id=1 
 

[Url::toRoute] 获取某一地址 
现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) 

1://获取某地址 - 相对路径
$url = Url::toRoute('site/index');
例如: /mobile/hmConnections/site/index
2://获取某地址 - 相对路径
$url = Url::toRoute('site/index', false);
例如: /mobile/hmConnections/site/index
说明: 等价于1 因为默认是false
3://获取某地址 - 相对路径
$url = Url::toRoute(['site/index', 'id' => 1]);
例如: /mobile/hmConnections/site/index?id=1
4://获取某地址的 - 绝对路径
$url = Url::toRoute('site/index', true);
例如: http://daxia.dc.weixin.com/mob ... index
5://获取某地址的 - 绝对路径
$url = Url::toRoute('site/index', ['id' => 1]);
例如: http://daxia.dc.weixin.com/mob ... index
说明: 参数没有输出,说明,这种写法['id' => 1], 他当成了true,所以等价于4
6://获取某地址的 - 绝对路径 (传输协议-http)
$url = Url::toRoute('site/index', 'http');
例如: https://daxia.dc.weixin.com/mo ... index
说明: 等价于4
7://获取某地址的 - 绝对路径 (传输协议-https)
$url = Url::toRoute('site/index', 'https');
例如: https://daxia.dc.weixin.com/mobile/hmConnections/site/index 

[Url::to] 创建一个基于给定参数的网址
现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) 

1): //获某网址 - 相对路径
$url = Url::to(['site/index']);
举例:/mobile/hmConnections/site/index
说明:等价于2
2): //获取网址(带参数) - 相对路径
$url = Url::to(['site/index', 'id' => 1]);
举例:/mobile/hmConnections/site/index?id=1
说明:等价于3
3): 获取当前路径 - 相对路径
$url = Url::to();
举例:/mobile/hmConnections/user/verify-user
等价于a
4): 获取url - 相对路径
$url = Url::to('@web/image/1.jpg');
举例: /image/a.jpg
说明:它将指定到你的某一个别名目录下@web
5): 获取url - 相对路径
$url = Url::to('image/1.jpg');
举例:image/a.jpg
6): 获取url - 绝对路径(@mobileUrl 自己配置好的)
$url = Url::to('@mobileUrl/image/1.jpg', true);
举例:http://daxia.dc.weixin.com/sta ... 1.jpg
7): //获取url - 绝对路径 (传输协议-https)
$url = Url::to('@mobileUrl/image/1.jpg', 'https');
举例:https://daxia.dc.weixin.com/st ... 1.jpg
8): //获取url - 绝对路径 (传输协议-http)
$url = Url::to('@mobileUrl/image/1.jpg', 'http');
举例:http://daxia.dc.weixin.com/sta ... 1.jpg
说明:等价于 6)

** 特别说明下:@mobileUrl
$url = Url::to('@mobileUrl/city-partner/city-partner/images/1.png');
- @mobileUrl,配置如下: Yii::setAlias('@mobileUrl', Yii::getAlias('@web/static/mobile/'));
* 给Yii::getAlias('@web/static/mobile/')定义一个别名@mobileUrl(
也就是,下次我们直接用@mobileUrl来表示Yii::getAlias('@web/static/mobile/')的意思)
* @web指的是当前项目目录下的web下, 这是框架默认的
* 而当前目录也需要配置,一般是在common/config/bootstrap.php进行配置
配置如下:Yii::setAlias('service', dirname(dirname(__DIR__)) . '/platform_service');
  查看全部
[Url::current] 获取当前路径 
现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) 

a: //获取当前路径 - 相对路径
$url = Url::current();
举例:/mobile/hmConnections/user/verify-user
b: //获取当前路径 - 相对路径
$url = Url::current(['id' => 1], false);
例如: /mobile/hmConnections/user/verify-user?id=1
c: //获取当前路径 - 绝对路径
$url = Url::current(['id' => 1], true);
例如: http://daxia.dc.weixin.com/mob ... d%3D1
d: //获取当前路径 - 绝对路径 传输协议-http
$url = Url::current(['id' => 1], 'http');
例如: http://daxia.dc.weixin.com/mob ... d%3D1
e: //获取当前路径 - 绝对路径 传输协议-https
$url = Url::current(['id' => 1], 'https');
例如: https://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user?id=1 
 

[Url::toRoute] 获取某一地址 
现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) 

1://获取某地址 - 相对路径
$url = Url::toRoute('site/index');
例如: /mobile/hmConnections/site/index
2://获取某地址 - 相对路径
$url = Url::toRoute('site/index', false);
例如: /mobile/hmConnections/site/index
说明: 等价于1 因为默认是false
3://获取某地址 - 相对路径
$url = Url::toRoute(['site/index', 'id' => 1]);
例如: /mobile/hmConnections/site/index?id=1
4://获取某地址的 - 绝对路径
$url = Url::toRoute('site/index', true);
例如: http://daxia.dc.weixin.com/mob ... index
5://获取某地址的 - 绝对路径
$url = Url::toRoute('site/index', ['id' => 1]);
例如: http://daxia.dc.weixin.com/mob ... index
说明: 参数没有输出,说明,这种写法['id' => 1], 他当成了true,所以等价于4
6://获取某地址的 - 绝对路径 (传输协议-http)
$url = Url::toRoute('site/index', 'http');
例如: https://daxia.dc.weixin.com/mo ... index
说明: 等价于4
7://获取某地址的 - 绝对路径 (传输协议-https)
$url = Url::toRoute('site/index', 'https');
例如: https://daxia.dc.weixin.com/mobile/hmConnections/site/index 

[Url::to] 创建一个基于给定参数的网址
现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) 

1): //获某网址 - 相对路径
$url = Url::to(['site/index']);
举例:/mobile/hmConnections/site/index
说明:等价于2
2): //获取网址(带参数) - 相对路径
$url = Url::to(['site/index', 'id' => 1]);
举例:/mobile/hmConnections/site/index?id=1
说明:等价于3
3): 获取当前路径 - 相对路径
$url = Url::to();
举例:/mobile/hmConnections/user/verify-user
等价于a
4): 获取url - 相对路径
$url = Url::to('@web/image/1.jpg');
举例: /image/a.jpg
说明:它将指定到你的某一个别名目录下@web
5): 获取url - 相对路径
$url = Url::to('image/1.jpg');
举例:image/a.jpg
6): 获取url - 绝对路径(@mobileUrl 自己配置好的)
$url = Url::to('@mobileUrl/image/1.jpg', true);
举例:http://daxia.dc.weixin.com/sta ... 1.jpg
7): //获取url - 绝对路径 (传输协议-https)
$url = Url::to('@mobileUrl/image/1.jpg', 'https');
举例:https://daxia.dc.weixin.com/st ... 1.jpg
8): //获取url - 绝对路径 (传输协议-http)
$url = Url::to('@mobileUrl/image/1.jpg', 'http');
举例:http://daxia.dc.weixin.com/sta ... 1.jpg
说明:等价于 6)

** 特别说明下:@mobileUrl
$url = Url::to('@mobileUrl/city-partner/city-partner/images/1.png');
- @mobileUrl,配置如下: Yii::setAlias('@mobileUrl', Yii::getAlias('@web/static/mobile/'));
* 给Yii::getAlias('@web/static/mobile/')定义一个别名@mobileUrl(
也就是,下次我们直接用@mobileUrl来表示Yii::getAlias('@web/static/mobile/')的意思)
* @web指的是当前项目目录下的web下, 这是框架默认的
* 而当前目录也需要配置,一般是在common/config/bootstrap.php进行配置
配置如下:Yii::setAlias('service', dirname(dirname(__DIR__)) . '/platform_service');
 

Yii rules常用规则介绍

Yii框架zkbhj 发表了文章 • 0 个评论 • 2041 次浏览 • 2016-08-09 19:22 • 来自相关话题

public function rules()
{
return array(
//必须填写
array('email, username, password,agree,verifyPassword,verifyCode', 'required'),
//检查用户名是否重复
array('email','unique','message'=>'用户名已占用'),
//用户输入最大的字符限制
array('email, username', 'length', 'max'=>64),
//限制用户最小长度和最大长度
array('username', 'length', 'max'=>7, 'min'=>2, 'tooLong'=>'用户名请输入长度为4-14个字符', 'tooShort'=>'用户名请输入长度为2-7个字'),
//限制密码最小长度和最大长度
array('password', 'length', 'max'=>22, 'min'=>6, 'tooLong'=>'密码请输入长度为6-22位字符', 'tooShort'=>'密码请输入长度为6-22位字符'),
//判断用户输入的是否是邮件
array('email','email','message'=>'邮箱格式错误'),
//检查用户输入的密码是否是一样的
array('verifyPassword', 'compare', 'compareAttribute'=>'password', 'message'=>'请再输入确认密码'),
//检查用户是否同意协议条款
array('agree', 'required', 'requiredValue'=>true,'message'=>'请确认是否同意隐私权协议条款'),
//判断是否是日期格式
array('created', 'date', 'format'=>'yyyy/MM/dd/ HH:mm:ss'),
//判断是否包含输入的字符
array('superuser', 'in', 'range' => array(0, 1)),
//正则验证器:
array('name','match','pattern'=>'/^[a-z0-9\-_]+$/'),
//数字验证器:
array('id', 'numerical', 'min'=>1, 'max'=>10, 'integerOnly'=>true),
//类型验证 integer,float,string,array,date,time,datetime
array('created', 'type', 'datetime'),
//文件验证:
array('filename', 'file', 'allowEmpty'=>true, 'types'=>'zip, rar, xls, pdf, ppt','tooLarge'=>'图片不要超过800K'),
array('url',
'file', //定义为file类型
'allowEmpty'=>true,
'types'=>'jpg,png,gif,doc,docx,pdf,xls,xlsx,zip,rar,ppt,pptx', //上传文件的类型
'maxSize'=>1024*1024*10, //上传大小限制,注意不是php.ini中的上传文件大小
'tooLarge'=>'文件大于10M,上传失败!请上传小于10M的文件!'
),
} );

$news= new news('search'); //search关联规则 查看全部
public function rules()
{
return array(
//必须填写
array('email, username, password,agree,verifyPassword,verifyCode', 'required'),
//检查用户名是否重复
array('email','unique','message'=>'用户名已占用'),
//用户输入最大的字符限制
array('email, username', 'length', 'max'=>64),
//限制用户最小长度和最大长度
array('username', 'length', 'max'=>7, 'min'=>2, 'tooLong'=>'用户名请输入长度为4-14个字符', 'tooShort'=>'用户名请输入长度为2-7个字'),
//限制密码最小长度和最大长度
array('password', 'length', 'max'=>22, 'min'=>6, 'tooLong'=>'密码请输入长度为6-22位字符', 'tooShort'=>'密码请输入长度为6-22位字符'),
//判断用户输入的是否是邮件
array('email','email','message'=>'邮箱格式错误'),
//检查用户输入的密码是否是一样的
array('verifyPassword', 'compare', 'compareAttribute'=>'password', 'message'=>'请再输入确认密码'),
//检查用户是否同意协议条款
array('agree', 'required', 'requiredValue'=>true,'message'=>'请确认是否同意隐私权协议条款'),
//判断是否是日期格式
array('created', 'date', 'format'=>'yyyy/MM/dd/ HH:mm:ss'),
//判断是否包含输入的字符
array('superuser', 'in', 'range' => array(0, 1)),
//正则验证器:
array('name','match','pattern'=>'/^[a-z0-9\-_]+$/'),
//数字验证器:
array('id', 'numerical', 'min'=>1, 'max'=>10, 'integerOnly'=>true),
//类型验证 integer,float,string,array,date,time,datetime
array('created', 'type', 'datetime'),
//文件验证:
array('filename', 'file', 'allowEmpty'=>true, 'types'=>'zip, rar, xls, pdf, ppt','tooLarge'=>'图片不要超过800K'),
array('url',
'file', //定义为file类型
'allowEmpty'=>true,
'types'=>'jpg,png,gif,doc,docx,pdf,xls,xlsx,zip,rar,ppt,pptx', //上传文件的类型
'maxSize'=>1024*1024*10, //上传大小限制,注意不是php.ini中的上传文件大小
'tooLarge'=>'文件大于10M,上传失败!请上传小于10M的文件!'
),
} );

$news= new news('search'); //search关联规则
    Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。Yii是最有效率的PHP框架之一。