tp配置技巧

配置的get和set
tp5.1的配置在config目錄里,一個文件是一個一級配置項,每個文件一行是二級配置項。
use think\facade\Config;//導入Config 門臉
public function get(){
//獲取全部配置
// dump(Config::get());
//只獲取app配置項
dump(Config::get('app.'));
dump(Config::pull('app'));
//獲取二級配置項
dump(Config::get('app.app_debug'));
dump(Config::get('app_debug'));//由於app是默認一級配置項,可以省略
dump(Config::has('default_lang'));//檢查是否有這個配置項,true/false
dump(Config::get('database.hostname'));
}
public function set(){
//動態設置,靜態設置是修改配置文件
dump(Config::set('app_debug'));
}
}
使用助手函數
public function helper(){
//助手函數不依賴於Config,不需要導入Config類
//dump(config());//獲取全部配置,相當於Config::get()
dump(config('default_lang'));
dump(config('?default_lang'));//查看是否存在,true/false
dump(config('database.hostname','localhost'));//設置,返回新的設置值localhost
}
trait
trait 方法優先級小於父類,
當兩個trait 方法同名,會出錯,需要如下:
use Demo1 ,Demo2{
Demo1::hello insteadof Demo2;
Demo2::hello as Demo2hello;
}
容器/依賴注入/靜態代理/請求對象
容器與依賴注入的原理
任何url的訪問都是定位到控制器的,
<?php
namespace app\index\controller;
class Demo1
{
public function d1(\app\common\B $b){//拿B做參數,當訪問的d1方法自動實例化一個B,但是URL里不含參數。
$b->speak();
}
}
<?php
namespace app\common;
class B
{
public function speak(){
echo "i am b and i am speaking";
}
}
調用 /index/Demo1/d1 ,得出i am b and i am speaking,
綁定一個類到容器
<?php
namespace app\common;
class B
{
private $name;
public function __construct($name='peterz')
{
$this->name=$name;
}
public function speakName(){
echo 'my name is'.$this->name;
}
}
<?php
namespace app\index\controller;
class Demo1
{
public function bindClass(){
\think\Container::set('Balias','app\common\B');
//或者使用bind('Blias','app\common\B)
$bb=\think\Container::get('Balias',['name'=>'constru']);
//或者使用app('Balias',['name'=>'constru']);
echo $bb->speakName();
}
}
訪問http://localhost/tp5/public/index.php/index/Demo1/bindClass,得到:my name isconstru
將閉包綁定到容器
<?php
namespace app\index\controller;
class Demo1
{
public function bindClosure(){
\think\Container::set('CC',function($param){
return 'this is params:'.$param;
});
return \think\Container::get('CC',['param'=>'parameters']);
}
}
訪問http://localhost/tp5/public/index.php/index/Demo1/bindClosure,得到this is params:parameters
facade靜態代理使用
facade類在think\facade里
<?php
namespace app\common;
class B
{
public function speak($param){
return 'i am '.$param;
}
}
<?php//這是B類的代理
namespace app\facade;
class Testfacade extends \think\facade
{
protected static function getFacadeClass(){
return '\app\common\B';
}
}
<?php//測試
namespace app\index\controller;
class Demo1
{
public function d1(){
return \app\facade\Testfacade::speak('tom');
}
}
http://localhost/tp5/public/index.php/index/Demo1/d1 輸出: i am tom
動態代理
<?php
namespace app\common;
class B
{
public function speak($p){
return $p;
}
}
<?php
namespace app\facade;
class Testfacade extends \think\Facade //什么也不寫,就是一個facade類
{
}
<?php
namespace app\index\controller;
class Demo1
{
public function d1()
{
\think\Facade::bind('app\facade\Testfacade','app\common\B');//動態代理,注意參數里app前面不要加\
return \app\facade\Testfacade::speak('tim');
}
}
控制器
控制器不依賴於Controller,但推薦繼承Controller,
控制器里返回值一般是字符串,一般是return,
默認輸出格式是html,也可以指定為其他的,比如 json,
request
使用靜態Request
<?php
namespace app\index\controller;
use \think\facade\Request;
class Demo1
{
public function d1()
{
dump(Request::get());
}
}
http://localhost/tp5/public/index.php/index/Demo1/d1?name=%27tom%27&age=30
輸出 array(2) {
["name"] => string(5) "'tom'"
["age"] => string(2) "30"
}
依賴注入方式:
public function d1(Request $request)
{
dump($request->get());
}
還可以用Controller里面的request
public function d1()
{
dump($this->request->get());
}
數據庫
配置
1,全局配置 config/databas.php
2,動態配置: think\db\query.php
3.DSN連接: 數據庫類型://用戶名:密碼@數據庫地址:端口號/數據庫名稱/字符集
增刪改查
<?php
namespace app\index\controller;
use think\Db;
class Demo1
{
public function d1()
{
/**
* 數據庫操作入口類Db,靜態調用\think\db\query.php
*/
$a=Db::table('student')
// ->field('id,name')
//SELECT `id` AS `編號`,`name` AS `姓名` FROM `student` WHERE `id` = 3 LIMIT 1
->field(['id'=>'編號','name'=>'姓名'])
->where('id','=',3)
->find();
dump(is_null($a)?'meizhaodao':$a);
}
//查詢多條
public function d2(){
$a=Db::table('student')
->field('id,name,gender')
->where([
['id','<',4],
['id','>',1],
])->select();
foreach ($a as $b){
dump($b);
}
}
public function insert(){
$data=[
'id'=>6,
'name'=>'ppp',
'age'=>20,
'gender'=>'boy',
];
// return Db::table('student')->insert($data);//運行成功返回1
// return Db::table('student')->data($data)->insert();
//插入同時返回新增的主鍵
return Db::table('student')->insertGetId('$data');
}
//多條插入
public function insertmany(){
$data=[
['id'=>6, 'name'=>'ppp', 'age'=>20, 'gender'=>'boy',],
['id'=>6, 'name'=>'ppp', 'age'=>20, 'gender'=>'boy',],
];
return Db::table('student')->insertAll($data);
}
public function update(){
// return Db::table('student')->where('id',20)->update(['name'=>'ximenq']);
//如果更新的是主鍵,比如id
return Db::table('student')->update(['name'=>'ximenq','id'=>'20']);
}//此外還可以原生查詢
}
模型輸出
$nav=Catagory::where('id','>','0')->order('order')->select()->toArray();
$this->assign('nav',$nav);
模板中
{foreach $nav as $key=>$vo}
{$vo.name}
{/foreach}
$displayimg=Db::table('imageurl')->where('ifdisplay',1)->select(); //輸出一樣,不需要toArray();
$this->assign('img',$displayimg);
模板中{\(vo.title},{\)vo['title']}都可以,但是嵌入php時,需要用后者。
{php} echo mb_strcut($vo['text'],0,150,'utf-8');{/php}
url生成示例
{:url('index/index/detail',['id'=>$vo['id'],])}
