本文笔记主要包括以下内容:

  1. 保存小量数据为本地文件(File持久化)
  2. 写入config文件(默认的Config::set方法不能持久化到文件)
  3. 传递php变量js使用

使用的Laravel版本为 5.2

File持久化

有时想要保存数据,而这数据量是很小的(如一个自定义配置文件等),又不会经常使用,使用数据库或是Redis等会有点浪费,这时可以考虑将之保存为本地文件。

Laravel本身已提供了File这个ServiceProvider,默认在./config/app.php里已经配置好了:

1
2
3
4
5
6
7
8
9
10
11
'providers' => [
...
Illuminate\Filesystem\FilesystemServiceProvider::class,
...
],

'aliases' => [
...
'File' => Illuminate\Support\Facades\File::class,
...
]

查看源码:

1
./vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php

可以发现,写入(put)、读取(get)等操作是对file_put_contentsfile_get_contents等的封装。
并且FileSystem也提供了一些方法方便地进行其他操作(如move delete copy append allFiles等)

简单粗暴地,可以使用以下方法存起来即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function saveFile($yourData) {
$data = [
[
'id' => 1,
'name' => 'Aevit'
],
[
'id' => 2,
'name' => 'Aevitx'
],
]; // 示例数据
$final = json_encode($data, JSON_UNESCAPED_UNICODE);

// 以下是保存在`public`目录下;如果要存在其它目录,可以使用`app_path()`去组合
$rs = \File::put('your_file_name', $final);
if ($rs === false) {
return \Response()->json(['code' => 1, 'msg' => 'save file failure'], 200);
}
return \Response()->json(['code' => 0, 'msg' => 'save file success'], 200);
}

Config文件的写入

Configset方法,只是当前有效而已,并不能持久化到对应的config文件里,这里提供一种简单的方法来进行操作 。

这里采用的是写入文件的方式,如果需要频繁操作的话,还是建议用Cache、或第三方扩展包等其他方式比较好

首先简单说明一下自带的Config
Laravel框架本身提供了Config文件的相关操作,默认在./config/app.php里已经注册了ConfigFacade

1
2
3
4
5
'aliases' => [
...
'Config' => Illuminate\Support\Facades\Config::class,
...
]

Config提供的所有方法,可以查看以下源码:

1
./vendor/laravel/framework/src/Illuminate/Config/Repository.php

写入config文件有以下几点需求:

  • 能写入所有数据
  • 能修改config文件里指定的key的值
  • 当指定的key不存在时,自动在对应的层级,插入新key及其value
  • 类似Configset方法

方法如下:

./app目录下,新建目录Helpers,再在./app/Helpers里新建文件CustomConfig.phpphp文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php

namespace App\Helpers;

/**
* 持久化自定义config文件
*/
class CustomConfig
{
public function __construct() {
}

public static function set($input, $value = null) {
if (empty($input)) {
return false;
}
$keys = explode('.', $input);
$fileName = $keys[0];
$array = \Config::get($fileName); // 原数据

if (count($keys) == 1) {
// 顶层(即config文件的名字)(只有一层,将全部数据直接写入即可)
$array = $value;
} else {
// 遍历
$tmp = &$array;
array_shift($keys); // 第一个key为顶层(即config文件的名字),不用遍历。直接将第一个key删除掉即可
while (count($keys) >= 0) {
$aKey = array_shift($keys);

if (!isset($tmp[$aKey])) {
$tmp[$aKey] = [];
}
if (count($keys) == 0) {
$tmp[$aKey] = $value;
break; // 找到最后一个key了,直接结束
} else {
$tmp = &$tmp[$aKey];
}
}
}

$data = var_export($array, true);

if(\File::put(app_path() . '/../config/' . $fileName . '.php', "<?php\n return $data ;")) {
return true;
}
return false;
}
}

使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use App\Helpers\CustomConfig;

$data = [
'names' => [
'id' => 1,
'name' => 'Aevit'
],
'tags' => [
[
'id' => 1,
'info' => [
'tag_name' => 'aTagName',
'created' => '2016-06-18',
]
]
]
];

// 写入全部数据
CustomConfig::set('your_config_name', $data);

// 修改指定key(key在第一层)
CustomConfig::set('your_config_name.names', ['id' => 1, 'name' => 'Aevit.xyz']);

// 修改指定key(key不是在第一层)
CustomConfig::set('your_config_name.tags.0.info.tag_name', 'newTagName');

// key不存在则插入
CustomConfig::set('your_config_name.newKey', 'newAevit');

传递php变量给js使用

有时我们需要传递一些php变量blade里的js使用,可以使用以下方法:

首先将php变量传递至balde模版里,我们可以在controller里传递:

1
return view('your_view', ['jsData' => $yourData]);

然后在blade文件里,将php转化为js变量,接下来在js里就可以使用JSDATA了。

1
2
3
4
5
<script type="text/javascript">
@if(isset($jsData))
var JSDATA = {!! json_encode($jsData) !!};
@endif
</script>

可以将以上方法写在一个公共blade文件里,这样就可以在当前js里使用JSDATA这个变量名(或自己定义一个名字),不用每次都重新去写一遍相同的代码。


2016.06.18 01:09
Aevit
华师


摄影:Aevit 2015年6月 阳江闸坡 海边露营