{"id":22994480,"url":"https://github.com/schery19/gravity-core","last_synced_at":"2025-08-13T22:31:43.596Z","repository":{"id":237630379,"uuid":"794927957","full_name":"schery19/GRAVITY-CORE","owner":"schery19","description":"Bibliothèque principale pour le framework gravity, vous pouvez l'utiliser aussi pour votre propre projet moyennant que ce dernier respecte quelques dépendances.","archived":false,"fork":false,"pushed_at":"2024-11-23T09:22:16.000Z","size":121,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2024-11-23T10:26:46.123Z","etag":null,"topics":["framework","gravity","gravity-core","library","php"],"latest_commit_sha":null,"homepage":"https://github.com/schery19/GRAVITY-CORE","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/schery19.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-02T08:38:32.000Z","updated_at":"2024-11-23T09:21:22.000Z","dependencies_parsed_at":"2024-11-23T12:17:47.464Z","dependency_job_id":null,"html_url":"https://github.com/schery19/GRAVITY-CORE","commit_stats":null,"previous_names":["schery19/gravity-core"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schery19%2FGRAVITY-CORE","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schery19%2FGRAVITY-CORE/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schery19%2FGRAVITY-CORE/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schery19%2FGRAVITY-CORE/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/schery19","download_url":"https://codeload.github.com/schery19/GRAVITY-CORE/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229784286,"owners_count":18123604,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","gravity","gravity-core","library","php"],"created_at":"2024-12-15T05:19:05.745Z","updated_at":"2024-12-15T05:19:06.510Z","avatar_url":"https://github.com/schery19.png","language":"PHP","readme":"# GRAVITY-CORE\r\nBibliothèque principale pour le framework gravity, vous pouvez l'utiliser aussi pour votre propre projet moyennant que ce dernier respecte quelques dépendances.\r\n\r\n## Installation\r\n### Via composer\r\nUtilisez [composer](https://getcomposer.org/download/) pour installer GRAVITY-CORE, dans la racine de votre projet tapez la commande suivante :\r\n\r\n```bash\r\ncomposer require gravity-framework/gravity-core\r\n```\r\n\r\n### Manuellement\r\nVous pouvez aussi télécharger directement le code source sur le [dépot]() github et décompresser le dossier dans la racine de votre projet.\u003cbr/\u003e\u003cbr/\u003e\r\nVous devez utiliser quand même composer pour utiliser le core. En vous positionnant dans le dossier décompressé, tapez la commande suivante :\r\n\r\n```php\r\ncomposer dump-autoload\r\n```\r\n\r\nDans le fichier \u003cb\u003eautoload.php\u003c/b\u003e dans le dossier vendor de votre projet ajouter la ligne suivante au debut du fichier\r\n\r\n```php\r\nrequire '../GRAVITY-CORE-main/vendor/autoload.php';\r\n```\r\n\r\n\r\n## Dépendances\r\nPour utiliser GRAVITY-CORE, vous pouvez soit utiliser [gravity-framework](https://github.com/schery19/gravity-framework) ou faire en sorte que la structure de votre projet réponde à quelques critères :\r\n\r\n\u003cul\u003e\r\n\u003cli\u003e\r\nDossier \u003cstrong\u003econfigs\u003c/strong\u003e contenant au moins deux fichiers : \u003cstrong\u003econfigs.php\u003c/strong\u003e, \u003cstrong\u003edatabase.php\u003c/strong\u003e\u003cbr/\u003e\u003cbr/\u003e\r\n\r\nLe fichier configs.php permettent de faire les liens entre les divers scripts tels que : php, javascript, css (présents dans un dossier spécifique par exemple : public) ou même des dossiers images et autres de votre projet.\r\n\r\nconfigs.php :\r\n```php\r\n\u003c?php\r\n\r\n//A modifier selon la configuration des dossiers du projet\r\ndefine('DS', DIRECTORY_SEPARATOR);//Séparateur de dossier selon l'OS\r\ndefine('VIEWS', dirname(__DIR__). DS .'templates'.DS);//Les maquettes\r\ndefine('SCRIPTS', dirname($_SERVER['SCRIPT_NAME']).DS);//Le dossier dans lequel se trouve votre fichier index.php (contrôleur frontal), par exemple public/\r\ndefine('STYLES', SCRIPTS.'css'.DS);//Les fichiers css\r\ndefine('JS', SCRIPTS.'js'.DS);//Les fichiers javascript\r\ndefine('IMAGES', SCRIPTS.'images'.DS);//Les images\r\n\r\n//Vous pouvez aussi définir vos propres constantes selon vos besoins\r\n\r\n?\u003e\r\n```\r\n\r\n\u003cbr/\u003e\u003cbr/\u003e\r\n\r\nLe fichier database.php sert à renseigner les différentes configurations de votre base de données si vous en utilisez\r\n\r\ndatabase.php\r\n```php\r\n\u003c?php\r\n\r\nreturn [\r\n    \"server\" =\u003e \"mysql\",\r\n    \"host\" =\u003e \"localhost\",\r\n    \"port\" =\u003e \"3306\",\r\n    \"user\" =\u003e \"root\",\r\n    \"pass\" =\u003e \"\",\r\n    \"dbname\" =\u003e \"mabase\"\r\n]\r\n\r\n?\u003e\r\n```\r\n\u003c/li\u003e\u003cbr/\u003e\r\n\r\n\u003cli\u003e\r\nFichier \u003cstrong\u003e.htaccess\u003c/strong\u003e (optionnel), pour utiliser au mieux le systême de routes\r\n\r\n```apache\r\nRewriteEngine On\r\n\r\nRewriteCond %{REQUEST_FILENAME} !-f\r\n\r\nRewriteRule ^(.*)$ public/index.php?route=$1 [QSA,L]\r\n```\r\nsi par exemple vous voulez utiliser ```route``` comme paramètre dans l'url pour vos points d'entrée pour gérer vos différentes routes\r\n\u003c/li\u003e\u003cbr/\u003e\r\n\r\n\u003cli\u003eDossier \u003cstrong\u003etemplates\u003c/strong\u003e (pour des projets web), qui contiendra vos différentes vues et gabarits. vous pouvez les classer en sous-dossiers selon vos différents modules de votre application.\u003cbr/\u003e\u003cbr/\u003e\r\n\r\nExemple d'un gabarit :\r\n```php\r\n\u003c!DOCTYPE html\u003e\r\n\u003chtml lang=\"fr\"\u003e\r\n\r\n    \u003chead\u003e\r\n        \u003ctitle\u003e\u003c?= $title ?\u003e\u003c/title\u003e\r\n        \u003cmeta charset=\"utf-8\"\u003e\r\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\r\n\r\n        \u003clink rel=\"apple-touch-icon\" href=\"\u003c?= IMAGES.'apple-icon.png'?\u003e\"\u003e\r\n        \u003clink rel=\"shortcut icon\" type=\"image/x-icon\" href=\"\u003c?= IMAGES.'favicon.ico' ?\u003e\"\u003e\r\n\r\n        \u003clink rel=\"stylesheet\" type=\"text/css\" href=\"\u003c?= STYLES.'bootstrap.min.css' ?\u003e\"\u003e\r\n        \u003clink rel=\"stylesheet\" type=\"text/css\" href=\"\u003c?= STYLES.'custom.css' ?\u003e\"\u003e\r\n    \u003c/head\u003e\r\n\r\n    \u003cbody\u003e\r\n        \r\n        \u003cdiv class=\"container-fluid\"\u003e\r\n            \u003c?= $content ?\u003e\r\n        \u003c/div\u003e\r\n\r\n        \u003c!-- Start Script --\u003e\r\n        \r\n        \u003cscript src=\"\u003c?= JS.'jquery-1.11.0.min.js' ?\u003e\"\u003e\u003c/script\u003e\r\n        \u003cscript src=\"\u003c?= JS.'bootstrap.bundle.min.js' ?\u003e\"\u003e\u003c/script\u003e\r\n        \u003cscript src=\"\u003c?= JS.'custom.js' ?\u003e\"\u003e\u003c/script\u003e\r\n\r\n        \u003c!-- End Script --\u003e\r\n    \u003c/body\u003e\r\n\r\n\u003c/html\u003e\r\n```\r\n\r\nVous pouvez constater la partie qui varie du gabarit est déclarée en php par la variable ```$content```\u003cbr/\u003e\u003cbr/\u003e\r\n\r\nExemple d'une vue qui descend du gabarit :\r\n```php\r\n\u003c?php $title = \"Accueil\" ?\u003e\r\n\r\n\u003ccenter\u003e\u003ch1\u003eBienvenue\u003c/h1\u003e\u003c/center\u003e\r\n\r\n\u003cp\u003eLorem ipsum dolor sit atmet consectur ...\u003c/p\u003e\r\n```\r\n\r\nVoir dans l'[exemple]() d'un projet comment utiliser les templates avec gravity.\r\n\u003c/li\u003e\r\n\r\n\u003c/ul\u003e\r\n\r\n### Note :\r\nEn utlisant [gravity-framework](https://github.com/schery19/gravity-framework), la structure récommandée pour votre projet est automatiquement respectée\r\n\r\n## Routes\r\nDans le fichier principal de votre projet, par exemple index.php, vous utilisez l'objet ```Router``` pour déclarer vos routes.\r\n\r\nExemple :\r\n```php\r\nrequire '../vendor/autoload.php';\r\nrequire '../config/configs.php';\r\n\r\nuse Gravity\\Core\\App\\Controllers\\Controller;\r\nuse Gravity\\Core\\Routing\\Router;\r\n\r\n\r\n$router = new Router($_REQUEST['route']);\r\n\r\n########################################### Definissez vos routes ########################################### \r\n\r\n$router-\u003eget('/', function() {\r\n\t(new Controller())-\u003erenderView('Home.index', 'layout');\r\n});\r\n\r\n$router-\u003eget('/shop', [ShopController::class, 'index']);\r\n\r\n$router-\u003eget('/shop/:productId', \"App\\Controllers\\ShopController@show\");\r\n\r\n```\r\n\r\nDans cet exemple, on a déclaré trois routes de trois maniêres différentes.\r\n\r\n```php\r\n$router-\u003eget('/', function() {\r\n\t(new Controller())-\u003erenderView('Home.index', 'layout');\r\n});\r\n```\r\nPermet de déclarer une route en spécifiant un chemin, une fonction (closure) qui exprime l'action à effectuer lors du déclenchement de la route.\u003cbr/\u003e\r\nDans l'action on affiche une vue \u003cb\u003eindex\u003c/b\u003e présente dans le dossier ```templates/Home```, cette vue est basée sur un gabarit nommé \u003cb\u003elayout\u003c/b\u003e présent à la racine du dossier templates.\u003cbr/\u003e\u003cbr/\u003e\r\n\r\n```php\r\n$router-\u003eget('/shop', [ShopController::class, 'index']);\r\n\r\n$router-\u003eget('/shop/:productId', \"App\\Controllers\\ShopController@show\");\r\n```\r\n\r\nDeux autres moyens de déclarer une route, cette fois-ci en utilisant des méthodes de controleur\r\n\r\nVoir [gravity-framework](https://github.com/schery19/gravity-framework) pour plus de détails sur comment utiliser les routes et les controleurs avec gravity.\r\n\r\nIl faut penser au final à démarrer le router dans un bloc \u003cb\u003etry/catch\u003c/b\u003e :\r\n\r\n```php\r\ntry {\r\n\t$router-\u003erun();\r\n} catch(Exception $e) {\r\n    \t//Affiche les détails de l'erreur dans une vue\r\n\t(new Controller())-\u003erenderView('Errors.index', 'Errors.layout', ['error'=\u003e$e]);\r\n}\r\n```\r\n\r\n## Base de données\r\nSi vous utilisez une base de données, assurez-vous que les configurations sont correctes dans le fichier ```database.php``` présent dans le dossier \u003cb\u003econfigs\u003c/b\u003e.\r\n\r\n### Entity\r\n\r\nPour chaque table que vous utiliserez vous créerez une classe d'entité correspondante.\u003cbr/\u003e\r\n\r\nPar exemple pour une table \u003cb\u003earticles\u003c/b\u003e avec des colonnes suivantes :\r\n\u003cul\u003e\r\n\u003cli\u003eid (clé primaire)\u003c/li\u003e\r\n\u003cli\u003etitre\u003c/li\u003e\r\n\u003cli\u003econtenu\u003c/li\u003e\r\n\u003cli\u003eauteur\u003c/li\u003e\r\n\u003cli\u003edate_publication\u003c/li\u003e\r\n\u003cli\u003edate_modification\u003c/li\u003e\r\n\u003cli\u003ecommentaires\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\nVous aurez une classe ```Article``` dérivée de la classe ```Gravity\\Core\\App\\Entity\\Entity``` avec uniquement les champs requis :\r\n\r\n\r\n```php\r\nuse Gravity\\Core\\App\\Entity\\Entity;\r\n\r\nclass Article extends Entity {\r\n\r\n    protected static $required = [\r\n        'titre',\r\n        'contenu',\r\n        'auteur',\r\n        'date_publication'\r\n    ];\r\n\r\n}\r\n```\r\n\r\n\u003cb\u003eNote\u003c/b\u003e : Inutile de préciser l'attribut ```id```, puisque gravity prend en charge automatiquement les clés primaires.\r\n\r\n### Repository\r\n\r\nPour chaque classe d'entité créée, il faut une classe de type ```Gravity\\Core\\App\\Repository\\Repository```, pour communiquer effectivement avec la base à tout moment.\r\n\r\nClasse \u003cb\u003eArcticleRepository\u003c/b\u003e :\r\n```php\r\nuse Gravity\\Core\\App\\Repository\\Repository;\r\n\r\n\r\nclass ArticleRepository extends Repository {\r\n\r\n    protected static $entity = Arcticle::class;\r\n    protected static $table = \"articles\";\r\n\r\n}\r\n```\r\n\r\n\u003cb\u003eAttention\u003c/b\u003e : Si la clé primaire de votre table porte un nom différent de \u003cb\u003eid\u003c/b\u003e, vous devez absolument ajouter le champ statique ```$primary_key``` avec comme valeur le nom de la clé de la manière suivante :\u003cbr/\u003e\u003cbr/\u003e\r\n```protected static $primary_key = \"article_id\";```.\r\n\r\n\r\n### Récupération et maipulation des données\r\nVous pouvez maintenant manipuler ou récupérer les données soit à travers un controleur ou directement lors de la définition des routes par exemple pour le rendre à l'utilisateur.\r\n\r\nExemple d'utilisation\r\n```php\r\n$router-\u003eget('/', function() {\r\n    \t//Tous les articles\r\n    \t$articles = ArticleRepository::findAll();\r\n\t(new Controller())-\u003erenderView('Home.index', 'layout', ['articles'=\u003e$articles]);\r\n});\r\n\r\n$router-\u003eget('/articles/:id', function() use($router) {\r\n    \t//Les paramètres de la route pour récupérer l'id\r\n    \t$params = $router-\u003egetRoute('articles.get')-\u003egetParameters();\r\n\r\n\t$a = ArticleRepository::find($params[0]);\r\n\r\n\t(new Controller())-\u003erenderView('Articles.show', 'layout', ['article'=\u003e$a]);\r\n\r\n}, 'articles.get');\r\n\r\n$router-\u003eget('/articles/author/:name', function() use($router) {\r\n    \t//Les paramètres de la route pour récupérer l'auteur\r\n    \t$params = $router-\u003egetRoute('articles.get.author')-\u003egetParameters();\r\n\r\n\t$a = ArticleRepository::findWhere(['auteur'], [$params[0]]);\r\n\r\n\t(new Controller())-\u003erenderView('Articles.show', 'layout', ['article(s)'=\u003e$a]);\r\n\r\n}, 'articles.get.author');\r\n\r\n$router-\u003epost('/articles', function() use($router) {\r\n    \t//Les paramètres et données de la requête\r\n    \t$params = $router-\u003egetRoute('articles.post')-\u003egetExtras();\r\n\r\n    \t$a = new Article($params);\r\n\r\n\t$saved = ArticleRepository::save($a);\r\n\r\n\t(new Controller())-\u003erenderView('Articles.save', 'layout', ['saved'=\u003e$saved]);\r\n\r\n}, 'articles.post');\r\n\r\n```\r\n\r\nLes méthodes ```find()```, ```findAll()```, ```save()``` permettent de manipuler une entité à travers son \u003cb\u003erepository\u003c/b\u003e correspondant, il y en a d'autres méthodes, référez vous à [gravity-framework](https://github.com/schery19/gravity-framework) pour avoir un idée plus claire sur leur utilisation.\r\n\r\n\r\n### Ressources\r\nIl est possible de récupérer les données selon une structure différente de celle de la base, et même les modifier partiellement lors du rendu.\r\n\r\nPour cela il faut créer une classe resource dérivée de ```Gravity\\Core\\App\\Resources\\AbstractResource``` adaptée à votre entité.\r\n\r\nPour notre exemple article, on pourrait le formater pour afficher rédacteur au lieu d'auteur, on pourrait aussi afficher seulement les 20 premiers caractères du contenu. pour cela on implémente la méthode ```toArray()``` en retournant un tableau renfermant votre nouvelle structure\r\n\r\nIllustration :\r\n```php\r\nuse Gravity\\Core\\App\\Resources\\AbstractResource;\r\n\r\nclass ArticleResource extends AbstractResource {\r\n\r\n    protected $entity = Article::class;\r\n\r\n    public function toArray() {\r\n        $data = $this-\u003eentity-\u003etoArray();\r\n\r\n        unset($data['auteur']);\r\n        \r\n        $data['rédacteur'] = $this-\u003eentity-\u003eauteur;\r\n\r\n        $data['contenu'] = substr($this-\u003eentity-\u003econtenu, 0, 20).'...';\r\n\r\n        return $data;\r\n    }\r\n\r\n}\r\n```\r\n\r\nVous pourriez aussi formater la date de publication selon vos besoins.\r\n\r\nA l'affichage vous utilisez l'instance de la classe resource créée pour rendre les données formatées\r\n\r\n```php\r\n// Article dont l'id est 5\r\n$article = ArticleRepository::find(5);\r\n\r\n$articleFormatted = (new ArticleResource())-\u003emake($article);\r\n\r\n(new Controller())-\u003erenderView('Articles.show', 'layout', ['article'=\u003e$articleFormatted]);\r\n```\r\n\r\n\u003cb\u003eAttention\u003c/b\u003e : Pour formatter un tableau d'entités, vous utilisez la méthode ```collection()``` au lieu de ```make()```\r\n\r\n\r\n## Licences\r\n\u003cb\u003eGRAVITY-CORE\u003c/b\u003e est publiée sous licence MIT, voir le fichier LICENSE.txt ou visiter [http://www.opensource.org/licenses/mit-license.php](http://www.opensource.org/licenses/mit-license.php) pour plus de détails\r\n\r\n\r\n## Contributions\r\nToutes les contributions sont les bienvenues en vue d'améliorer la librairie et le [framework](https://github.com/schery19/gravity-framework), selon les rêgles, respect et courtoisie\r\n\r\n\r\n## Extra \r\nN'hésitez pas à reporter vos problèmes dans la section [issues](https://github.com/schery19/gravity-core/issues), pour une meilleure communication et contribuer le plus possible à l'avancement du projet\r\n\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fschery19%2Fgravity-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fschery19%2Fgravity-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fschery19%2Fgravity-core/lists"}