基于Composer的Laravel扩展包开发工作流 ,实现laravle项目的文件管理(记录成长)
PHP Composer包开发
基于Composer的Laravel扩展包开发工作流
实现laravle项目的文件管理,添加文件/文件夹,删除文件,查看代码/文件(代码支持缩进,支持语法高亮)
composer 项目地址:https://packagist.org/packages/wuqb/laravel-codeview
github 项目地址: https://github.com/wuxiumu/code-management
1、在项目下执行
mkdir packages // 创建packages 目录
cd packages // 进入 packages 目录
mkdir code-management // 创建code-management 目录,准备开发laravle文件管理
项目目录结构
- code-management
--config
--codemirror-5.31.0 [前端文件包]
--codeview.php [配置名称,路由,登录密码的]
--routes
--codevew.php [codeview 路由地址]
--src [开发包]
--Faceds
--CodeView.php
--CodeView.php
--CodeViewProvider.php
--composer.json
2、修改composer.json 文件
"autoload-dev": {
"psr-4": {
"App\\": "app/"
}
},
修改后
"autoload-dev": {
"psr-4": {
"App\\": "app/",
"Wqb\\CodeView\\": "packages/code-management/src"
}
},
3、执行 composer命令
composer dump_autoload
4、添加包的ServiceProvider
由于laravel的 package:discover 是读取 vendor/composer/installed.json 这个文件中安装的包,而我们的包是手动添加,所以无法自动添加ServiceProvider,手动在app.php中添加
'providers' => [
Wqb\CodeView\CodeViewProvider::class
],
'aliases' => [
'CodeView' => Wqb\CodeView\Facades\CodeView::class
],
上代码
code-management/composer.json
{
"name": "wuqb/laravel-codeview",
"description": "laravel codeview",
"license": "MIT",
"authors": [
{
"name": "wuqb",
"email": "824543976@qq.com"
}
],
"autoload": {
"psr-4": {
"Wqb\\CodeView\\": "src"
}
},
"require": {}
}
code-management/config/codeview.php
<?php
return [
'name' => '简单的线上代码管理工具',
'password' => 'tk12',
'route' => '/codeview',
];
code-management/routes/codeview.php
<?php
Route::any('codeview','\Wqb\CodeView\CodeView@index');
code-management/src/Faceds/CodeView.php
<?php
namespace Wqb\CodeView\Facades;
use Illuminate\Support\Facades\Facade;
class CodeView extends Facade
{
protected static function getFacadeAccessor()
{
return 'codeview';
}
}
code-management/src/CodeView.php
<?php
namespace Wqb\CodeView;
use Illuminate\Config\Repository;
use Illuminate\Http\Request;
class CodeView
{
protected $config;
/**
* 构造方法
*/
public function __construct(Repository $config)
{
$this->config = $config->get('codeview');
}
/**
* 展示页
*/
public function index(Request $request)
{
$this->head();
$this->viewAction($request);
$this->foot();
}
/**
* 展示处理
*/
public function viewAction($request)
{
$password = $this->config['password'];
$n = $this->config['route'];
$csrf_token = csrf_token();
if (isset($_COOKIE['filehelper_login_password_123456789']) && $_COOKIE['filehelper_login_password_123456789'] == md5($password)) {
$c = $request->input('c');
$v = $request->input('v');
$a = $request->input('a');
$b = $request->input('b');
$v1 = './' . $v;
$va = $v1 . $a;
echo '' . $this->config['name'] . '
';
switch ($c) {
case 'del':
if (is_file($va) == true) {
unlink($va);
echo "成功删除" . $a . "!";
} else {
echo "文件已经被删除!";
}
break;
case 'up':
if ($_FILES["file"]["error"] > 0) {
echo "上传失败! 错误码:" . $_FILES["file"]["error"] . "
";
} else {
if (file_exists($v1 . $_FILES["file"]["name"])) {
echo "文件已经存在。 ";
} else {
move_uploaded_file($_FILES["file"]["tmp_name"], $v1 . $_FILES["file"]["name"]);
echo "上传成功!";
}
}
break;
case 'md':
if ($a != "") {
if (is_dir($va)) {
echo "文件夹已存在!";
} else {
mkdir($va);
echo '文件夹创建成功!';
}
} else {
echo "文件夹名不能为空!";
}
break;
case 'ed':
if ($request->input('s') == "1") {
$eded = fopen($va, 'w');
fwrite($eded, $_POST['fs']);
fclose($eded);
echo '保存成功!
';
} else {
echo '返回
';
}
break;
default:
# code...
break;
}
// 编辑页面是否展示列表
if ($b == "1") {
} else {
echo '返回
名称
类型
大小
操作
';
if (is_dir($v1) == true) {
$fs = scandir($v1);
$i = 2;
while ($i <= count($fs) - 1) {
if ($fs[$i] != $n) {
echo "" . $fs[$i] . " ";
if (is_dir($v1 . $fs[$i]) == true) {
echo "文件夹 ";
echo "- ";
echo '打开 ';
}
if (is_file($v1 . $fs[$i]) == true) {
echo "文件 ";
echo "" . number_format(filesize($v1 . $fs[$i]) / 1024 / 1024, 4, ".", "") . "MB ";
if (substr(strrchr($fs[$i], '.'), 1) !== 'php' && substr(strrchr($fs[$i], '.'), 1) !== 'asp' && substr(strrchr($fs[$i], '.'), 1) !== 'aspx' && substr(strrchr($fs[$i], '.'), 1) !== 'do') {
echo '下载';
} else {
echo ' 打开';
}
echo ' 删除';
$ihzm = substr(strrchr($fs[$i], '.'), 1);
if ($ihzm !== 'png' && $ihzm !== 'doc' && $ihzm !== 'docx' && $ihzm !== 'jpg' && $ihzm !== 'gif' && $ihzm !== 'zip' && $ihzm !== 'apk' && $ihzm !== 'webp' && $ihzm !== 'ppt' && $ihzm !== 'pptx' && $ihzm !== 'exe' && $ihzm !== 'xls') {
echo ' 编辑';
}
echo ' ';
}
echo " ";
}
$i++;
}
}
echo '
';
}
} else {
if ($request->input('password') == $password) {
setcookie("filehelper_login_password_123456789", md5($password), time() + 3600);
header("location:" . $n);
} else {
$this->form();
}
}
}
/**
* 登录文件管理验证
*/
public function form()
{
$csrf_token=csrf_token();
echo <<
请输入密码
EOF;
}
/**
* 头部
* 引入必要的js,css
*/
public function head()
{
echo <<
文件管理
EOF;
}
/**
* 脚部
* js 配置:代码折叠 | 设置主题 | 代码高亮| 设置代码框的长宽
*/
public function foot()
{
echo <<
var editor = CodeMirror.fromTextArea(document.getElementById("ed"), {
mode: "text/groovy", //实现groovy代码高亮
mode: "text/x-java", //实现Java代码高亮
lineNumbers: true, //显示行号
theme: "dracula", //设置主题
lineWrapping: true, //代码折叠
foldGutter: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
matchBrackets: true, //括号匹配
//readOnly: true, //只读
});
editor.setSize('100%', '400px'); //设置代码框的长宽