{"id":41844853,"url":"https://github.com/nmeri17/suphle","last_synced_at":"2026-01-25T09:43:36.035Z","repository":{"id":37589564,"uuid":"174805868","full_name":"nmeri17/suphle","owner":"nmeri17","description":"Opinionated PHP framework for building performant, extensible, and testable web applications","archived":false,"fork":false,"pushed_at":"2025-06-27T09:12:46.000Z","size":10264,"stargazers_count":35,"open_issues_count":14,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-11T13:07:16.935Z","etag":null,"topics":["php","php-framework"],"latest_commit_sha":null,"homepage":"http://angry-cray-9c191b.netlify.app/","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/nmeri17.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-10T10:02:32.000Z","updated_at":"2025-06-28T20:07:54.000Z","dependencies_parsed_at":"2024-05-29T19:04:05.954Z","dependency_job_id":"2792dc88-067f-402a-a5bb-a91dd2a0b2bc","html_url":"https://github.com/nmeri17/suphle","commit_stats":{"total_commits":501,"total_committers":4,"mean_commits":125.25,"dds":0.03992015968063867,"last_synced_commit":"e3f9c165b198f6072df0fcfe5ae38463c758824a"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/nmeri17/suphle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeri17%2Fsuphle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeri17%2Fsuphle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeri17%2Fsuphle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeri17%2Fsuphle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nmeri17","download_url":"https://codeload.github.com/nmeri17/suphle/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeri17%2Fsuphle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28750900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T09:00:19.176Z","status":"ssl_error","status_checked_at":"2026-01-25T09:00:04.131Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["php","php-framework"],"created_at":"2026-01-25T09:43:33.689Z","updated_at":"2026-01-25T09:43:36.028Z","avatar_url":"https://github.com/nmeri17.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://suphle.com\"\u003e\n        \u003cimg src=\"suphle-banner.png\" title=\"Suphle Banner\" alt=\"Suphle Banner\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\nSuphle Framework\n==========================\n\n## Introduction\n\nThis is the dev-facing project intended for contribution to Suphle itself. Its complete documentation is live at [netlify](https://angry-cray-9c191b.netlify.app).\n\nHigh-level details about what Suphle's capabilities are and why it was built have been migrated [here](https://dev.to/mmayboy_/introducing-suphle-the-tale-of-a-modern-php-framework-54i9) and [here](https://nmeri.hashnode.dev/a-synopsis-of-the-suphle-framework).\n\n## Testing\n\nTypically, from your system's web folder:\n\n```bash\n\ncomposer create-project nmeri/suphle AwesomeProject\n\ncd AwesomeProject\n\ncomposer test -- \"/path/to/AwesomeProject/tests\"\n```\n\nThe tests interact with the database, and would thus expect to find an active MySQL connection such as that gotten from running a WAMP equivalent. The server can be configured to use anything else, but for the purpose of this demo, we simply use MySQL.\n\nEach of the modules contain an `.env` with the following entries:\n\n```\nDATABASE_NAME = suphle\nDATABASE_USER = root\nDATABASE_PASS = \nDATABASE_HOST = localhost\n```\n\nThe database name is not important. All the command needs is for the credentials to match your local MySQL server, for migrations to be run.\n\nWhen executed as is, the tests will leave behind seeded data. For the database to self-destruct after it's done executing, we have to supply the configuration schema.\n\n```bash\n\ncomposer test -- \"/path/to/AwesomeProject/tests\" -c=/path/to/AwesomeProject/phpunit.xml\n```\n\n### Parallel testing\n\nThe commands shown earlier will execute the tests synchronously, which may not be the most optimized for your machine. Those using systems with multiple cores can take advantage of concurrent testing and instead execute tests in parallel.\n\n```bash\n\ncomposer parallel-test -- \"/path/to/AwesomeProject/tests\" --processes=5\n```\n\nAbove, we're enforcing 5 processes; however, when left blank, the runner will determine the optimum number of processes to use based on amount of cores available. Hence, this would equally work:\n\n```bash\n\ncomposer parallel-test -- \"/path/to/AwesomeProject/tests\"\n```\n\nAs with using this runner in development, note that it swallows all PHPUnit output. Thus, if the test invocation fails before completion, you may require a synchronous run to understand what went wrong.\n\n### Browser access\n\nAll interaction with the Framework should be conducted through tests and by extension, the command line. Those unaccustomed to reading the source code/tests or running tests, or those who are impatient and would prefer seeing something on the browser, should fire up the Roadrunner server:\n\n```bash\n\nphp suphle_cli server:start Modules --insane  --ignore_static_correct\n```\n\nThen, visit any of the routes available at:\n\n- http://localhost:8080/\n- http://localhost:8080/segment\n- http://localhost:8080/module-three/{any_integer}\n\nThey don't require any database connection and only demonstrate the relatively basic ability to route incoming requests to an attached action handler, taking higher-level constraints like modules and prefixing into account.\n\nIf you're window shopping, a *sort of* example application resides in the `tests/Mocks` folder. Emphasis is laid on \"sort of\" since `ModuleOne` there, is for testing majority of the framework's feature set and doesn't necessarily reflect what you'd expect from a real life Suphle module.\n\n## Contributing to the Starter project\n\nThe [Starter project](https://github.com/nmeri17/suphle-starter) is the user-facing arm intended for bootstrapping fresh Suphle projects. If you have cause to contribute to it, it's much more convenient to install both side by side, such that over the course of development, your updates to this core project will reflect on your Starter installation.\n\nThis project must be installed, first.\n\n```bash\n\ncomposer create-project nmeri/suphle\n\ngit clone https://github.com/nmeri17/suphle-starter.git\n```\n\nAfterwards, the Starter is to derive its parent project from your local installation. Navigate to the `composer.json` of the Starter project and add the following entry:\n\n```json\n\n\"repositories\": [\n\t{\n\t\t\"type\": \"path\",\n        \"url\": \"../suphle\"\n    }\n],\n\"minimum-stability\": \"dev\"\n```\n\nNow, instruct Composer to interpret the local installation as parent, using the install command:\n\n```bash\n\ncd suphle-starter\n\ncomposer install\n```\n\nNow, all is set! Checkout a new branch to implement your amazing feature. If you need to interact with the Roadrunner server as well, fetch its binary like so:\n\n```bash\n\ncd vendor/bin\n\nrr get-binary\n```\n\n## Where to start contributing\n\nThe recommended place to render assistance is the existing issues with the [`help-wanted`](https://github.com/nmeri17/suphle/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label, which would facilitate us reaching our initial goals. As I do value your time, it's advisable for new additions outside that list to first be discussed on a new issue, and commissioned for implementation. Please see the Contribution guide for more details.\n\n## Security\n\n[Security Policy](SECURITY.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnmeri17%2Fsuphle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnmeri17%2Fsuphle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnmeri17%2Fsuphle/lists"}