CI表单验证

转自:http://www.cnblogs.com/jiqing9006/archive/2012/08/24/2653896.html

 

一、CodeIgniter允许你为单个表单域创建多个验证规则,按顺序层叠在一起,你甚至可以同时预先处理表单域数据。要设置验证规则请使用set_rules() 函数:

上面的函数使用 三个 参数作为输入:

  1. 表单域的名字 – 就是你给表单域取的那个名字。
  2. 一个此表单域的 “人性化” 名字,它将被插入到错误信息中。例如,如果你有一个表单域叫做“user”你可能给它一个人性化名字叫做“用户名”。 注意: 如果你想让表单域的名字保存在一个语言文件里。
  3. 为此表单域设置的验证规则。
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');

上面是一段示例代码。

复制代码
<?php

class Form extends CI_Controller {
 
 function index()
 {
  $this->load->helper(array('form', 'url'));
  
  $this->load->library('form_validation');
   
  $this->form_validation->set_rules('username', 'Username', 'required');
  $this->form_validation->set_rules('password', 'Password', 'required');
  $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
  $this->form_validation->set_rules('email', 'Email', 'required');
   
  if ($this->form_validation->run() == FALSE)
  {
   $this->load->view('myform');
  }
  else
  {
   $this->load->view('formsuccess');
  }
 }
}
?>
复制代码

控制器的内容如上。

二、使用数组设置验证规则:

复制代码
$config = array(
               array(
                     'field'   => 'username', 
                     'label'   => 'Username', 
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'password', 
                     'label'   => 'Password', 
                     'rules'   => 'required'
                  ),
               array(
                     'field'   => 'passconf', 
                     'label'   => 'Password Confirmation', 
                     'rules'   => 'required'
                  ),   
               array(
                     'field'   => 'email', 
                     'label'   => 'Email', 
                     'rules'   => 'required'
                  )
            );

$this->form_validation->set_rules($config);
复制代码

 

三、级联规则:

$this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');

上面的代码设置了一组规则:

  1. 用户名表单域长度不得小于5个字符以及大于12个字符。
  2. 密码表单域必须跟密码确认表单域的数据一致。
  3. 电子邮件表单域必须是一个有效邮件地址。

四、预处理数据

$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean');
$this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');

在上面的例子里,我们“修整(trimming,去掉字符串两端空白)”了数据,转换密码为MD5,将用户名通过“xss_clean”函数处理去掉了有害数据。

任何PHP自身接收一个参数的函数都可以被用作一个规则,比如 htmlspecialcharstrimMD5, 等。

 

五、重新填充表单

set_value('field name')

不要忘记在set_value()函数中包含每个表单域的名字!

复制代码
<html>
<head>
<title>My Form</title>
</head>
<body>

<?php echo validation_errors(); ?>

<?php echo form_open('form'); ?>

<h5>Username</h5>
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />

<h5>Password</h5>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" />

<h5>Password Confirm</h5>
<input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" />

<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" />

<div><input type="submit" value="Submit" /></div>

</form>

</body>
</html>
复制代码

六、设置错误信息

$this->form_validation->set_message('rule', 'Error Message');

你也可以重写语言文件中的错误信息. 例如, 你可以这么做来改变”required” 规则的信息:

$this->form_validation->set_message('required', 'Your custom message here');

 

七、更改错误定界符

在默认情况下,表单验证类会使用 (<p>) 标签来分割每条错误信息,以达到分段效果。你可以自行对其进行定义。

  1. 定界符统一更改如果需要全局更改错误定界符, 可以在你的控制器中,在表单验证类加载之后添加如下代码:

    $this->form_validation->set_error_delimiters('<div class="error">', '</div>');在此例中,我们将定界符由系统默认的 <p> 更改为一个div标签。

  2. 定界符单独更改表单验证类所提供的两种显示错误验证信息的函数,分别可以通过如下方法来设置它们的定界符:

    <?php echo form_error('field name', '<div class="error">', '</div>'); ?>或者:

    <?php echo validation_errors('<div class="error">', '</div>'); ?>

 

 

phpmvc开始了,可我写的还有点小问题

class route{
public $ctrl;
public $action;
public function __construct(){
//p(‘route ok’);
p($_SERVER);
// exit();

if(isset($_SERVER[‘REQUEST_URI’]) && ($_SERVER[‘REQUEST_URI’]) != ‘/’){
//先处理掉index.php
if(strpos($_SERVER[‘SERVER_SOFTWARE’],’IIS’)){
$temArr = explode(‘?’, $_SERVER[‘REQUEST_URI’]);
$path = $temArr[1];
}else{
$path = $_SERVER[‘REQUEST_URI’];
}
$patharr = explode(‘/’, trim($path, ‘/’));
if(isset($patharr[0])){
$this->ctrl = $patharr[0];
}
unset($patharr[0]);
if(isset($patharr[1])){
$this->action = $patharr[1];
unset($patharr[1]);
}else {
$this->action = ‘index’;
}
//url 多余部分转换成 GET参数
$count = count($patharr) + 2;
$i = 2;
while ($i < $count){
if(isset($patharr[$i+1])){
$_GET[$patharr[$i]] = $patharr[$i + 1];
}
$i= $i + 2;
}
p($_GET);

}else{
$this->ctrl = ‘index’;
$this->action = ‘index’;
}
}
}

 

unset不起作用!!!

跟着走,跟着正确的方向走

 

 

早就听爸爸说今年是中国工农红军长征胜利八十周年,昨天学校组织我们观看了一场名叫《我的长征》的电影,我怀着激动、复杂的心情观看了这部电影。

电影结束后,我的心情久久不能平静,脑海中时时浮现这样的画面:在隆隆的枪炮声中,红军叔叔冒着枪林弹雨冲锋陷阵,在瓢泼的暴风雨中,红军叔叔跋山涉水,奋不顾身,勇往直前。回想着这些感人的画面,我的心灵受到强烈的震撼。

其中让我感触最深的就是王瑞姐夫英勇牺牲的片段。红军在夺取泸定桥时,电影主人公王瑞的姐夫冲在最前面,当“敢死队”开路杀敌,王瑞则在后面用机枪掩护,红军叔叔们在用几条铁索做成的桥上冲锋前进,下面就是湍急的水流,对面是来阻击红军的敌军……那一刻我真的是提心吊胆,生怕红军叔叔掉下去或者被子弹击中。 “砰”的一声,一颗子弹击中了王瑞的姐夫,王瑞姐夫咬牙忍痛,用双手紧紧地抓住铁索,王瑞看到后万分焦急,想马上冲上前去拉住姐夫,因为姐夫现在是他在世上的唯一一个亲人了呀,但因为十分危险,战友们拦住了王瑞,王瑞的姐夫再也坚持不住了,双手松开一只,又松开了一只,终于坚持不住掉入了江水之中……。主人公王瑞仅存唯一的亲人就这样离开了,一路上主人公王瑞的爸爸、姐姐、姐夫相继牺牲,他该是多么的痛苦啊!但他并没有被困难和痛苦打倒,因为他心中时刻有一个坚定的信念——跟着走,跟着正确的方向走,跟着毛主席走,“跟着走”这句话正是王瑞的父亲和他最敬重的连长说的,正是因为这句话,才使失去了所有亲人的王瑞重新站了起来,是毛主席的正确领导才让红军反败为胜。王瑞,虽然只是一个16岁的小红军,但他的经历、他的坚强、勇往直前的勇气却深深的感动着我……

比起现在,那时的生活太苦了,肚子饿了,只能吃树根草皮,甚至饿肚子,要是被子弹打中,需要手术,连个麻药都没有,穿的衣服也是补丁摞补丁,而我现在的生活是衣来伸手饭来张口,想吃啥就吃啥,有时还对饭菜挑三拣四,甚至把不喜欢吃的随手倒进垃圾桶。每天都可以坐在宽敞明亮、冬暖夏凉的教室里安心学习。我们的好日子都是像王瑞,王瑞的爸爸、姐姐、姐夫那样的革命先辈用生命和鲜血换来的,我们要珍惜这来之不易的幸福生活。我们要努力学习,为着目标,跟着走、跟着红军叔叔那种不怕困难,勇往直前的精神走……

八十年过去了,但“跟着走、跟着正确的方向走”的精神没有丢,我们这一代人一定会继承“跟着走”的精神,在新中国现代化建设的大潮中一路跟着正确的方向走下去。

yii框架 url助手类资料

记得 在前面写

use yii\htmlpers\Url;

原文网址:

http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html
Routing and URL Creation(路由和创建URL)

本文主题:请求处理中的路由和创建URL(Routing and URL Creation)

1、Url Formats
2、Routing
3、Creating URLs
4、Using Pretty URLs
5、Performance Consideration

当一个Yii应用开始处理一个请求的URL时,这个URL首先会被解析成一个路由(route),然后这个路由被用于实例化对应的控制器(controller)和动作(action)以处理这个请求。这个过程被称为路由解析(routing)。
路由解析的反向过程被称为创建URL(URL creation),就是通过一个给定的路由和相关的查询参数生成一个URL。当再使用这个创建的URL进行请求时,路由解析过程将把它解析成对应的路由和请求参数。
负责路由解析和创建URL的是URL manager,它被注册为urlManager应用组件。URL manager提供了parseRequest()方法用于将一个请求解析为路由和查询参数,它还提供了createUrl()方法用于创建URL。
通过在应用中配置urlManager组件,无需改动应用中的代码,你可以让你的应用可以识别任意的URL格式,例如,你可以使用以下代码为post/view动作创建一个URL:

use yii\helpers\Url;
$url=Url::to(['post/view','id'=>100]);

依据urlManager配置的不同,生成的URL可能是以下格式(或更多)中的一种:

/index.php?r=post%2Fview&id=100
/index.php/post/100
/post/100
1、Url Formats

URL manager支持两种URL格式:
1)默认的URL格式
2)美化的URL格式
默认的URL格式使用一个名为’r’的查询参数,它代表路由参数,而其他的普通查询参数则仅代表与此路由相关的查询参数,例如:Url /index.php?r=post/view&id=100,表示路由是post/view,查询参数id是100,默认URL格式无需在Web服务器创建时对URL manager做任何配置。
美化URL格式使用紧跟入口脚本名称的扩展路径来表示路由和查询参数。例如:
扩展路径URL /index.php/post/100,/post/100或许代表路由post/view和查询参数id是100,说“或许”是因为这个路径由URL rule来决定。要使用美化URL,需要根据实际需要设计一套URL rules,它将决定URL是什么样子。
你可以通过URL manager的enablePrettyUrl属性在两种URL格式之间切换,无需对应用中的代码做任何修改。
//一个rules定义实例:
D:\phpwork\advanced\common\config\main.php

//path//rules,路由规则
	'urlManager' => [
		'class' => 'yii\web\UrlManager',
		'showScriptName' => false,
		'enablePrettyUrl' => true,
		'rules' => array(
			'<controller:\w+>/<id:\d+>' => '<controller>/view',
			'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
			'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
		),
	],
2、Routing

路由解析包括两个步骤:
1)输入的请求被解析为一个路由和查询参数;
2)与路由对应的有一个控制器和动作(controller action)被创建以处理这个请求。

当使用默认URL格式时,解析一个请求为路由非常简单,只需获取GET查询参数中的’r’值即可。
当使用美化URL格式 时,URL manager会检查注册的URL rules,匹配将这个请求解析为路由的一条规则,如果没有找到,则会抛出一个yii\web\NotFoundHttpException的异常。
一旦请求被解析为路由,就应当为这个路由创建一个控制器和动作了。路由被斜杠划分为多个部分,site/index将被分解为site和index,每个部分都是一个ID,它可以指向的是一个模块(module),一个控制器(contorller),或者是一个动作(action)。从路由的第一部分开始,应用遵循以下步骤去创建模块、控制器和动作:
1)设置当前应用为当前模块;
2)在当前模块的控制器映射表(controller map)中检查是否包含这个ID(1st ID),如果包含,将创建一个对应的控制器对象,然后从第5步继续执行;
3)如果不包含,在当前模块的模块属性(modules property)中查找此ID(1st ID)是否符合,如果符合,将创建一个新模块,以新模块为起点返回第2步继续执行;
4)如果不符合,将此ID(1st ID)视为控制器ID(controller ID),并创建一个控制器对象,继续下一步操作;
5)控制器在其动作映射表(action map)中查找当前ID(2nd ID),如果找到就创建一个动作,否则,控制器将尝试创建一个与当前动作ID(ation ID)相匹配的内联动作(inline action)。
以上步骤中,如果有错误发生,将抛出一个yii\web\NotFoundHttpException异常,描述路由解析过程的失败情况。

Default Route

如果一个请求被解析为空路由,将会调用默认路由(the so-called default route)。缺省的默认路由是site/index,将指向site控制器的index动作,你可以通过配置应用的defaultRoute属性来自定义默认路由:

[
    // ...
    'defaultRoute' => 'main/index',
];

与应用的默认路由相似,模块也有默认路由,例如,有一个user模块,解析到user模块的请求将由defaultRouter决定使用哪个控制器,控制器的默认路由是default。如果在defaultRoute中没有定义action,则控制器的defaultAction属性将被用于指定默认的动作,在本例中,全路由就是:user/default/index

catchAll Route

有时,你或许想在应用临时维护的过程中,将所有的请求指向同一个页面,有许多方法都可以实现,最简单的方法就是配置yii\web\Application::$catchAll 属性如下:

[
    // ...
    'catchAll' => ['site/offline'],
];

通过以上配置,site/offline动作将被用于处理所有的请求。
catchAll属性可以是一个数组,第一个元素定义了路由,其他元素(键-值对)定义绑定到动作的参数。
提示:开发环境中的调试面板(Debug panel)在此种模式下将不会工作。

3、Creating URLs

Yii2提供了yii\helpers\Url::to()方法用于创建URL,可以指定路由和查询参数,例如:

use yii\helpers\Url;

//错误的写法:
//echo Url::to('post/index');//生成的路径是:post/index,是个相对路径,不是绝对路径

//创建一个URL:/index.php?r=post%2Findex
echo Url::to(['post/index']);//生成的路径是:/post/index

//创建一个带参数的URL:/index.php?r=post%2Fview&id=100
echo Url::to(['post/view', 'id' => 100]);

//创建一个锚点URL:/index.php?r=post%2Fview&id=100#content
echo Url::to(['post/view', 'id' => 100, '#' => 'content']);

//创建一个绝对路径:http://www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'], true);

//使用https创建一个绝对路径:https://www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'], 'https');
测试结果:
/*
post/index
/post/index
/post/100
/post/100#content
http://localhost:8082/post/index
https://localhost:8082/post/index
*/

注意,在上例中,我们假定使用默认的URL格式,如果使用的是简洁URL(pretty URL),创建出来的URL会不同,主要依据的是使用的URL规则(URL rules)
URL规则详细介绍:
http://www.yiiframework.com/doc-2.0/yii-web-urlmanager.html#$rules-detail

传递给yii\helpers\Url::to()方法的路由参数是上下文敏感的,可以是一个相对路径,也可以是一个绝对路径,遵循的规则如下:
1、如果路由是一个空字符串,当前请路由将被使用;
2、如果路由中没有斜线,它将被认为是当前控制器的一个动作ID,并将添加上当前控制器的uniqueId;
3、如果路由左端不是以斜线开头,它将被认为是当前模块的相对路由,并将添加上当前模块的uniqueId。

源代码:
public function actionUrl(){
	echo Url::to();// /post/url
	echo "<br>";

	echo Url::to('');// /post/url
	echo "<br>";

	echo Url::to(['']);// /post/url
	echo "<br>";
}
测试结果:
http://localhost:8082/post/url
/*
/post/url
/post/url
*/
URL
//创建一个带参数的URL:/index.php?r=post%2Fview&id=100
echo Url::to(['post/view', 'id' => 100]);
依据urlManager配置的不同,生成的URL可能是以下格式(或更多)中的一种:
/index.php?r=post%2Fview&id=100
/index.php/post/100
/post/100 //本例中生成的格式
echo Url::to(['post2/viewbbc', 'id' => 100,'act'=>'this']);
/*
/post2/viewbbc/100?act=this
*/

从Yii 2.0.2开始,你可以定义一个别名形式的路由,在这种情况下,别名将首先被转换为一个实际路径,随后再依据上述规则转为一个绝对路径。

例如,假定当前模块是admin,当前控制器是post:

	use yii\helpers\Url;

	//当前的请求路径是:/index.php?r=admin%2Fpost%2Findex
	echo '<br>'.Url::to(['']);

	//仅有一个动作ID的相对路径是:/index.php?r=admin%2Fpost%2Findex
	echo '<br>index'.Url::to(['index']);

	//一个相对路由:/index.php?r=admin%2Fpost%2Findex
	echo '<br>post/index'.Url::to(['post/index']);

	//一个绝对路由:/index.php?r=post%2Findex
	echo '<br>/post/index'.Url::to(['/post/index']);

	// /index.php?r=post%2Findex     assume the alias "@posts" is defined as
	//使用别名@posts(/post/index)的路径:/index.php?r=post%2Findex
	Yii::setAlias('@posts', '/post/index');
	echo '<br>@posts:'.Url::to(['@posts']);
测试结果:
/*
/post/url
index/post/index
post/index/post/index
/post/index/post/index
@posts:/post/index
*/

yii\helpers\Url::to()方法是通过调用URL管理器的createUrl()和createAbsoluteUrl()方法实现的,在后续的章节里,我们将说明如何配置URL管理器(URL manager)实现自定义创建的URL的格式。
yii\helpers\Url::to()方法也支持未关联路径的URL,此时不用给它的首参数传递数组,而是一个字符串,例如:

	use yii\helpers\Url;

	//当前的请求路径URL: /index.php?r=admin%2Fpost%2Findex
	echo Url::to();

	//别名URL:http://example.com
	Yii::setAlias('@example', 'http://example.com/');
	echo Url::to('@example');

	//一个绝对路径:http://example.com/images/logo.gif
	echo Url::to('/images/logo.gif', true);
测试结果:
/*
/post/url
http://example.com
http://localhost:8082/images/logo.gif
*/

除了to()方法外,yii\helpers\Url类还提供了其他替代方法,例如:

	use yii\helpers\Url;

    //主页URL: /index.php?r=site%2Findex
	echo "home:".Url::home();
	echo "<br>";

	//基础URL,如果一个应用部署在一个网站应用的子目录下时此路径就很有用。
	echo "base:".Url::base();
	echo "<br>";

	//当前请求URL的canonical路径,详见:https://en.wikipedia.org/wiki/Canonical_link_element
	echo "canonical:".Url::canonical();
	echo "<br>";

	//记住当前请求的URL
	Url::remember();
	//获取上一页面记住的URL
	echo "previous:".Url::previous();
	echo "<br>";
测试结果:
/*
home:/
base:
canonical:http://localhost:8082/post/url
previous:/post/url
*/
4、Using Pretty URLs

使用简洁URL
//pretty URL
要使用简洁URL,需要在应用配置中设置urlManager组件:

[
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => false,
            'rules' => [
                // ...
            ],
        ],
    ],
]

enablePrettyUrl属性用于开关简洁URL格式,其他属性是可选的,以上配置是通用设置。
showScriptName,此属性决定是否在创建的URL中包含入口脚本文件,例如:此属性设置为false时,将使用/post/100,而不是/index.php/post/100
enableStrictParsing,此属性决定是否使用严格的请求解析。如果严格解析有效,进入的请求URL属性必须至少匹配一条规则可以处理成有效请求,或者执行一个yii\web\NotFoundHttpException异常。如果严格解析失效,当没有规则匹配请求的URL时,URL的部分路径信息将会处理成请求路由。
rules,此属性包含的是规则列表,定义了如何去解析和创建URL。这是你创建URL时主要设置的属性,它的格式将满足你特定的应用需求。

注意:如果要在生成的URL中隐藏入口脚本文件名,除了设置showScriptName为false外,你还需要配置Web server,当一个请求URL没有明确定义时能够正确识别由哪个PHP脚本去执行。如果你使用Apache Web服务器,你可以参考安装章节描述的推荐配置:
http://www.yiiframework.com/doc-2.0/guide-start-installation.html#recommended-apache-configuration

URL规则(URL Rules)

URL规则是yii\web\UrlRule或其子类的实例,每个URL规则由一个匹配路径信息的模式(pattern)、一个路由(route)和一些查询参数(query parameter)组成。如果一个URL规则的模式与请求的URL相匹配,它就可以被解析为一个请求。如果一个URL规则的路由和参数名称符合所给定的,它就可以用于创建URL。

当简洁URL格式有效时,URL管理器使用规则属性中声明的URL规则去解析请求,并创建URL。特定情况下,要解析请求,URL管理器以定义的顺序检测规则,并查找第一条符合请求URL的规则。匹配的规则将被用于解析URL为一个带参数的路由。类似的,要创建一个URL,URL管理器查找符合给定路由和参数的第一条规则,并使用它去创建一个URL。

你可以配置yii\web\UrlManager::$rules 为一个数组,键名是模式,值是对应的路由,每个模式-路由对构成一个URL规则,例如:

[
	'posts'	=> 'post/index',
	'post/<id:\d+>'=>'post/view',
]

此配置定义了两个URL规则,第一个规则匹配URL”posts”,并映射到路由”post/index”,第二个规则匹配一个正则表达式”post/(\d+)”,并映射到路由”post/view”和一个名为id的参数。

注意:规则中的模式(pattern)用于匹配URL中的路径部分,例如:”/index.php/post/100?source=ad”的路径(path)是post/100(首尾的斜线将被忽略),匹配的模式是”post/(\d+)”。

除了使用模式-路由对来定义URL规则之外,你还可以使用配置数组来定义,每个配置数组用于配置一个单独的URL规则对象,此种配置通常是发生在你需要在URL规则中还要配置其他属性的情况,例如:

[
	[
		'pattern'=>'posts'
		'route'=>'post/index',
		'suffix'=>'.json',
	]	
]

如果你没有定义规则配置的class,默认值是yii\web\UrlRule。

命名参数(Named Parameters)

一个URL规则可以与一些命名的查询参数相关联,这些参数的定义格式为:<ParamName:RegExp>,ParamName定义了参数名称,RegExp是可选的正则表达式,用于匹配参数值,如果RegExp没有定义,意味着参数值会是一个没有斜线的字符串。
注意:你可以为参数只定义正则表达式,模式的剩余部分被认为是文本。

当一个规则用于解析URL,它会与参数相关联,这些参数与URL中的相应部分相匹配,并随后被request应用组件放置到$_GET 中去。当规则用于创建一个URL时,它将从提供的参数中获取值,并将它们插入到参数声明的地方。
我们一起看个例程看看命名参数是如何工作的,假定我们已经声明了如下URL规则:

[
	'posts/<year:\d{4}>/<category>'	=>'post/index',
	'posts'=>'post/index',
	'post/<id:\d+>'=>'post/view',
]

当以上规则用于解析如下URL时:(根据左侧的模式创建路径(符合右侧的路由))

/index.php/posts,使用第2条规则,解析为路由post/index。
/index.php/posts/2014/php,使用第1条规则,解析为路由post/index,参数year的值是2014,参数category的值是php。
/index.php/post/100,使用第3条规则,解析为路由post/view,参数id的值是100。
/index.php/posts/php,当yii\web\UrlManager::$enableSrictParsing 为true时,将抛出一个yii\web\NotFoundHttpException异常;当yii\web\UrlManager::$enableSrictParsing 为false时(默认值),将返回路径部分posts/php作为路由。

当规则用于创建URL时:(解析的逆过程,根据右侧符合的路由,确定生成的路径(套用左侧的模式))

Url::to(['post/index']),使用第2条规则生成路径:/index.php/posts
//不是Url::to('post/index'),此句生成的路径:post/index
Url::to(['post/index','year'=>2014,'category'=>'php']),使用第1条规则生成路径:/index.php/posts/2014/php
Url::to(['post/view','id'=>100]),使用第3条规则生成路径:/index.php/post/100
Url::to(['post/view','id'=>100,'source'=>'ad']),使用第3条规则,生成路径:/index.php/post/100?source=ad,因为source参数在规则中未定义,所以它被追加到生成的URL末尾作为一个参数。
Url::to(['posts/index','category'=>'php']),不适用任何规则,生成路径:/index.php/posts/index?category=php。注意:因为不适用于任何规则,所以只是简单的将路由作为路径信息,参数作为查询字符串追加到生成的URL中。
Url::to(['post/index','category'=>'php']),使用第2条规则,生成路径:/index.php/posts?category=php,其他参数追加到URL尾。

//以上测试时的环境参数配置如下:
D:\phpwork\advanced\common\config\main.php

源代码:
	'urlManager' => [
		'class' => 'yii\web\UrlManager',
		'showScriptName' => true,
		'enablePrettyUrl' => true,
		'rules'=>[
			'posts/<year:\d{4}>/<category>'	=>'post/index',
			'posts'=>'post/index',
			'post/<id:\d+>'=>'post/view',
		],
	]

//参数化路由(Parameterizing Routes)
你可以在URL规则的路由中添加参数名称,这样就允许一条URL规则适用于多条路由,例如,下例规则添加控制器(controller)和动作(action)参数到路由中:

[
	'<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>'=>'<controller>/<action>',	
	'<controller:(post|comment)>/<id:\d+>'=>'<controller>/view',
	'<controller:(post|comment)>s'=>'<controller>/index',
]

解析URL /index.php/comment/100/creat,使用第1条规则,设置参数controller为comment,参数action为create,这样路由/就解析为comment/create。
类似的,为路由comment/index创建一个URL,第3条规则适用,将会创建一个URL:/index.php/comment

提示:使用参数路由,可以大大减少URL规则的数量,这样可以有效提升URL管理器的性能。

默认情况下,在一条规则中声明的所有参数都是必须的,如果一个请求URL中未包含一个特定参数,或者一个URL创建时未带特定参数,此规则将不适用。为了使一些参数成为可选项,你需要配置规则的默认属性,列在此属性中的参数如果没有被提供将使用一个预定值。
在下例规则声明中,page和tag参数均是可选的,如果没有被提供,它们将使用默认值1和空字符串。

[
	[
		'pattern'=>'posts/<page:\d+>/<tag>',
		'route'=>'post/index',
		'defaults'=>['page'=>1,'tag'=>''],
	]	
]

上例规则将可以解析和创建以下URL:

/index.php/posts,page是1,tag是''
/index.php/posts/2,page是2,tag是''
/index.php/posts/2/news,page是2,tag是'news'
/index.php/posts/news,page是1,tag是'news'

如果没有使用可选参数,你必须要创建4条规则才能实现以上效果。

//使用服务器名称的规则(Rules with Server Names)
可以在URL规则的模式中包含Web服务器名称,当你的应用与Web服务器名称不相同时,此项功能将非常有用,例如,下例规则将URL http::/ /admin.example.com/login 解析为路由admin/user/login,并将http::/ /www.example.com/login解析为site/login。

[
	'http://admin.example.com/login'=>'admin/user/login',	
	'http://www.example.com/login'=>'site/login',
]

你可以在服务器名称中使用参数替换动态信息,例如,下例规则将URL http:/ /en.example.com/posts 解析为路由post/index,并带有参数language=en。

[
	'http://<language:\w+>.example.com/posts'=>'post/index',
]

注意:含有服务器名称的规则不能被包含在入口脚本的子目录下。例如,如果当前应用位于http:/ /www.example.com/sandbox/blog,然后你应该使用模式http:/ /www.example.com/posts替换http:/ /www.example.com/sandbox/blog/posts,这样将允许你的应用无需修改代码即可部署在其他目录下。

//URL后缀(URL Suffixes)
你或许想要为不同的目的为URL添加后缀,例如,你想要为URL添加.html后缀,这样页面看起来更象是HTML静态页面;你或许想为URL添加.json后缀,以描述响应期望的内容类型,你可以通过配置yii\web\UrlManager::$suffix 属性实现此目的,应用配置代码如下:

[
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,
            'suffix' => '.html',
            'rules' => [
                // ...
            ],
        ],
    ],
]

上述代码将允许URL管理器识别请求的URL,并创建带后缀.html的URL。
小贴士:你可以设置URL后缀为”/”,这样所有的URL都以斜线结尾。
注意:当你配置了一个URL后缀,如果一个URL没有此后缀,它将被认为是不认识的URL,这是SEO的推荐做法。

你可以为不同的URL使用不同的后缀,在单独的URL规则中配置suffix属性即可。当一个URL规则有此属性设置,它将覆盖URL管理器中的后缀设置,例如:下例配置中包含一个自定义的URL规则,使用.json后缀替换了全局配置的.html。

[
'components' => [
	'urlManager' => [
		'enablePrettyUrl' => true,
		'showScriptName' => false,
		'enableStrictParsing' => true,
		'suffix' => '.html',
		'rules' => [
			// ...
			[
				'pattern' => 'posts',
				'route' => 'post/index',
				'suffix' => '.json',
			],
		],
	],
],
URL标准化(URL normalization)

从2.0.10版本起,URL管理器可以配置为使用UrlNormalizer处理带斜线和不带的URL。因为技术上http:/ /example.com/path和http:/ /example.com/path/是两个不同的URL,而它们提供相同的内容会降低SEO的效果。默认情况下,标准化会折叠斜线,根据后缀是否有尾斜线来决定添加或移除末尾斜线,使用永久重定向指向标准化的URL。标准化可以使用URL管理器进行全局配置,也可以为每一个规则进行单独配置,你可以设置UrlRule::$normalizer 为false,这样就可以为特定的URL规则禁用标准化。
下例展示了如何配置UrlNormalizer:

[
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,
            'suffix' => '.html',
            'normalizer' => [
                'class' => 'yii\web\UrlNormalizer',
                'action' => UrlNormalizer::ACTION_REDIRECT_TEMPORARY, // 使用临时转向替代永久转向
            ],
            'rules' => [
                // ...
                [
                    'pattern' => 'posts',
                    'route' => 'post/index',
                    'suffix' => '/',
                    'normalizer' => false, //禁用标准化
                ],
                [
                    'pattern' => 'tags',
                    'route' => 'tag/index',
                    'normalizer' => [
                        'collapseSlashes' => false, //不折叠连续斜线
                    ],
                ],
            ],
        ],
    ],
]

注意:UrlManager::$nomalizer 默认是禁用的(disabled),如果要使用URL标准化,你需要明确配置它。

HTTP方法

实现RESTful API时,通常需要根据使用的HTTP方法将同一个URL解析为不同的路由,在规则的模式中添加支持的HTTP方法前缀即可轻松实现。如果一个规则支持多种HTTP方法,可以将各方法之间使用逗号分隔,例如:下例的规则支持不同的HTTP方法,但有相同的模式”post/<id:\d+>”,一个请求PUT post/100将被解析为post/create,另一个请求GET post/100将被解析为post/view。

[
	'PUT,POST post/<id:\d+>'=>'post/create',
	'DELETE post/<id:\d+>'=>'post/delete',
	'post/<id:\d+>'=>'post/view',
]

注意:如果一个URL规则在其模式中包含HTTP方法,此规则则只能用于解析,当创建URL时此规则将被忽略。
小贴士:为了简化RESTful API路由,Yii提供了一个特殊的URL规则类yii\rest\UrlRule,它很有效并支持一些特性,如自动多元化控制器ID,更多细节请参考RESTful API开发的路由章节:
http://www.yiiframework.com/doc-2.0/guide-rest-routing.html

自定义规则(Customizing Rules)

在此前的例子中,URL规则主要是使用模式-路由对的形式定义的,这是通常使用的简短形式,在特定情况下,你可能需要自定义URL规则,自定义一些属性,如yii\web\UrlRule::$suffix ,使用一个完整形式的数据定义此规则即可,下例就是从URL Suffixes部分摘取的:

[
    // ...other url rules...

    [
        'pattern' => 'posts',
        'route' => 'post/index',
        'suffix' => '.json',
    ],
]

信息:如果你没有为规则配置定义class选项,默认值将是yii\web\UrlRule。

动态添加规则(Adding Rules Dynamically)

URL规则可以被动态添加到URL管理器,此种情况在重新分发模块时经常发生,这些模块需要管理它们自己的URL规则。要使用动态添加的规则在规则处理的过程中生效,你需要在引导过程中添加规则。对于模块,意味着将在yii\base\BootstrapInterface中完成,并添加这些规则在bootstrap()方法,示例代码如下:

public function bootstrap($app){
	$app->getUrlManager()->addRules([
		//在此声明规则	
	],false);
}

注意:你也可以在yii\web\Application::bootstrap()中列出这些模块,这样就可以加入到引导过程了。

创建规则类(Creating Rule Classes)

尽管默认的yii\web\UrlRule类足够适用于项目的主要用途,但也有些情况下你必须创建自己的规则类。例如,在一个汽车销售网站,你或许会想要一种URL格式:/Manufacurer/Model,此处的Manufacturer和Model必须与数据库中存在的数据相匹配,默认的规则类在此处就无法使用,因为它是静态定义的模式。
我们可以创建如下的URL规则类来解决这个问题:

amespace app\components;

use yii\web\UrlRuleInterface;
use yii\base\Object;

class CarUrlRule extends Object implements UrlRuleInterface
{

    public function createUrl($manager, $route, $params)
    {
        if ($route === 'car/index') {
            if (isset($params['manufacturer'], $params['model'])) {
                return $params['manufacturer'] . '/' . $params['model'];
            } elseif (isset($params['manufacturer'])) {
                return $params['manufacturer'];
            }
        }
        return false;  // this rule does not apply
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();
        if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
            // check $matches[1] and $matches[3] to see
            // if they match a manufacturer and a model in the database
            // If so, set $params['manufacturer'] and/or $params['model']
            // and return ['car/index', $params]
        }
        return false;  // this rule does not apply
    }
}

然后在yii\web\UrlManager::$rules 配置中使用这个新的规则类:

[
	[
		'class'	=>'app\components\CarUrlRule',
		//配置其他属性
	]	
]
5、关于性能(Performance Consideration)

当开发一个复杂的Web应用时,优化URL规则以减少解析请求和创建URL的时间是非常重要的工作。
使用参数化路由,你可以减少URL规则的数量,并显著提升性能。
当解析或创建URL时,URL管理器按定义的顺序检测URL规则,所以,你可以考虑调整URL规则的顺序,将有效的、常用的规则放在其他规则的前面。
如果一些URL规则在模式或路由中使用了相同的前缀,你可以考虑使用yii\web\GroupUrlRule,这样它们可以在一个组中被URL管理器更有效的检测到,此种情况通常是你的应用由多个模块组成,每个有模块有自己的URL规则定义,并以模块ID作为公共前缀。

我的sublime-text 编辑器配置

sublime text 自定义配置
一、快捷键,几个常用的快捷键,配置的和eclipse一样

[
{“keys”: [“alt+up”], “command”: “swap_line_up” },
{“keys”: [“alt+down”], “command”: “swap_line_down”} ,

{ “keys”: [“alt+1”], “command”: “toggle_side_bar” },
{“keys”: [“ctrl+alt+up”], “command”: “duplicate_line”},
{“keys”: [“ctrl+alt+down”], “command”: “duplicate_line”},
{“keys”: [“ctrl+shift+x”], “command”: “upper_case”} ,
{“keys”: [“ctrl+shift+y”], “command”: “lower_case”} ,
{“keys”: [“ctrl+d”], “command”: “run_macro_file”, “args”: {“file”: “res://Packages/Default/Delete Line.sublime-macro”}},
{“keys”: [“ctrl+l”], “command”: “show_overlay”, “args”: {“overlay”: “goto”, “text”: “:”}}

]

二、配色方案Solarized(Light)
三、自定义设置
{
“color_scheme”: “Packages/Color Scheme – Legacy/Solarized (Light).tmTheme”,
“font_size”: 12,
“ignored_packages”:
[
“Vintage”
]
}
四、一些插件 比如  中文插件包……

工作以后如何有效学习

本文转自 悦思悦读 公众号

工作后怎么学习?

有个小妹子问:非常渴望成长,虽然已经工作了,仍然不敢中断学习。但是,在工作中学吧,好像学不深;想学习工作之外的东西,又不知道如何入手。到底应该如何学?

有这样问题的朋友不少。尤其是在好学、努力、有成长意愿和激情的年轻人中,这一问题相当典型。

毕竟,以前在学校里,学习是主业,每天至少花8小时专注学习。该学什么学校都给规定好了,具体的内容老师也会教。等到工作以后,每天的主业变成了完成工作任务,学习已经成了业余时间的“奢侈品”。

以前学了就去考试,好歹有个及格的底限或者争取优秀的目标在那里。现在每天自己学,又不能学完做个卷子拿去找老板升职加薪。虽然知道应该学习,可是,动力好像不那么强了。

怎么才能把自己有限的业余时间和精力投入到有用、有效的学习上去呢?

按区域区分学习内容

相对于在学校里,工作后学习有一个很大的优势:我们可以很容易找到什么“有用”!(虽然有点功利,但不得不承认,“有用”与否是大多数人产生驱动力的重要所在。)

我们可以以职业发展为基准进行学习,从而避免漫无目,东一下,西一下的“乱学”。

千里之行,始于足下。无论未来的发展如何规划,都是从当下的工作开始起步的。

那么,我们就以当前工作为核心,把工作后的学习内容大致分为如下三个区域:核心区、扩展区和外延区。

三个区域

  1. 核心区:指在工作中直接使用到的知识和技能。例如:用Java语言编程,用Excel算账,用PPT做宣传材料等。

    这部分非学不可,不然现在工作不保。

     

  2. 扩展区:指与当前或未来工作(有转岗转行需求)有关,但并不会立刻就用到的知识技能。

    如果学了这部分内容,很可能对自己未来的职业发展有支持作用。

     

  3. 外延区:包罗万象,所有没有纳入前两个区域的内容都可以归属此区。

重点困扰区域

核心区的学习对于一般合格的员工都不成问题。不学就要失业,自然动力十足。而且学了马上就能实践,非常利于掌握。

外延区原本就是Just Have A Try,不必投入太多时间精力,以体验和了解为主。大不了根本不学。

真正困扰大家的是扩展区的内容。

扩展区的学习可以分为软硬两个方面的技能。(从这个角度划分的话,而外延区也可分为软硬两个部分。不过,核心区仅包括硬技能。)

扩展区的软技能

软技能:指管理能力、交流能力、表达能力等soft skills。

软技能无论工作生活,每天都用得上,不过往往没有现成文档指令,只要照着做就能达到某种效果。

这类技能,一般不太可能有速成的培训班,需要长期的揣摩和积累,才有可能进步。

掌握这类技能,最好的办法就是处处留心,经常性的回顾和总结,也就是俗话说的琢磨。

相关的书籍,讲授如何管理,如何写作之类的有不少,可以作为辅助。不过只有和应用结合,在实践中验证理论,才可能有效果。

扩展区的硬技能

硬技能:指具体的技术和知识(多为科技方面)。

这部分更接近于课本知识,对逻辑思维要求较高,在一定程度上,可以靠集中突击来掌握。

扩展区的硬技能,实际是提出这个问题的同学们关注的部分。这种关注,是由这部分内容的性质决定的。

扩展区硬技能的性质

【必要性】

核心区的知识技能一般是用到什么学什么,比较零碎,不成体系,而且很多时候,也深入不下去。想要真的在业务领域达到一定的深度广度,就需要扩展区来补充。

【可行性】

扩展区一般不必被工作单位或老板指定,也因此享有了较大的自由度,可以自行安排学习内容和时间。

【消耗性】

扩展区的学习,和工作相关又不能占用工作时间。因此只能使用自己的业余时间来学,同时要学得深入,还得投入大量精力。很容易打成一场消耗战。

学习的困境

如今,有那么多热门技术(例如:数据分析、机器学习等等),每一种都充斥着各种各样或免费或费用很低的资料、课件、分享、培训。从理论到实践都有讲解。

许多同学自己也制订了详细的学习计划,把计划全部业余时间都用到了吸收各种新的知识技术上。

可是,很多人花费了大量时间,最后却好像没学到什么。这又是为什么呢?

困境的原因

直接原因:精力分散,不够专注,各个方向都有涉猎,但却都仅限于略知皮毛。

深层原因:驱动力不足以让自己专注。

根本原因:没有足够渴望的目标,无法调动自身能量形成驱动力。

有效学习的驱动力

有效学习的核心

其实,无论哪个区域的内容,最为有效的学习都无外乎:带着问题学习

我有一个问题,迫切的想要找到答案。我在读的书、在听的课、在看的代码里就有这个问题的答案,或者至少能帮我找到解决它的思路——在这样的背景之下去学,自然能够专注得起来,深入的下去。

有效学习的驱动力

很显然,扩展区的学习,如果和核心区目标一致,能够迅速将学习成果应用到本职工作上去,那想必能达到事半功倍的效果,至少能够持续获得学习的动力。

如果对现在的工作并没有很大兴趣,非常想要投身进入其他领域,那么不妨参照这个成功转行的例子,考虑一下脱产学习。这样一来精力集中,二来也是背水一战,逼一下自己。

如果既和工作无关,又没有热爱到足够为它辞职,恐怕就需要极大的毅力和自制力才能有效的学习了。

行文到此,之前的部分,是提示你去挖掘自己学习的驱动力;后面的部分,是讲能够使学习过程更有效的具体方法。

但是,所有的理论、方法、工具、提示,都只有在驱动力具备的情况下才能够生效

 

学习的驱动力的问题,是他人无论如何无法代替或帮助你产生的,必须要靠你自己解决。找到自己足够渴望的目标,以目标实现的前景为激励来促使自己产生驱动力——这是你只能自己一个人完成的任务。

有效学习的方法

 

要点和过程

有效学习有三个要点目标明确系统性强足够深入。三者缺一不可。

新的技术知识那么多,如果今天学点这个,明天学点那个,搞成狗熊掰棒子肯定收获甚微。选定目标是最重要的。

学习之初,首先要有一个明确的scope——我要学习哪个领域里面的哪些内容。同时得清楚,学了这个东西,要用来干什么,最终会把它用到什么事情上去。

明确了要学什么,学了用来干什么,也就可以确定一个知识体系(至少是其中一个结构分明的分支)。并进一步确定,对这个体系中的内容需要了解到什么深度,这就有了一个深度目标。

有了体系和深度,进而可以列举出所需要掌握的各个知识模块。

在此基础上,再去指定具体的课表和学习计划。

总结一下

i)明确知识范畴和应用目的;

ii)划定知识体系并确定深度目标;

iii)填充知识模块;

iv)制定针对具体模块各个击破的学习计划;

v)执行学习计划。

其中的 i)- iii)可以借鉴做作文列提纲的办法:在勾勒出轮廓之后,先把知识结构的骨干勾勒出来,分为篇章,列出大标题,再在其中填注小标题。

举例说明

目标:笔者要学习基于机器学习的自然语言处理,具体的应用是开发聊天机器人的语言理解模块。

调研:通过 i) 向有类似经验的同事请教; ii) 到网上搜索综述性文章; iii) 查找实践类的文章、类似开源项目……等一系列手段。笔者了解到,最起码有两件事情必须要做:意图分类和实体提取。

构建体系:为了用机器学习实现这两件事,就需要用到分类和seq2seq预测模型。进一步,为了获取意图,可能还需要做文本聚类。

确定深度:再通过进一步查询资料得知,要了解这些模型的运行原理,就得读公式,那么就需要求导、求微分、求积分、矩阵运算、概率统计等方面的知识。

填充内容:同时为了在现实的数据上应用这些模型,需要掌握将文本转化为向量空间模型的能力,评测模型质量的能力,和数据清洗整理的能力。

所有这些能力又都是以编码能力为支撑的。

制定提纲:有了上面这些,就可以构建如下这个提纲。

为了开发聊天机器人语言理解模块学习机器学习的内容提纲

A. 数学

a. 数学分析:求导、微分、积分

b. 线性代数:向量基本运算,矩阵基本运算,矩阵分解,多种矩阵的性质

c. 概率统计:古典概率模型,贝叶斯公式,常见概率分布及其公式和特点

 

B. 数据处理和向量模型空间的构建

        a. 文本标注

        b. Bagging & Boosting

c. 中文分词方法及原理

d. n-gram模型原理

e. bi-gram文本特征提取

f. 计算文档tf-idf 及其信息熵

C. 模型原理及公式

a. Linear Regression(最小二乘法)

b. Logestic Regression(极大似然估计)

c. Naive Bayes

d. Decision Tree(ID3, C4.5)

e. SVM

f. CRF

g. KMeans

h. Spectral Clustering

i. LDA

D. 模型的构建和验证

        a. Binary-Classification vs Multi-Classification

        b. Normalization & Regularization

c. Validation & Test

d. Cross Validation Methods

e. Precesion, Recall, F1Score

f. ROC, AUC

E. 工具及语言

       a. Python,Java,C#类比及对比

       b. Python 库,Java 库,C# 库

       c. 分词工具(jieba分词)和词库

       d. word2vec

F. 实践

如上只是第一个版本,可以先依据它制定一个为期两到三个月的学习计划。在执行过程中,根据新的认识和具体需要可随时调整提纲和计划。

关于培训

对于自己完全不了解的领域,很多人会选择参加培训。

笼统而言,用自己金钱和时间换取他人的知识和经验当然没问题,甚至可能是更高效的办法。但前提是对方得真的有知识和经验(不是忽悠),而且TA所提供的是你所需要的。否则,不过是浪费钱和时间而已。

要正确判断一门培训课程的质量,除了常识和阅历,还一定要对所学内容有所了解。一无所知,就看广告报个班,即使有幸碰到了好的老师和课程,能吸收的恐怕也非常有限。

所以,笔者对于有偿培训的建议是:慎重,了解后再选择

最好是能够自己列出上面那样的课程提纲后,再去对照提纲寻找满足内容需求的课程。就算不能列出小节名,至少对于需要哪几个部分的知识要有所了解。

对于全新领域,要制作这么一份提纲的确有一定困难。不过,现在的各种资源那么丰富,有各式各样的书籍、文章、论坛、微信/QQ群、免费讲座和分享等可以利用。

只要是有心人,善于利用资源,肯投入进去研究,总还是能够先对自己的目标领域勾勒一个轮廓和大致框架出来的。

有效学习的几点提示

分享几个笔者认为行之有效的日常学习Tips。

关联

 

把新学到的东西和日常的工作、生活联系起来,进行思考。比如:将理论代入现实,不同领域间事物的类比,相似内容的对比等。

以身边的实例来检测理论。不仅能够加深理论知识的理解,而且有助于改进日常事物的处理方法。

记录

准备一个笔记本,纸的或者电子的。有什么发现、感想、疑问、经验等等,全都记下来。

如果是对某个话题、题目有比较完整的想法,最好能够及时整理成文,至少记录下要点。

隔一段时间后把笔记整理一下,把分散的点滴整理成块,一点点填充自己的“思维地图”。

分享

知识技能这种东西,学了,就得“得瑟”——把学习到的新知识、理论、方法,分享给更多的人。如此一来,倒逼自己整理体系、记忆要点,堪称与人方便自己方便的最佳实例。

把自己的感想、体会、经验分享出来也是同理,还多出了锻炼自己逻辑思维能力和归纳总结能力。一举多得,何乐而不为?

外延区的意义

外延区的内容完全可以和自己的工作、专业没有任何关系。

可以肆无忌惮读任何自己想读的书,享受与前辈精英分享思维成果的乐趣。

除了学术类的内容,烹饪、烘培、音乐、美术、插画、煮咖啡……什么都可以尝试一下。

笔者建议大家尝试一下这些完全没有接触过的领域。

一则,可以调剂一下,放松身心,作为休闲的一种方式。

二则,可以从更广泛的角度去理解“学习”这件事。

三则,也可以稍许体会一下“斜杠”的难度。

现在,鼓励大家成为斜杠中青年也渐渐成了励志类自媒体的一种风气。斜杠真的那么容易吗?

反正,自从我学了几次裁缝之后,真心觉得:这些东西,用来玩很有意思,用来赚钱可比当码农难多了累多了,还是把本职工作干好吧。

php框架我该用哪个

最近学习研究了好多的PHP代码,最后发现要开发一个成熟可用的web程序,最好的办法还是研究一个好的框架,然后在此基础上高效的完成任务。

先看看视频教程,然后在去比较着选用一个合适的框架吧。YII 和 ThinkPHP 选择一个吧,还是先从thinkPHP入门吧,毕竟这个教程多,文件体积也小。先从这个入手把框架弄懂。

就这样吧。

一点想法

家教网,教育电子平台,现代教育技术支撑平台、

学生,学习课程,便宜,甚至免费,获取人工辅导(需求自定、知识、时间节点)支付费用,可以辅导小同学

教师,辅导学生获取收益,发布视频获取人气和收益。公开课赚人气。