gravity-framework/gravity-core

Gravity PHP 库,用于 gravity-framework

v0.8.1 2024-08-16 03:30 UTC

This package is auto-updated.

Last update: 2024-09-16 03:38:28 UTC


README

gravity 框架的主库,您也可以在满足一些依赖条件的情况下将其用于自己的项目。

安装

通过 composer

在您的项目根目录下,如果您还没有创建 composer.json 文件,请创建一个,然后在 require 部分添加以下内容

{
    "require": {
        "gravity-framework/gravity-core": "^0.8"
    }
}

使用 composer 安装 GRAVITY-CORE,然后在项目根目录下运行以下命令

composer install

手动安装

您也可以直接从 github 仓库 下载源代码,并将其解压到您的项目根目录。

即使使用核心,您仍然需要使用 composer。在解压的目录中,运行以下命令

composer dump-autoload

在您的项目 vendor 目录下的 autoload.php 文件中,将以下行添加到文件开头

require '../GRAVITY-CORE-main/vendor/autoload.php';

依赖

要使用 GRAVITY-CORE,您可以选择使用 gravity-framework 或确保您的项目结构满足一些标准

  • 包含至少两个文件(configs.phpdatabase.php)的 configs 目录

    configs.php 文件用于在各类脚本之间建立链接,例如:php、javascript、css(位于特定目录中,例如:public)或项目中的图像和其他目录。

    configs.php

    <?php
    
    //A modifier selon la configuration des dossiers du projet
    define('DS', DIRECTORY_SEPARATOR);//Séparateur de dossier selon l'OS
    define('VIEWS', dirname(__DIR__). DS .'templates'.DS);//Les maquettes
    define('SCRIPTS', dirname($_SERVER['SCRIPT_NAME']).DS);//Le dossier dans lequel se trouve votre fichier index.php (contrôleur frontal), par exemple public/
    define('STYLES', SCRIPTS.'css'.DS);//Les fichiers css
    define('JS', SCRIPTS.'js'.DS);//Les fichiers javascript
    define('IMAGES', SCRIPTS.'images'.DS);//Les images
    
    //Vous pouvez aussi définir vos propres constantes selon vos besoins
    
    ?>



    database.php 文件用于配置您的数据库(如果您使用的话)

    database.php

    <?php
    
    return [
        "server" => "mysql",
        "host" => "localhost",
        "port" => "3306",
        "user" => "root",
        "pass" => "",
        "dbname" => "mabase"
    ]
    
    ?>

  • 可选的 .htaccess 文件,以充分利用路由系统
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    
    RewriteRule ^(.*)$ public/index.php?route=$1 [QSA,L]

    例如,如果您想使用 route 作为 URL 中参数来管理不同的路由


  • 用于 Web 项目的 templates 目录,其中包含您的不同视图和模板。您可以根据应用程序的不同模块将它们组织到子目录中。

    模板示例

    <!DOCTYPE html>
    <html lang="fr">
    
        <head>
            <title><?= $title ?></title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
    
            <link rel="apple-touch-icon" href="<?= IMAGES.'apple-icon.png'?>">
            <link rel="shortcut icon" type="image/x-icon" href="<?= IMAGES.'favicon.ico' ?>">
    
            <link rel="stylesheet" type="text/css" href="<?= STYLES.'bootstrap.min.css' ?>">
            <link rel="stylesheet" type="text/css" href="<?= STYLES.'custom.css' ?>">
        </head>
    
        <body>
            
            <div class="container-fluid">
                <?= $content ?>
            </div>
    
            <!-- Start Script -->
            
            <script src="<?= JS.'jquery-1.11.0.min.js' ?>"></script>
            <script src="<?= JS.'bootstrap.bundle.min.js' ?>"></script>
            <script src="<?= JS.'custom.js' ?>"></script>
    
            <!-- End Script -->
        </body>
    
    </html>

    您可以看到模板中变化的部分是通过 $content 变量在 php 中声明的。

    从模板继承的视图示例

    <?php $title = "Accueil" ?>
    
    <center><h1>Bienvenue</h1></center>
    
    <p>Lorem ipsum dolor sit atmet consectur ...</p>

    请查看 项目示例 了解如何使用 gravity 模板。

注意

使用 gravity-framework 时,您的项目结构将自动遵循推荐的结构。

路由

在您的项目主文件中(例如 index.php),您可以使用 Router 对象来声明您的路由。

示例

require '../vendor/autoload.php';
require '../config/configs.php';

use Gravity\Core\App\Controllers\Controller;
use Gravity\Core\Routing\Router;


$router = new Router($_REQUEST['route']);

########################################### Definissez vos routes ########################################### 

$router->get('/', function() {
	(new Controller())->renderView('Home.index', 'layout');
});

$router->get('/shop', [ShopController::class, 'index']);

$router->get('/shop/:productId', "App\Controllers\ShopController@show");

在此示例中,我们声明了三种不同方式的三个路由。

$router->get('/', function() {
	(new Controller())->renderView('Home.index', 'layout');
});

通过指定路径和一个表示触发路由时执行的操作的闭包函数来声明一个路由。
在此操作中,我们显示了一个位于 templates/Home 目录中的 index 视图,该视图基于位于 templates 目录根目录的名为 layout 的模板。

$router->get('/shop', [ShopController::class, 'index']);

$router->get('/shop/:productId', "App\Controllers\ShopController@show");

声明路由的两种其他方法,这次使用控制器的方法

查看gravity-framework以获取关于如何使用gravity的路线和控制器的更多详细信息。

最后,需要考虑在try/catch块中启动router。

try {
	$router->run();
} catch(Exception $e) {
    	//Affiche les détails de l'erreur dans une vue
	(new Controller())->renderView('Errors.index', 'Errors.layout', ['error'=>$e]);
}

数据库

如果您使用数据库,请确保在configs目录中的database.php文件中配置正确。

实体

对于您将使用的每个表,您将创建一个相应的实体类,其中每个属性都明确对应于一个列,并且以完全相同的方式编写。

例如,对于一个具有以下列的articles

  • id(主键)
  • 标题
  • 内容
  • 作者
  • 发布日期

您将有一个Article类,该类从Gravity\Core\App\Entity\Entity类派生

use Gravity\Core\App\Entity\Entity;

class Article extends Entity {

    private $titre;
    private $contenu;
    private $auteur;
    private $date_publication;

}

注意:无需指定id属性,因为gravity会自动处理主键。

仓库

对于每个创建的实体类,需要一个类型为Gravity\Core\App\Repository\Repository的类,以便在需要时与数据库进行通信。

ArcticleRepository

use Gravity\Core\App\Repository\Repository;


class ArticleRepository extends Repository {

    protected static $entity = Arcticle::class;
    protected static $table = "articles";

}

注意:如果您的表的主键名称不是id,您必须绝对添加静态字段$primary_key,其值为键的名称,如下所示
protected static $primary_key = "article_id";,您还必须在相应的实体类中添加该属性,与前面的示例不同,因为主键的名称不同。

数据检索和操作

现在您可以通过控制器或直接在定义路由时操作或检索数据,例如将其提供给用户。

使用示例

$router->get('/', function() {
    	//Tous les articles
    	$articles = ArticleRepository::findAll();
	(new Controller())->renderView('Home.index', 'layout', ['articles'=>$articles]);
});

$router->get('/articles/:id', function() use($router) {
    	//Les paramètres de la route pour récupérer l'id
    	$params = $router->getRoute('articles.get')->getParameters();

	$a = ArticleRepository::find($params[0]);

	(new Controller())->renderView('Articles.show', 'layout', ['article'=>$a]);

}, 'articles.get');

$router->get('/articles/author/:name', function() use($router) {
    	//Les paramètres de la route pour récupérer l'auteur
    	$params = $router->getRoute('articles.get.author')->getParameters();

	$a = ArticleRepository::findWhere(['auteur'], [$params[0]]);

	(new Controller())->renderView('Articles.show', 'layout', ['article(s)'=>$a]);

}, 'articles.get.author');

$router->post('/articles', function() use($router) {
    	//Les paramètres et données de la requête
    	$params = $router->getRoute('articles.post')->getExtras();

    	$a = new Article($params);

	$saved = ArticleRepository::save($a);

	(new Controller())->renderView('Articles.save', 'layout', ['saved'=>$saved]);

}, 'articles.post');

方法find()findAll()save()允许通过其对应的repository操作实体,还有其他方法,请参阅gravity-framework以获取更清晰的使用方法。

资源

您可以获取与数据库结构不同的数据,甚至可以在渲染时部分修改它们。

为此,您需要创建一个从Gravity\Core\App\Resources\AbstractResource派生的类,该类适合您的实体。

对于我们的示例文章,我们可以将其格式化为显示编辑者而不是作者,我们还可以显示内容的20个首字符。为此,我们实现toArray()方法,返回包含您新结构数组的表单。

说明

use Gravity\Core\App\Resources\AbstractResource;

class ArticleResource extends AbstractResource {

    protected $entity = Article::class;

    public function toArray() {
        return [
            'id' => $this->entity->getId(),
            'rédacteur' => $this->entity->getAuteur(),
            'contenu' => substr($this->entity->getContenu(), 0, 20).'...',
            'date publication' => $this->entity->getDate_publication()
        ];
    }

}

您还可以根据需要格式化发布日期。

在显示时,使用创建的资源类的实例来显示格式化的数据

// Article dont l'id est 5
$article = ArticleRepository::find(5);

$articleFormatted = (new ArticleResource())->make($article);

(new Controller())->renderView('Articles.show', 'layout', ['article'=>$articleFormatted]);

注意:要格式化实体数组,请使用collection()方法而不是make()方法

许可证

GRAVITY-CORE在MIT许可证下发布,请参阅LICENSE.txt文件或访问https://open-source.org.cn/licenses/mit-license.php以获取更多详细信息

贡献

欢迎所有贡献,以提高库和框架,遵循规则、尊重和礼貌

额外

请勿犹豫,在issues部分报告您的问题,以提高沟通效率并尽可能多地为项目的发展做出贡献