PHP

PHP生成指定位数的随机数的最简便方法

刚才在写短信验证码模块,需要用到指定位数的随机数,然后网上一找发现太可怕了这么简单的事情竟然用了好几十行多个循环嵌套……看来没有好脑仁儿真的不适合当程序员。

自写了一行版本:

function generate_code($length = 4) {
return rand(pow(10,($length-1)), pow(10,$length)-1);
}

为了便于理解,同时也为了这篇水文可以凑点字数,这是多行版:

function generate_code($length = 4) {
$min = pow(10 , ($length - 1));
$max = pow(10, $length) - 1;
return rand($min, $max);
}

 

Kohana 3.3能用的Captcha Module

官方的在3.3里取消了内置的captcha模块,而github上官方的kohana-captcha模块都是好几年前的了,因为3.3变态的PSR0命名规范所以根本无法使用。

本来想手动修改所有类名和文件名,后来抱着不要重复造车轮的想法先搜索了一番,经过多次测试后找到了一个可以用的。这个是git地址(用力点我)

另备份了一份,如果不方便上git也可以直接下载(同样用力点我)

Kohana 3.3.1 自定义错误页面

以自定义404页面为例

一、在APP/classes/HTTP/Exception/ 目录下加入404.php,继承Kohana_HTTP_Exception_404类

<?php defined(‘SYSPATH’) or die(‘No direct script access.’);

class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {

/**
 * Generate a Response for the 404 Exception.
 *
 * The user should be shown a nice 404 page.
 * 
 * @return Response
 */
public function get_response()
{
    $view = View::factory('errors/404');

    // Remembering that `$this` is an instance of HTTP_Exception_404
    $view-&gt;message = $this-&gt;getMessage();

    $response = Response::factory()
        -&gt;status(404)
        -&gt;body($view-&gt;render());

    return $response;
}

}
二、在 APP/views/ 目录下新建404.php(这个文件名随便,只要和刚才Exception目录下404.php中载入的view名对应即可)

<?php defined(‘SYSPATH’) or die(‘No direct script access.’); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Page not found</title>
</head>
<body>
<p>404 Page not found</p>
<p><?=$message ?></p>
</body>
</html>

三、在Controller(控制器)适当位置抛出异常

比如我的 APP/classes/Controller/info.php,在action_detail()中,发现request中请求的id参数在数据库中并不存在时(Model查询返回FALSE),抛出异常。

if(!$info) {
throw HTTP_Exception::factory(404, ‘info number is invalid’, array(
‘:uri’ => $this->request->uri(),
));
}

 

这就妥妥了,其他错误码或转向之类的也差不多,查文档可知。

Kohana3.3自定义Validation验证错误信息

Kohana官方的文档中没有给出Validation自定义错误信息的方法,网上搜索了一下,老外给出了一些例子,不过都是基于ORM的,对ORM不喜,觉得有点过度包装,因此项目中没有使用。

那么没有使用ORM应该如何自定义验证错误信息呢?读了下system下Validation类的源代码终于搞明白了,下面给出代码片段供参考:

$validation = Validation::factory($this->request->post())
->rule(‘mobile’, ‘not_empty’)
->rule(‘mobile’, ‘regex’, array(‘:value’, ‘/^1d{10}$/‘))
->rule(‘password’, ‘not_empty’)
->rule(‘password’, ‘regex’, array(‘:value’, ‘/^[a-zA-Z0-9]{6,16}$/‘));
//验证不通过
if(!$validation->check()) {
$errors = $validation->errors(‘member’);
$this->response->body(View::factory(‘login’)
->bind(‘post’, $post)
->bind(‘errors’, $errors));
}

注意,其中“$errors = $validation->errors(‘member’);”就是获取验证错误提示信息的地方,而errors函数中接收的参数’member’则是说明错误信息从“application/messages”目录下的member.php文件中读取并匹配。需要说明的是这个文件并不是类,所以文件名不需要首字母大写,参数与文件名一致即可。

application/messages/member.php的内容比较简单,返回对应的数组即可。

<?php defined(‘SYSPATH’) OR die(‘No direct script access.’);

return array(
‘mobile’ => array(
‘not_empty’ => ‘手机号码不能为空’,
‘regex’ => ‘手机号码不正确’,
),
‘password’ => array(
‘not_empty’ => ‘密码不能为空’,
‘regex’ => ‘密码长度在6位~16位’,
),
);
 

Kohana 3.3.1中Controller和Controller_Template的区别

官方文档实在是语焉不详,因为Kohana起源于CI,而CI中并没有Controller_Template这个东西,顿时有些摸不着头脑。

然后查看了Kohana-v3.3.1/system/classes/Kohana/Controller/Template.php之后总算明白了,Controller_Template继承自Controller,然后只是多了将$template指向的view自动render()的功能(在成员函数::after()中)。

<?php defined(‘SYSPATH’) OR die(‘No direct script access.’);
/**

  • Abstract controller class for automatic templating.
    *
  • @package Kohana
  • @category Controller
  • @author Kohana Team
  • @copyright (c) 2008-2012 Kohana Team
  • @license http://kohanaframework.org/license
    */
    abstract class Kohana_Controller_Template extends Controller {

    /**

    • @var View page template
      */
      public $template = ‘template’;

      /**

    • @var boolean auto render template
      **/
      public $auto_render = TRUE;

      /**

    • Loads the template [View] object.
      */
      public function before()
      {
      parent::before();

      if ($this->auto_render === TRUE)
      {

       // Load the template
       $this-&gt;template = View::factory($this-&gt;template);
      

      }
      }

      /**

    • Assigns the template [View] as the request response.
      */
      public function after()
      {
      if ($this->auto_render === TRUE)
      {

       $this-&gt;response-&gt;body($this-&gt;template-&gt;render());
      

      }

      parent::after();
      }

}