|-原 Yii2的Cookie操作在代码测试中遇到的问题(Cookie常见问题以及注意事项)
\Yii::$app->response->cookies->remove($cookieName);为何删除不了cookie,这里把我遇到的一种情况说明下,我遇到的问题已被我发现并解决。另外还可以直接用php自带的函数操作cookie,setcookie($cookieName, "" , time()-1);//删除cookie
|||20220415 已发在知乎 https://zhuanlan.zhihu.com/p/499165410
为了方便理解Yii2的cookie这里写了个测试代码
<?php namespace frontend\controllers; /** * Test2 Controller */ class Test2Controller extends \yii\web\Controller { public function actionIndex(){ $cookies = \Yii::$app->request->cookies;//获取cookie $cookieName='cookieTest'; if ($cookies->has($cookieName)) { //移除名为cookieTest的cookie \Yii::$app->response->cookies->remove($cookieName); echo $cookieName.' deleted'; }else{ //没有名为cookieTest的cookie,创建该cookie \Yii::$app->response->cookies->add(new \yii\web\Cookie([ 'name' => $cookieName, 'value' => 'aa', 'expire' => time() + 3600,//3600秒后cookie过期 ])); echo $cookieName.' added'; }//if else结束 } }
反复执行该代码会来回输出:cookieTest added 和cookieTest deleted ...
|-原 Yii2多表联结子查询的应用
20220415 已发在知乎 https://zhuanlan.zhihu.com/p/499373154
//查询mark表里用户收藏的帖子id
$query = Post::find()->with(['mark', function($query) {$query-> where('{{%mark}}.user_id='.$user_id)->andwhere('{{%mark}}.action=2')->andwhere('{{%mark}}.type=2')->andwhere('{{%mark}}.status=1')->asArray();}]);
//按上面的语句报错,对SQL语句的with不清楚,就在Yii里试着用,坑了自己 ,Yii报错...
|-转 Yii2 获取模块名、控制器名、方法名
Yii2 获取模块名、控制器名、方法名
在视图中:
模块名 $this->context->module->id
控制器名 $this->context->id
方法名 $this->context->action->id
在控制器或模型中
模块名 Yii::$app->controller->module->id;
控制器名 Yii::$app->controller->id
方法名 Yii::$app->controller->action->id;
或控制器中
模块名 $this->module->id;...
|-原 php yii2 出现mysql-gone-away-2006解决
20220415 已发在知乎 https://zhuanlan.zhihu.com/p/499379606
mysql gone away 简单的说就是连接不见了,那为啥不见了?
这个我会在最后说。
以下是网上的文章,觉得有些旁敲侧击了。
http://blog.csdn.net/u012260707/article/details/78223008
问题描述:
Error Info: Array ( [0] => HY000 [1] => 2006 [2] => MySQL server has gone away )
"用php跑数据 任务时间过长,每次都会出现这个,能帮忙把这个超时时间设置到最大吗,下周我们仔细看看这个是啥问题,之前用JDBC跑数 不会出现这个问题,应该是php,yii2一直拿connection没有释放"
JDBC中!=null 就close 这种事我觉得应该是框架做的
上述可知用JDBC无此问题,用yii2频繁出现,定位是yii2的问题,gone-away意思是连接不见了,断掉了,那么有没有colse和open的方法呢,断掉了我们手动去open一下
查了一下open和close的写法为
Yii::$app->db->open(); Yii::$app->db->close();
思路是在
try{ //code }catch(Exception $e){ //去判断 $e是不是2006,然后去open一下,然后再colse一下 }
每个方法都去写一个这样的try{}catch{}不是很科学,通常的做法是在顶级父类的afterAction或入口去拦截这样的错误 最终选取的做法,重载yii\db\Command的execute和queryInternal方法 阅读yii\db\Command源码可知 execute()--->所有的增删改操作的入口 queryInternal()---->所以的查询操作的入口 最终书写一个Command去继承yii\db\Command,然后在数据库db配置中把默认的command Class 改成我们自己写的子类commandscm
修改示例 ...
|-转 学习yii2.0 数据缓存、片段缓存、页面缓存、http缓存(Yii2数据缓存之增删改查)
详情去原文网址那里看下 20220413
缓存 API(真正的重点,理解方法的含义是关键20200403)
所有缓存组件都有同样的基类yii\caching\Cache,因此都支持如下 API:
-
- get():通过一个指定的键(key)从缓存中取回一项数据。 如果该项数据不存在于缓存中或者已经过期/失效,则返回值 false。
- set():将一个由键指定的数据项存放到缓存中。
- add():如果缓存中未找到该键,则将指定数据存放到缓存中。
- getOrSet():返回由键指定的缓存项,或者执行回调函数,把函数的返回值用键来关联存储到缓存中, 最后返回这个函数的返回值。
- multiGet():由指定的键获取多个缓存数据项。
- multiSet():一次存储多个数据项到缓存中,每个数据都由一个键来指明。
- multiAdd():一次存储多个数据项到缓存中,每个数据都由一个键来指明。 如果某个键已经存在,则略过该数据项不缓存。
- exists():返回一个值,指明某个键是否存在于缓存中。
- delete():通过一个键,删除缓存中对应的值。
- flush():删除缓存中的所有数据。
配置缓存
yii框架的配置文件config/web.php中,在$config数组中的component中,有一项就是cache。yii框架默认提供的是文件缓存,如下: ...
|-转 Yii2片段缓存详解
http://blog.csdn.net/u010010725/article/details/52...概述这里只是简单讲一下用法,如果想更详细的了解,去看 官方手册 比较好。片段缓存指的是缓存页面内容中的某个片段。...
概述
这里只是简单讲一下用法,如果想更详细的了解,去看 官方手册 比较好。
片段缓存指的是缓存页面内容中的某个片段。例如,一个页面显示了逐年销售额的摘要表格, 可以把表格缓存下来,以消除每次请求都要重新生成表格 的耗时。片段缓存是基于数据缓存实现的。
基本用法
片段缓存主要在view
中使用
// ..../view/site/index.php页面
<?php
if($this->beginCache('cache')) {
echo "<p class='cache'>这里待会会被缓存</p>";
$this->endCache();
}
echo "<p class='no_cache'>这里不会被缓存</p>";
?>
和数据缓存一样,每个片段缓存都需要一个唯一的名称。
过期时间
// ..../view/site/index.php页面
<?php
$duration = 15; // 设置过期秒数
if($this->beginCache('cache' , ['duration' => $duration])) {
echo "<p class='cache'>这里待会会被缓存</p>";
$this->endCache();
}
echo "<p class='no_cache'>这里不会被缓存</p>";
?>
依赖关系
和数据缓存一样,片段缓存的内容一样可以设置缓存依赖。例如 一段被缓存的文章,是否重新缓存取决于它是否被修改过。不过具体写法上略有不用。
// ..../view/site/index.php页面
<?php
$dependency = [ // 这里用文件依赖举例
'class' => '\yii\caching\FileDependency',
'fileName' => 'robots.txt'
];
if($this->beginCache('cache' , ['dependency' => $dependency])) {
echo "<p class='cache'>这里待会会被缓存</p>";
$this->endCache();
}
echo "<p class='no_cache'>这里不会被缓存</p>";
?>
当对应依赖文件被修改时,缓存也被取消。 ...
|-转 yii2常用表单处理方法
创建一个表单须加载 ‘yii\widgets\ActiveForm’ 和 ‘yii\helpers\Html’
ActiveForm::begin() - creates a form instance and beginning of the form. ActiveForm::begin() and ActiveForm::end() - All of the content placed between this.
使用别名空间 namespace 用 ActiveForm
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; ?>
“的ActiveForm'命名空间是非常重要的创造一个积极的形式和”HTML“命名空间是显示不同的HTML输入字段非常有用。
Active Form Begin And End
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; //$form = ActiveForm::begin(); //Default Active Form begin $form = ActiveForm::begin([ 'id' => 'active-form', 'options' => [ 'class' => 'form-horizontal', 'enctype' => 'multipart/form-data' ], ]) /* ADD FORM FIELDS */ ActiveForm::end(); ?>
表单上传的方法
使用输入文本框
//Format 1 <?= $form->field($model,'name'); ?> //Format 2 <?= $form->field($model, 'name')->textInput()->hint('Please enter your name')->label('Name') ?>
TextArea 文本域
<?= $form->field($model, 'desc')->textarea(); ?> <?= $form->field($model, 'desc')->textarea()->label('Description'); ?> <?= $form->field($model, 'desc')->textarea(array('rows'=>2,'cols'=>5)); ?>
Password Input Field
//Format 1 <?= $form->field($model, 'password')->input('password') ?> //Format 2 <?= $form->field($model, 'password')->passwordInput() ?> //Format 3 <?= $form->field($model, 'password')->passwordInput()->hint('Password should be within A-Za-z0-9')->label('Password Hint') ?>
We added different type of password input field like password with hint, custom lable....
|-转 Yii2 数据操作DAO
执行 SQL 语句
$db = \Yii::$app->db;
$rows = $db->createCommand('SELECT * FROM zs_dynasty')
->queryAll();
$rowCount=$command->execute(); // 执行无查询 SQL
$dataReader=$command->query(); // 执行一个 SQL 查询
$rows=$command->queryAll(); // 查询并返回结果中的所有行
$row=$command->queryRow(); // 查询并返回结果中的第一行
$column=$command->queryColumn(); // 查询并返回结果中的第一列
$value=$command->queryScalar(); // 查询并返回结果中第一行的第一个字段
获取查询结果
$db = \Yii::$app->db;
$query = $db->createCommand('SELECT * FROM zs_dynasty')
->query();
while(($row=$query->read())!==false) {
print_r($row);
}
// 使用 foreach 遍历数据中的每一行
$query = $db->createCommand('SELECT * FROM zs_dynasty')
->query();
foreach($query as $row) {
print_r($row);
}
// 一次性提取所有行到一个数组
$query = $db->createCommand('SELECT * FROM zs_dynasty')
->query();
$rows=$query->readAll();
print_r($rows);
使用事务
$db = \Yii::$app->db;
$transaction=$db->beginTransaction();
try
{
$query = $db->createCommand('SELECT * FROM zs_dynasty')
->query();
$transaction->commit();
}
catch(Exception $e) // 如果有一条查询失败,则会抛出异常
{
$transaction->rollBack();
}
$rows=$query->readAll();
print_r($rows);
绑定参数
// 一条带有两个占位符 ":username" 和 ":email"的 SQL
$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
$db = \Yii::$app->db;
$command=$db->createCommand($sql);
// 用实际的用户名替换占位符 ":username"
$command->bindParam(":username",$username,PDO::PARAM_STR);
// 用实际的 Email 替换占位符 ":email"
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// 使用新的参数集插入另一行
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();
绑定列
$sql="SELECT username, email FROM tbl_user";
$dataReader=$db->createCommand($sql)->query();
// 使用 $username 变量绑定第一列 (username)
$dataReader->bindColumn(1,$username);
// 使用 $email 变量绑定第二列 (email)
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
// $username 和 $email 含有当前行中的 username 和 email
}
使用表前缀
配置:Connection::tablePrefix
在 SQL 语句中使用 {{%TableName}}
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();
...
|-原 【翻译】 MySQL中yii2使用原生sql CURD
更多yii2使用技巧请参考:http://nai8.me/tool-sc.html批量插入数据:[php] view plain copyYii::$app->db->createCommand()->batchInsert('user', ['email', 'pass...
更多yii2使用技巧请参考:http://nai8.me/tool-sc.html
批量插入数据:
[php] view plain copy
- Yii::$app->db->createCommand()->batchInsert('user', ['email', 'password', 'first_name'],
- [
- ['james.franklin@example.com', 'changeme7', 'James'],
- ['linda.marks@example.com', 'changeme7', 'Linda']
- ['roger.martin@example.com', 'changeme7']
- ])->execute();
更新数据:
[php] view plain copy...
|-转 一篇为你讲透Yii2的widget
yii开发中,用到了大量的widget,我们也能自己建立一个widget,今天为你讲解widget的运行机理,让你游刃有余的操作它。
ActiveForm、Breadcrumbs、DetailView、LinkPager、ListView 等等,这些内置的挂件让我们开发变的如此简单。
yii开发中,用到了大量的widget,我们也能自己建立一个widget,今天为你讲解widget的运行机理,让你游刃有余的操作它。
ActiveForm、Breadcrumbs、DetailView、LinkPager、ListView 等等,这些内置的挂件让我们开发变的如此简单。
本节教你自定义一个widget,顺便说下widget的运行机理和几大重要函数。
老规矩,先说目录。
- 什么时候用widget
- 新建一个widget
- begin & end 方法
- beforeRun & afterRun 方法
begin...
什么时候用widget
场景还是蛮简单的、当我们发现页面有的区块重复出现了,比如TOP10、比如内容编辑器等、就要考虑是否要做成一个widget了。
新建一个widget
我们还是举例把,新建一个Top10的区块。首先我们要在应用程序的components下新建一个Top10Widget的类,根据psr-4规则,布局应该是这样的
- components
- components\Top10Widget.php
Top10Widget.php的内容
namespace app\components; use yii\base\Widget; class Top10Widget extends Widget { public $catId; public function init(){ parent::init(); if(empty($this->catId)){ $this->catId = 0; } } public function run(){ parent::run(); } }
作为一个widget,你必须要继承于yii\base\Widget才可以,就像我们的Top10Widget一样。类的变量代表将来视图使用该挂件时对其传递的参数,除此之外我们要重载Widget的init和run两个方法。
要注意的一点是,在方法里需要先调用父类的对应方法,如上面代码一样,这个要记住。
init() 方法旨在对传递过来的变量进行验证、筛选及处理,所以对于init而言,如果参数出现异常代表前台并没有传递参数正确,这个时候你可以使用throw new Exception("xxx");来抛出异常,页面会报错,当然为了美观,我们可以使用try ... catch....将这个异常接住然后更友好的显示。
小提示:对于throw异常的方法,在run中也一样,我建议try .... catch ....它们。
好的,上面说了init的初衷,接下来说下run函数(有些挂件并没有使用init,而是将所有数据都放到run里处理也是可以的,不过我一般不这么干)。
run() 方法代表该关键的执行逻辑,针对于init处理过的变量,进行逻辑处理,最后显示给客户想要的东西。就和action一样,这里面可以执行很多很多。
最后我们可以通过return 或 echo 将结果返回给浏览器
namespace app\components; use yii\base\Widget; class Top10Widget extends Widget { public $catId; // 省略的代码.... public function run(){ parent::run(); return $this->catId; // 不完全等价于 echo $this>-catId } }
那么一个问题出现了,如果我仅仅是想像是一些数字结果,而是希望它的样子更丰富,我要如何做那?
我想你也想到了,我们可以对这个挂件加载一个视图,然后在视图里处理。
namespace app\components; use yii\base\Widget; class Top10Widget extends Widget { public $catId; // 省略的代码.... public function run(){ parent::run(); return $this->render('top10',[ 'catId'=>$this->catId ]); } }
top10.php文件在哪建立?按照约定,我们需要在app\components\views下建立这个视图。
use app\components\Top10Widget; <?= Top10Widget::widget(['catId'=>98]);?>
看到了吧,和控制的视图一样,先use,在使用。 ...
|-摘 Yii2模块学习
讲到模块的控制台命令时,听不明白。 "想要在命令行中查看你的命令 ” 是什么意思?模块中的控制台命令您的模块也可以声明命令,这将通过 控制台 模式可用。当 Yii 在控制台模式下执行并将其指向命令的命名空间时。想要在...
讲到模块的控制台命令时,听不明白。 "想要在命令行中查看你的命令 ” 是什么意思?
模块中的控制台命令
您的模块也可以声明命令,这将通过 控制台 模式可用。
当 Yii 在控制台模式下执行并将其指向命令的命名空间时。想要在命令行中查看你的命令, 你需要更改 yii\base\Module::$controllerNamespace 属性。
一种实现方法是在模块的 init()
方法中测试Yii应用程序的实例类型:
public function init()
{
parent::init();
if (Yii::$app instanceof \yii\console\Application) {
$this->controllerNamespace = 'app\modules\forum\commands';
}
}
然后您的命令将从命令行使用以下路由:
yii <module_id>/<command>/<sub_command>
模块
http://www.yiichina.com/doc/guide/2.0/structure-modules#using-modules
模块是独立的软件单元,由模型, 视图, 控制器和其他支持组件组成, 终端用户可以访问在应用主体中已安装的模块的控制器, 模块被当成小应用主体来看待,和应用主体不同的是, 模块不能单独部署,必须属于某个应用主体。
创建模块
模块被组织成一个称为yii\base\Module::basePath的目录, 在该目录中有子目录如controllers
, models
, views
分别为对应控制器,模型,视图和其他代码,和应用非常类似。 如下例子显示一个模型的目录结构:
forum/
Module.php 模块类文件
controllers/ 包含控制器类文件
DefaultController.php default 控制器类文件
models/ 包含模型类文件
views/ 包含控制器视图文件和布局文件
layouts/ 包含布局文件
default/ 包含DefaultController控制器视图文件
index.php index视图文件
模块类
每个模块都有一个继承yii\base\Module的模块类, 该类文件直接放在模块的yii\base\Module::basePath目录下, 并且能被 自动加载。当一个模块被访问, 和 应用主体实例 类似会创建该模块类唯一实例,模块实例用来帮模块内代码共享数据和组件。
以下示例一个模块类大致定义:
namespace app\modules\forum;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
$this->params['foo'] = 'bar';
// ... 其他初始化代码 ...
}
}
如果 init()
方法包含很多初始化模块属性代码, 可将他们保存在配置 并在init()
中使用以下代码加载:...
|-转 Yii2提交表单提示无法验证
yii2使用gii生成的搜索视图里的表单使用的是get方式,我改为post就提示无法验证,以为是控制器默认访问是get,实际默认是get和post都可以1234567891011public functi...
yii2使用gii生成的搜索视图里的表单使用的是get方式,我改为post就提示无法验证,以为是控制器默认访问是get,实际默认是get和post都可以
1 2 3 4 5 6 7 8 9 10 11 | public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => [ 'post' ], ], ], ]; } |
之所以提示无法验证是因为对于post请求,是有一个CSRF验证的
解决POST数据时因启用Csrf出现的400错误
第一种解决办法是关闭Csrf
1 2 3 4 5 6 7 8 9 10 11 12 13 | public function init() { $ this ->enableCsrfValidation = false ; } //或者 public function __construct($id, $module, $config = []) { $ this ->menuActive = 2; $ this ->enableCsrfValidation = false ; parent::__construct($id, $module, $config); } //总之把enableCsrfValidation设为false就可以了 |
第二种解决办法是在form表单中加入隐藏域...
|-转 解决Yii2 在线上服务器无法访问GII 和BUG工具栏问题
应用场景把代码转移到线上服务器时,GII、BUG工具不正常使用,但在本地服务器是正常的。分析原因Yii框架在使用GII 和BUG 时,会针对访问IP地址拦截,没有在配置中设置的IP地址...
应用场景
把代码转移到线上服务器时,GII、BUG工具不正常使用,但在本地服务器是正常的。
分析原因
Yii框架在使用GII 和BUG 时,会针对访问IP地址拦截,没有在配置中设置的IP地址是会默认被拦截掉。
解决方案
在common/config/main.php 配置一下参数,访问IP地址,可以百度搜索IP 这样可以看到自己当前的IP地址,这个IP地址是网络运营商自动分配的,与网络运营商断连接后有可能更变。
return[
'modules'=>[
'gii' => [
'class' => 'yii\gii\Module',
// 配置访问IP地址
'allowedIPs' => ['127.0.0.1', '::1', '116.21.160.23']
],
'debug' => [
'class' => 'yii\debug\Module',
// 配置访问IP地址
'allowedIPs' => ['127.0.0.1', '::1', '116.21.163.16']
],
]
]
|-转 Yii2 Model的一些常用验证rules规则
提示:打印出Validator::$builtInValidators可以看到被支持的所有validators去除首尾空白字符['email', 'trim'] 或 ['email', 'filter', 'filter' => 'trim']字段必填['email', 'required']赋予默认值['age', 'default', 'value' => 18]字符串长度['email', 'string', 'min' => 3, 'max' => 20] 或 ['email', 'string', 'length' => [3, 20]]格式类型验证// 整数格式 ['age', 'integer'] // 浮点数格式 ['salary', 'double'] // 数字格式 ['tempera
提示:打印出Validator::$builtInValidators
可以看到被支持的所有validators
去除首尾空白字符
['email', 'trim']
或
['email', 'filter', 'filter' => 'trim']
字段必填
['email', 'required']
赋予默认值
['age', 'default', 'value' => 18]
字符串长度
['email', 'string', 'min' => 3, 'max' => 20]
或
['email', 'string', 'length' => [3, 20]]
格式类型验证
// 整数格式
['age', 'integer']
// 浮点数格式
['salary', 'double']
// 数字格式
['temperature', 'number']
// 布尔格式
['isAdmin', 'boolean']
// email格式
['email', 'email']
// 日期格式
['birthday', 'date']
// URL格式
['website', 'url', 'defaultScheme' => 'http']
验证码
['verificationCode', 'captcha']
值在数据表中是唯一的
['email', 'unique', 'targetClass' => '\common\models\Users']
值在数据表中已存在
['email', 'exist',
'targetClass' => '\common\models\User',
'filter' => ['status' => User::STATUS_ACTIVE],
'message' => 'There is no user with such email.'],
检查输入的两个值是否一致
['passwordRepeat', 'required'] // 必须要加上这一句
['passwordRepeat', 'compare', 'compareAttribute' => 'password', 'operator' => '===']
数值范围检查
['age', 'compare', 'compareValue' => 30, 'operator' => '>=']
['level', 'in', 'range' => [1, 2, 3]]
使用自定义函数过滤
['email', 'filter', 'filter' => function($value) {
// 在此处标准化输入的email
return strtolower($value);
}]
文件上传
['textFile', 'file', 'extensions' => ['txt', 'rtf', 'doc'], 'maxSize' => 1024 * 1024 * 1024]
图片上传
['avatar', 'image', 'extensions' => ['png', 'jpg'],
'minWidth' => 100, 'maxWidth' => 1000,
'minHeight' => 100, 'maxHeight' => 1000,
]
使用正则表达式
['username', 'match', 'pattern' => '/^[a-z]\w*$/i']
更多信息请访问官方中文手册:http://www.yiichina.com/doc/guide/2.0/tutorial-core-validators...
|-原 关于Yii2控制器的layout属性
看了源代码,在yii\base\Controller里定义的,默认是没有赋值的,所以你要是在控制器里的最开始var_dump($this->layout);die;输出的应该是NULL,因为之前取消布局...
看了源代码,在yii\base\Controller里定义的,默认是没有赋值的,所以你要是在控制器里的最开始...
|-转 yii2如何开启debug并在底部显示工具栏(Yii2基础版basic和Yii2高级版advanced)
//增加用来线上显示工具栏 20180203
'modules' => [
'debug' => [
'class' => 'yii\debug\Module',
// 配置访问IP地址 183.30.221.127
'allowedIPs' => ['127.0.0.1', '::1', '183.30.220.106'],
],
],
在配置文件里的模块里这样配置加加入自己的ip,就可以显示debug工具栏
web/index.php代码不用管。
开启debug
1、 在web/index.php文件中添加下面两行代码:
defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev');
2、在Yii2基础版(yii2-app-basic)中
打开yii config目录下的web.php文件,找到如下配置
if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => 'yii\debug\Module', // uncomment the following to add your IP if you are not connecting from localhost. 'allowedIPs' => ['127.0.0.1', '我的IP'], ]; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', // uncomment the following to add your IP if you are not connecting from localhost. 'allowedIPs' => ['127.0.0.1', '我的IP'], ]; }
把自己的IP添加进去即可开启debug。
如果只改web/index.php里的YII_DEBUG的设置,没有在配置文件web.php里把自己的IP添加到allowedIPs里则无法开启debug,如果把'allowedIPs' => ['127.0.0.1', '我的IP'],直接注释掉,则没有IP限制,debug也就开启了。
在Yii2 高级版(yii2-app-advacned)中,找到common/main.php,在modules的debug里配置,把自己的IP添加进去即可。
return [ 'name' => '测试', 'language' => 'zh-CN', 'timeZone' => 'Asia/Shanghai', 'aliases' => [ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', ], 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', 'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], ], 'modules' => [ //增加用来显示工具栏 ,加入访问的ip地址 'debug' => [ 'class' => 'yii\debug\Module', // 配置访问IP地址 'allowedIPs' => ['127.0.0.1', '::1','113.83.***.***'], ], ], ];
这时运行页面如果报错就会显示具体的错误信息。 ...
|-转 使用Yii2发送邮件
现在用的邮件端口是465。网上的办法25端口被禁了,前几年还行的。使用Yii2发送邮件config/web.php中开启邮箱配置'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mail...
网上的办法现在不知道为啥不行了,前几年还行的。
后来知道是25端口被禁了,202003
使用Yii2发送邮件config/web.php中开启邮箱配置'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => false,//true表示只生成文件不发 'transport' => [ 'class' => 'Swift_SmtpTransport', 'host' => 'smtp.qq.com', //每种邮箱的host配置不一样 'username' => 'xxxxx@qq.com',//改成自己的邮箱 'password' => 'xxxxxxxx',//改成自己的邮箱token 'port' => '465', 'encryption' => 'ssl', ], 'messageConfig'=>[ 'charset'=>'UTF-8', 'from'=>['xxxxx@qq.com'=>'YiiAdmin']//邮件显示名称 ],],12345678910111213141516171819SiteController.php控制器文件添加public function actionSendMail(){ $mail= Yii::$app->mailer->compose('reset-password',['token'=>'xxxxxx']); // 渲染一个视图作为邮件模板 文件路径mail/reset-password.php,注意,不在view中 $mail->setTo('xxxxx@hotmail.com');//要发送到的邮箱地址 $mail->setSubject("邮件测试【重置密码】");//邮件标题 if($mail->send()) echo "success"; else echo "failse"; die();}1234567891011视图文件视图文件的输出就是邮件的内容<?php$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $token]);?><div> <h5>密码重置服务</h5> <a href="<?=$resetLink?>">点击重置密码</a></div>1234567访问 127.0.0.1/base/web/index.php?r=site/send-ma...出现 success则发送成功,若未收到确认邮箱已开启pop3服务————————————————版权声明:本文为CSDN博主「maolidi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/maolidi/article/details/1024... ...
|-原 收发邮件(Mailing) | Yii 2.0 权威指南
2020年的内容,不知道还能不能作为参考 20220415。
https://www.yiiframework.com/doc/guide/2.0/zh-cn/tutorial-mailing
https://www.yiiframework.com/doc/guide/2.0/zh-cn/tutorial-mailing
https://github.com/yiisoft/yii2-swiftmailer
建议安装时到项目根目录运行
php composer.phar require --prefer-dist yiisoft/yii2-swiftmailer
这样就不存在版本问题,会自动根据你系统环境安装相应的 20200406
[root@izj6c76p38xsj1pdgufa46z ~]# cd /var/www/html/wokan
[root@izj6c76p38xsj1pdgufa46z wokan]# php composer.phar require --prefer-dist yiisoft/yii2-swiftmailer ...
|-转 Yii2中各种文本框的使用 [ 2.0 版本 ]
|-转 Yii Model中rules验证 获取错误信息
在model中定义 public function rules(){ return array( array('Name,Email','required'), array('Email','unique','message'=>'{value}出错啦'),//{value}为添加的数据 ); } controller中使用 $model = new myModel();//实例化相关表的模型类 $model->attribute$model->getErrors();//获取所有验证字段的错误信息 。在表单提交时可以用来调试代码用 20201003
|-原 Yii2之gii的配置与使用
在common/config/main.php 配置一下参数,访问IP地址,可以百度搜索IP 这样可以看到自己当前的IP地址,这个IP地址是网络运营商自动分配的,与网络运营商断连接后有可能更变。
在main.phppcommon/config/main.php配置文件里,找到modules 模块那里增加对应代码 ...
|-转 yii2面包屑Breadcrumbs的使用
yii2中面包屑Breadcrumbs是yii2自带的小部件,类似本网站的导航栏应该就是采用面包屑来完成的
例子如下,需要引入 yii\widgets\Breadcrumbs
<?php useyii\widgets\Breadcrumbs; echoBreadcrumbs::widget([ 'homeLink'=>['label'=>'首页','url'=>['site/index']], 'itemTemplate'=>"<li>{link}</li>\n",//全局模板运用到每个link 'links'=>[ [ 'label'=>'文章列表', 'url'=>['site/index'], 'template'=>"<li>{link}</li>"//只会引用到该类模板 ], [ 'label'=>'文章详情', 'url'=>['site/view','id'=>1]//如果需要传参这种格式 ], '编辑',//没有链接的 ], 'options'=>[//设置html属性 'class'=>'' ] ]); ?>
注意:如果加入options可能会导致样式覆盖,达不到你想要的效果 ...