anzeblabla/simplite

一个非常简单且轻量级的PHP框架。

0.5 2024-07-03 10:43 UTC

This package is auto-updated.

Last update: 2024-09-09 09:25:54 UTC


README

这是一个非常简单的PHP框架,使实现PHP网站变得更加容易和快速。

功能

TODO:编写

待办事项

  • 编写更好的文档
  • 编写测试
  • 重做处理GET和POST参数的方式
  • 路由器与尾部斜杠不一致(CSS和JS包含会中断)- 应该始终重定向到带有尾部斜杠的地址
  • 使用COMPONENT_ID替换组件块时可能出现的ID重复问题
  • 在页面渲染之前布局可能出现的问题。可能会潜在地导致在用户尚未检查是否登录的情况下使用用户的问题。
  • 自动加载器
  • 表注释

发布

https://medium.com/@mazraara/create-a-composer-package-and-publish-3683596dec45

https://packagist.org.cn/

使用示例

composer require anzeblabla/simplite

文件夹结构

app/
    pages/
        index.php
        users/
            [id]/
                index.php // user profile
            index.php // list of users
    components/ # reusable components (\AnzeBlaBla\Simplite\Renderer::component($componentName))
        header.php
        footer.php
    models/ # Database models, inheriting from \AnzeBlaBla\Simplite\ModelBase
        User.php
    
index.php

index.php

<?php
require_once __DIR__ . '/vendor/autoload.php';

use \AnzeBlaBla\Simplite\Application;

$app = new Application([
    'root_directory' => __DIR__ . '/app',
    'db' => [
        'host' => $_ENV['MYSQL_HOST'],
        'dbname' => $_ENV['MYSQL_DATABASE'],
        'username' => $_ENV['MYSQL_USER'],
        'password' => $_ENV['MYSQL_PASSWORD'],
    ],
    'component_comments' => true, // wrap components in HTML comments
]);

$app->addContext([
    'logged_in' => isset($_SESSION['user_id']),
    'user_id' => $_SESSION['user_id'] ?? null
]);
if (isset($_SESSION['user_id'])) {
    $app->addContext([
        'user' => [] // TODO: get user from database
    ]);
}

$app->render();

示例模型

<?php

use AnzeBlaBla\Simplite\ModelBase;
use PHPMailer\PHPMailer\PHPMailer;

class User extends ModelBase
{
    /**
     * @SimpliteProp int
     * @SimplitePK
     * @SimpliteAutoIncrement
     */
    public int $id;
    /**
     * @SimpliteProp
     */
    public string $username;
    /**
     * @SimpliteProp
     */
    public string $password;
    /**
     * @SimpliteProp
     */
    public string $email;

    /**
     * Email confirmation code
     * @SimpliteProp
     */
    public string $confirm_code;

    /**
     * If user has confirmed their email address
     * @SimpliteProp
     * @SimpliteDefault 0
     */
    public int $confirmed_email;

    /**
     * @SimpliteProp timestamp
     * @SimpliteDefault CURRENT_TIMESTAMP
     */
    public string $created_at;
    /**
     * @SimpliteProp timestamp
     * @SimpliteDefault CURRENT_TIMESTAMP
     * @SimpliteOnUpdate CURRENT_TIMESTAMP
     */
    public string $updated_at;


    public function get_read_books($limit = null)
    {
        $limit_str = $limit ? "LIMIT $limit" : "";
        $books = ReadBook::find("user_id = ? ORDER BY created_at DESC $limit_str", [$this->id]);
        $ids = array_map(function ($book) {
            return $book->book_id;
        }, $books);
        return Book::constructMany($ids);
    }

    public function update_read_book($book_id, $read = true)
    {
        if ($read) {
            if (count(ReadBook::find("user_id = ? AND book_id = ?", [$this->id, $book_id])) > 0) {
                return;
            }
            $rb = new ReadBook([
                'user_id' => $this->id,
                'book_id' => $book_id,
            ]);
            $rb->create();
        } else {
            $rb = ReadBook::find("user_id = ? AND book_id = ?", [$this->id, $book_id]);
            if ($rb) {
                $rb[0]->delete();
            }
        }
    }

    public function has_read_book($book_id)
    {
        return count(ReadBook::find("user_id = ? AND book_id = ?", [$this->id, $book_id])) > 0;
    }
}