【原创】使用ThinkPHP5的一些小技巧

【原创】使用ThinkPHP5的一些小技巧

1、没有安装wamp环境时,TP项目还能运行起来进行调试吗?

router.php用于php自带webserver支持,可用于快速测试,动命令:php -S localhost:8888 router.php,最好是在public目录下进行启动,这样访问localhost:8888的时候,再会默认走的public目录下的index.php文件,但是此时,如果本地没有数据库的话,可就连接不上数据喽,当然,如果连接的是线上的数据库那就没事!

2、如果用助手函数redirect,记得要return哦

return redirect('User/login');

3、空控制器和空操作在强制使用路由的情况下是不生效的【可以使用Route::miss()代替】,如果是非强制的话,路由miss的优先级是优于空控制器或者空操作的!

'url_route_must' => false,  // 是否强制使用路由,默认为false,true代表强制使用路由

4、多级控制器示例:非强制路由状态下,同时定义了路由,那么默认非路由访问的方式就会失效,除非注释掉定义的路由

Route::get('home/index', 'index/one.Home/index');  // 路由访问方式 http://user.tp5.com/index/home/index
http://user.tp5.com/index/one.home/index  // 这个是非路由访问方式,定义了上面之后,下面的这个就会报错

5、方法注入和属性注入的使用注意事项:

1)常用于控制器初始化位置,方便同一控制器其他方法调用
2)方法注入所对应的方法,应写于对应模块的公有方法里,或者整个项目的公有方法里,即common.php。

/**
 * 控制器初始化
 * {@inheritDoc}
 * @see \think\Controller::_initialize()
 */
public function _initialize()
{
    Request::hook(‘user’,‘getUserInfo’);  // 方法注入
    Request::instance()->bind(‘user’,new User);  // 属性注入
}
/**
 * 控制器首页
 */
public function index()
{
    var_dump($info = Request::instance()->user(1));
    var_dump($info = Request::instance()->user);
}

5、操作方法参数绑定:

变量名绑定不一定由访问URL决定,路由地址也能起到相同的作用,但是当有定义路由的时候,参数优先遵循路由规则

http://serverName/index.php/index/blog/read/id/5
http://serverName/index.php/index/blog/archive/year/2016/month/06

6、用partition 方法来进行数据库水平分表:

不要使用任何 SQL 语句中会出现的关键字当表名、字段名,例如 order 等。会导致数据模型拼装 SQL 语句语法错误。

partition($data, $field, $rule);
// $data 分表字段的数据
// $field 分表字段的名称
// $rule 分表规则
// 用于写入
$data = [
    ‘id’   => 1,
    ‘name’ => ‘think’
];
$rule = [
    ‘type’ => ‘mod’, // 分表方式
    ‘num’  => 3     // 分表数量,3张表
];
// 需要创建3张表,分别为log_1,log_2,log_3
// cid所对应的值,会从0开始排,0进入log_1,1进入log_2,2进入log_3,3进入log_1一次循环
Db::name(‘log’)
->partition([‘cid’ =>0], “cid”, $rule)
->insert($data);
       
// 用于查询
$list = Db::name(‘log’)
->partition([‘cid’ =>0], “cid”, $rule)
->where([‘id’ => 1])
->select();
var_dump($list);

7、判断数据集是否为空的方法:

不能直接使用empty判断,而必须使用数据集对象的isEmpty方法判断,例如:

$users = Db::name(‘user’)->select();
if($users->isEmpty()){
    echo ‘数据集为空’;
}  

8、在模型内部获取单个数据的注意事项:

如果你是在模型内部,请不要使用$this->name的方式来获取数据,请使用$this->getAttr(‘name’) 替代

$user = User::get(1);
echo $user->name
echo $user->getAttr(‘name’);

9、在volist标签循环输出中,mod的含义:

mod代表每次展示的个数,下面对应的value值,代表每次查询的起始位置,示例:

{volist name=”list” id=”user” key=”k” mod=”5″}
<li>{$k}== {$key}</li>
{eq name=”mod” value=”3″}<br/>{/eq}
{/volist}

结果为【即5个一组,从键值为3的地方开始】:

1== 0
2== 1
3== 2
4== 3

5== 4
6== 5
7== 6
8== 7
9== 8

10== 9

10、异常捕获使用时的注意事项:

可以使用PHP的异常捕获进行必要的处理,但需要注意一点,在异常捕获中不要使用think\Controller类的error、success和redirect方法,因为上述三个方法会抛出HttpResponseException异常,从而影响正常的异常捕获,例如:

// 错误方式,这种方式会抛异常,显示执行错误
try{
    $info = Db::name(‘user’)->find(1);
    $this->success(‘执行成功!’);
}catch(\Exception $e){
    $this->error(‘执行错误’);
}
// 正确方式,这种方式是正确的,会显示执行成功
try{
    $info = Db::name(‘user’)->find(1);
}catch(\Exception $e){
    $this->error(‘执行错误’);
}
$this->success(‘执行成功!’);

11、SQL监听的注意事项:

监听方法需要写到执行语句之前,这样,才能监听到后面SQL语句执行的过程

Db::listen(function($sql, $time, $explain){
    // 记录SQL
    echo $sql. ‘ [‘.$time.‘s]’;
    // 查看性能分析结果
    dump($explain);
});
$list = Model\User::find(1)->toArray();

12、批量验证的使用方法:

批量验证如果验证不通过,返回的是一个错误信息的数组【非批量验证,需要把batch()去掉,这样报错之后,就会中断,返回的是字符串】。使用方法如下:

$rule = [
    ‘name’  => ‘require|max:25’,
    ‘age’   => ‘number|between:1,120’,
    ’email’ => ’email’,
];
$msg = [
    ‘name.require’ => ‘名称必须’,
    ‘name.max’     => ‘名称最多不能超过25个字符’,
    ‘age.number’   => ‘年龄必须是数字’,
    ‘age.between’  => ‘年龄只能在1-120之间’,
    ’email’        => ‘邮箱格式错误’,
];
$data = [
    ‘name’  => ‘thinkphp’,
    ‘age’   => 121,
    ’email’ => ‘thin@kphp@qq.com’,
];
$validate = new Validate($rule, $msg);
if(!$validate->batch()->check($data)){
    var_dump($validate->getError());
}

返回结果如下:

array (size=2)
‘age’ => string ‘年龄只能在1-120之间’ (length=26)
’email’ => string ‘邮箱格式错误’ (length=18)

13、ajax提交数据的注意事项:

token参数的获取,以及URL参数的填写,示例如下:

<div>表单提交测试</div>
<div>
      <form method=“post” action=“index/index/save”>
          {:token()}
          <input type=“text” name=“name” value=“Hello”>
          <input type=“hidden” name=“_method” value=“PUT” >
          <input type=“submit” value=“提交”>
      </form>
      <div class=“js_submit” style=”width:100px;height:100px;border:1px solid red;”></div>
</div>
<script>
$(function(){
      $(‘.js_submit’).click(function(){
            let token  = $(‘:input[name=”__token__”]’).val();
            let params = {name:‘你好’,__token__:token};
            $.post(“index/index/save”, params, function(json){
            if(json.status == 1){
                alert(json.msg);
            }else{
                alert(json.msg);
            }
        },‘json’);
      });
});
</script>

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据