{"id":15028667,"url":"https://github.com/s-damian/damian-php","last_synced_at":"2025-10-24T22:15:42.229Z","repository":{"id":64047047,"uuid":"523996158","full_name":"s-damian/damian-php","owner":"s-damian","description":"PHP 8.4 Framework - Damian PHP - Skeleton","archived":false,"fork":false,"pushed_at":"2024-11-23T12:50:00.000Z","size":119,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-23T22:25:14.528Z","etag":null,"topics":["framework","framework-php","open-source","open-source-framework","open-source-project","php","php8","php84"],"latest_commit_sha":null,"homepage":"","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/s-damian.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2022-08-12T07:32:17.000Z","updated_at":"2024-11-23T12:50:04.000Z","dependencies_parsed_at":"2024-03-03T09:26:55.931Z","dependency_job_id":"34ae4ce2-be0a-4b07-a24c-744c9298b3f1","html_url":"https://github.com/s-damian/damian-php","commit_stats":{"total_commits":52,"total_committers":2,"mean_commits":26.0,"dds":0.2692307692307693,"last_synced_commit":"8384e0d87cb4c027e7b944ca0c33387b073b534b"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-damian%2Fdamian-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-damian%2Fdamian-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-damian%2Fdamian-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s-damian%2Fdamian-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/s-damian","download_url":"https://codeload.github.com/s-damian/damian-php/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248107305,"owners_count":21048897,"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","framework-php","open-source","open-source-framework","open-source-project","php","php8","php84"],"created_at":"2024-09-24T20:08:50.766Z","updated_at":"2025-10-24T22:15:42.175Z","avatar_url":"https://github.com/s-damian.png","language":"PHP","readme":"\u003cp align=\"center\"\u003e\r\n\u003ca href=\"https://github.com/s-damian/damian-php\"\u003e\r\n\u003cimg src=\"https://raw.githubusercontent.com/s-damian/medias/main/damian-php-logo.png\" width=\"400\"\u003e\r\n\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cp align=\"center\"\u003e\r\n\u003ca href=\"https://github.com/s-damian/damian-php/actions/workflows/tests.yml\"\u003e\u003cimg src=\"https://github.com/s-damian/damian-php/actions/workflows/tests.yml/badge.svg\" alt=\"Tests\"\u003e\u003c/a\u003e\r\n\u003ca href=\"https://github.com/s-damian/damian-php/actions/workflows/static-analysis.yml\"\u003e\u003cimg src=\"https://github.com/s-damian/damian-php/actions/workflows/static-analysis.yml/badge.svg\" alt=\"Static analysis\"\u003e\u003c/a\u003e\r\n\u003ca href=\"https://packagist.org/packages/s-damian/damian-php\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/s-damian/damian-php\" alt=\"Latest Stable Version\"\u003e\u003c/a\u003e\r\n\u003ca href=\"https://packagist.org/packages/s-damian/damian-php\"\u003e\u003cimg src=\"https://img.shields.io/packagist/l/s-damian/damian-php\" alt=\"License\"\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\r\n# Damian PHP Framework - Skeleton\r\n\r\n\u003e A powerful PHP Framework in **PHP 8.4** - Beautiful code \u0026 Elegant syntax\r\n\r\n\u003e SGBDR: Compatible with **MySQL** / **MariaDB** / **PostgreSQL**\r\n\r\nThis **Open Source Framework** is developed by [Stephen Damian](https://github.com/s-damian)\r\n\r\nHere you have the source codes of the `skeleton`.\r\n\r\n\r\n### Kernel source code\r\n\r\nThe `kernel` source codes for this Framework are in this package:\r\n\r\n[Damian PHP Framework - Kernel - [damian-php-fw]](https://github.com/s-damian/damian-php-fw)\r\n\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* PHP `8.2` || `8.3` || `8.4`\r\n\r\n### Create a new project\r\n\r\n* You can create a new project via the `composer create-project` command:\r\n\r\n```\r\ncomposer create-project s-damian/damian-php example-app-name\r\n```\r\n\r\n### Configuration\r\n\r\n* Create your `.env` file:\r\n\r\n```\r\ncd /your-path/example-app-name\r\n```\r\n\r\n```\r\ncp .env.example .env\r\n```\r\n\r\n* You have to configure the `.env` file.\r\n\r\n### Configuration - HTTP Server\r\n\r\n* You have to configure your web server (Linux / Nginx or Apache / MySQL or PostgreSQL / PHP).\r\n\r\nYou have an example Nginx Vhost configuration in `docs/nginx/vhost-example.conf` file.\r\n\r\n\r\n### After configuring your HTTP server (Nginx), you can run these demo URLs\r\n\r\n* http://www.your-domain.com\r\n* http://www.your-domain.com/contact\r\n* http://www.your-domain.com/blog\r\n* http://www.your-domain.com/blog/slug-1\r\n* http://www.your-domain.com/callable-example\r\n* http://www.your-domain.com/sitemap\r\n\r\n\r\n## Documentation\r\n\r\n* The documentation for this Framework is in `docs/DamianPhp` folder.\r\n\r\n\r\n## Syntax examples\r\n\r\n### Routing\r\n\r\nAn example of a route listing:\r\n\r\n```php\r\n\u003c?php\r\n\r\nRouter::group(['namespace' =\u003e 'Front\\\\', 'prefix' =\u003e 'website'], function () {\r\n    Router::post(\r\n        '/contact',\r\n        'Contact@sendMail',\r\n        ['name' =\u003e 'contact_send-mail']\r\n    );\r\n    Router::group(['prefix' =\u003e '/blog'], function () {\r\n        Router::get(\r\n            '',\r\n            'Article@index',\r\n            ['name' =\u003e 'article_index']\r\n        );\r\n        Router::get(\r\n            '/{slug}',\r\n            'Article@show',\r\n            ['name' =\u003e 'article_show']\r\n        );\r\n    });\r\n});\r\n```\r\n\r\nRetrieve a URL with the name of a route:\r\n\r\n```php\r\n\r\n\u003c?php echo route('article_show', ['slug' =\u003e $article-\u003eslug]); ?\u003e\r\n```\r\n\r\n### ORM (compatible with MySQL / MariaDB and PostgreSQL)\r\n\r\n#### Active Record Pattern\r\n\r\nExample to insert an article (using the `setters` magic methods):\r\n\r\n```php\r\n\u003c?php\r\n\r\n$article = new Article();\r\n$article-\u003esetTitle('Article 1');\r\n$article-\u003esetDescription('Description');\r\n$article-\u003esetContent('Content');\r\n$article-\u003esetSlug('slug-1');\r\n$article-\u003esave();\r\n```\r\n\r\nExample to update an article (using the `fill` magic method):\r\n\r\n```php\r\n\u003c?php\r\n\r\n$article = Article::load()-\u003efindOrFail($id);\r\n$article-\u003efill(Request::getPost()-\u003eall());\r\n$article-\u003esave();\r\n```\r\n\r\n#### Fetch multiple rows\r\n\r\nExample using the `when` magic method:\r\n\r\n```php\r\n\u003c?php\r\n\r\n$articles = Article::load()\r\n    -\u003eselect('title, description, content')\r\n    -\u003ewhere('slug', '!=', 'article-2')\r\n    -\u003ewhen((int) Input::get('status') === 1, function ($query) {\r\n        return $query-\u003ewhere('status', '=', 1);\r\n    })\r\n    -\u003efindAll();\r\n```\r\n\r\n#### ORM with Pagination\r\n\r\nTo paginate an item listing:\r\n\r\n```php\r\n\u003c?php\r\n\r\n$article = new Article();\r\n\r\n$articles = $article-\u003ewhere('status', '=', 1)-\u003epaginate(20);\r\n\r\n$pagination = $article-\u003egetPagination();\r\n\r\nforeach ($articles as $article) {\r\n    echo $article-\u003etitle;\r\n}\r\n\r\necho $pagination-\u003erender();\r\necho $pagination-\u003eperPageForm();\r\n```\r\n\r\n### Pagination\r\n\r\n```php\r\n\u003c?php\r\n\r\n$pagination = new Pagination();\r\n\r\n$pagination-\u003epaginate($countElements);\r\n\r\n$limit = $pagination-\u003egetLimit();\r\n$offset = $pagination-\u003egetOffset();\r\n\r\n// Here your list of items with a loop.\r\n\r\necho $pagination-\u003erender();\r\necho $pagination-\u003eperPageForm();\r\n```\r\n\r\n### Validation\r\n\r\nValidation example (you can do method injection):\r\n\r\n```php\r\n\u003c?php\r\n\r\npublic function update(Validator $validator, int $id)\r\n{\r\n    $validator-\u003erules([ // Add your rules in the array.\r\n        'title' =\u003e ['max' =\u003e 190, 'required' =\u003e true],\r\n        'description' =\u003e ['max' =\u003e 190, 'required' =\u003e true],\r\n        'content' =\u003e ['required' =\u003e true],\r\n    ]);\r\n\r\n    if ($validator-\u003eisValid()) {\r\n        // Success\r\n    } else {\r\n        // Error\r\n        $validator-\u003egetErrorsHtml();\r\n    }\r\n}\r\n```\r\n\r\nYou can add custom validation rules. Example:\r\n\r\n```php\r\n\u003c?php\r\n\r\nValidator::extend('strictly_equal', function ($input_name, $input_value, $parameters) {\r\n    return (string) $input_value === (string) $parameters;\r\n});\r\n```\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs-damian%2Fdamian-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fs-damian%2Fdamian-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs-damian%2Fdamian-php/lists"}