IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 自定义php框架(phpcoco) -> 正文阅读

[PHP知识库]自定义php框架(phpcoco)

1.构建思路

路由 noahbuscher/macaw
数据模型 catfan/medoo
视图 twig/twig
分页应用库 jasongrimes/paginator
文件图片上传 brandonsavage/Upload
图片水印  Intervention/image
单个文件自动加载helpers.php

2.构建框路由

composer require noahbuscher/macaw:dev-master	

官方相关文件

https://github.com/noahbuscher/macaw

2.1在根目录下创建文件index.php,添加路由调用。如果还未设置自动路由需要手动composer dump-autoload

<?php
require('vendor/autoload.php');
use \NoahBuscher\Macaw\Macaw; //加载路由
Macaw::get('/', 'controllers\demo@index'); //案例
Macaw::get('page', 'controllers\demo@page');//案例
Macaw::get('view/(:num)', 'controllers\demo@view');//案例
Macaw::get('temp/lists', 'controllers\temp@lists');//案例
Macaw::dispatch();

3.自动加载控制器+单个文件加载

"autoload": {
    "psr-4": {
        "controllers\\": "app/controllers/", //自动加载控制器
        "models\\": "app/models/"
    },
    //这种模式需要手动加载执行composer dump-autoload
    "classmap": ["src/", "lib/", "Something.php"]
    "files": ["app/helpers.php"] //单个文件加载
   }

4.模板扩展加载 https://twig.symfony.com/doc/3.x/

composer require twig/twig:^2.12

4.1在控制器中创建Temp

<?php
namespace controllers;
class Temp
{
    public function lists(){
        $loader = new \Twig\Loader\FilesystemLoader('app/views');
        $twig = new \Twig\Environment($loader, [
            'cache' => '/path/to/compilation_cache',
        ]);
        $navigation = array(array('href'=>'www.baidu.com','caption'=>'百度'),array('href'=>'www.baidu.com','caption'=>'百度'));
        echo $twig->render('temp/lists.html', ['navigation' => $navigation]);
    }
}

4.2在模板文件app/views中传教temp/lists.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul id="navigation">
    {% for item in navigation %}
    {{var_dump(item)}}
    <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
    {% endfor %}
</ul>

<h1>My Webpage</h1>
{{ a_variable }}
</body>
</html>

4.3记得在index.php中添加路由

Macaw::get('temp/lists', 'controllers\temp@lists');

4.4效果图
在这里插入图片描述
4.5以上代码冗余过多,以下是优化为公共代码后,创建BaseController控制器,提炼出assign,display方法

<?php
namespace controllers;

class BaseController
{
    protected $twig;
    protected $data = array();
    public function __construct()
    {
        $loader = new \Twig\Loader\FilesystemLoader(dirname(__DIR__).'/views');
        $this->twig = new \Twig\Environment($loader,[]);
    }

    /**
     * @param $var
     * @param null $value
     */
    public function assign($var,$value=null){
        if (is_array($var)){
            $this->data = array_merge($this->data,$var);
        }else{
            $this->data[$var] = $value;
        }
    }

    /**
     * @throws \Twig\Error\LoaderError
     * @throws \Twig\Error\RuntimeError
     * @throws \Twig\Error\SyntaxError
     */
    public function display($template){
        echo $this->twig->render($template.'.html', $this->data);
    }
    public function success($url,$mess){
        echo "<script>";
        echo "alert('{$mess}')";
        echo "location.href='{$url}'";
        echo "</script>";
    }
    public function error($url,$mess){
        echo "<script>";
        echo "alert('error:{$mess}')";
        echo "location.href='{$url}'";
        echo "</script>";
    }
}

直接赋值

public function lists()
{
    $model = new TempDao();
    $navigation = $model->select('meiyou_admin', '*', ['nickname' => '测试']);
    $this->assign('navigation',$navigation);
    $this->display('temp/lists');

}

5.模型增加
官方文档https://github.com/catfan/Medoo

composer require catfan/medoo

案例,把temp中list方法的数据获取切换为以下代码,页面输出正常
//获取数据

$options = [
    'type' => 'mysql',
    'host' => '47.107.65.114',
    'database' => 'meinian',
    'username' => 'root',
    'password' => 'gqa123'
];
$model = new Medoo($options);
$navigation = $model->select('meiyou_admin',
    '*'
, [
    'nickname' => '测试'
]);

5.2优化代码创建BaseDao继承Medoo,同时需要增加composer配置

"autoload": {
    "psr-4": {
        "controllers\\": "app/controllers/",
        "models\\": "app/models/"  /
    },
    "files": ["app/helpers.php"]
<?php
namespace models;

use Medoo\Medoo;

class BaseDao extends Medoo
{
    function __construct()
    {
        $options = [
            'type' => 'mysql',
            'host' => '47.107.65.114',
            'database' => 'meinian',
            'username' => 'root',
            'password' => 'gqa123'
        ];
        parent::__construct($options);
    }
}


 <?php
namespace models;
class TempDao extends  BaseDao
{
    public function getList(){
        $data = $this->select('meiyou_admin','*', ['nickname' => '测试']);
       return $data;
    }
}

6.分页模型
https://github.com/jasongrimes/php-paginator

composer require "jasongrimes/paginator:~1.0"

7.图片上传
https://github.com/brandonsavage/Upload

//图片上传
composer require "codeguy/upload"  
//添加水印
composer require "Intervention/image"
``
在app文件夹下面传教uploader用于图片存储
案例代码如下在根目录下创建upload.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="/temp/fileupload">
    <input type="file" name="foo" value=""/>
    <input type="submit" value="Upload File"/>
</form>
</body>
</html>

在temp控制器中添加方法
//注意 这个命名有重复需要用别名

use Intervention\Image\ImageManagerStatic as Image;
public function fileupload(){
        $path = dirname(__DIR__).'\uploader';
        $storage = new FileSystem($path);
        $file = new File('foo', $storage);
        // Optionally you can rename the file on upload
        $new_filename = uniqid();
        $file->setName($new_filename);

        // Validate file upload
        // MimeType List => http://www.iana.org/assignments/media-types/media-types.xhtml
        $file->addValidations(array(
            // Ensure file is of type "image/png"
            new Mimetype(array('image/png', 'image/gif','image/jpg','image/jpeg')),
            //You can also add multi mimetype validation
            //new \Upload\Validation\Mimetype(array('image/png', 'image/gif'))
            // Ensure file is no larger than 5M (use "B", "K", M", or "G")
            new Size('50M')
        ));
        // Access data about the file that has been uploaded
        $data = array(
            'name'       => $file->getNameWithExtension(),
            'extension'  => $file->getExtension(),
            'mime'       => $file->getMimetype(),
            'size'       => $file->getSize(),
            'md5'        => $file->getMd5(),
            'dimensions' => $file->getDimensions()
        );
        // Try to upload file
            $file_name =$path.'/'.$new_filename.'.'.$data['extension'];
        try {
            // Success!
            $file->upload();
            //添加水印裁剪
//            // open an image file
            $img = Image::make($file_name);
//            // resize image instance
            $img->resize(320, 240);
//            // insert a watermark
            $img->insert($path.'/watermark.gif');
//            // save image in desired format
            $img->save($path.'/'.$new_filename.'_1.'.$data['extension']);
        } catch (\Exception $e) {
            // Fail!
            $errors = $file->getErrors();
            dd($errors);
        }
    }

总结:
此框架还有许多为完善的地方后续会进一步更新,这是一个长期的过程,文中相关源码地址
https://github.com/hjklnmyuiop/phpcoco

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:35:50  更:2021-10-15 11:35:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 -2025/2/27 14:02:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码