{"id":15022996,"url":"https://github.com/inphinit/inphinit","last_synced_at":"2026-04-02T00:50:05.087Z","repository":{"id":56991884,"uuid":"59869822","full_name":"inphinit/inphinit","owner":"inphinit","description":"👽 PHP web application using Inphinit framework","archived":false,"fork":false,"pushed_at":"2024-12-12T19:30:51.000Z","size":332,"stargazers_count":40,"open_issues_count":0,"forks_count":8,"subscribers_count":7,"default_branch":"2.x","last_synced_at":"2025-04-09T19:19:53.216Z","etag":null,"topics":["apache","api","composer","css-selectors","dom","framework","iis","iis-express","inphinit","nginx","performance","php","php5","php7","php8","rest-api","router","routing"],"latest_commit_sha":null,"homepage":"http://inphinit.github.io","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/inphinit.png","metadata":{"files":{"readme":"README-PT.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":"2016-05-28T00:20:24.000Z","updated_at":"2024-12-12T19:30:55.000Z","dependencies_parsed_at":"2022-08-21T12:20:46.838Z","dependency_job_id":"53e72462-7880-4c03-b39c-1916c7edd8e5","html_url":"https://github.com/inphinit/inphinit","commit_stats":{"total_commits":75,"total_committers":2,"mean_commits":37.5,"dds":"0.013333333333333308","last_synced_commit":"71d73ce49d5c7ce6490e45fbb9032d5fd458b230"},"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inphinit%2Finphinit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inphinit%2Finphinit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inphinit%2Finphinit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inphinit%2Finphinit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inphinit","download_url":"https://codeload.github.com/inphinit/inphinit/tar.gz/refs/heads/2.x","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248094991,"owners_count":21046770,"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":["apache","api","composer","css-selectors","dom","framework","iis","iis-express","inphinit","nginx","performance","php","php5","php7","php8","rest-api","router","routing"],"created_at":"2024-09-24T19:58:37.242Z","updated_at":"2026-04-02T00:50:05.080Z","avatar_url":"https://github.com/inphinit.png","language":"PHP","readme":"\u003cp align=\"center\"\u003e\n\u003ca href=\"https://packagist.org/packages/inphinit/inphinit\"\u003e\u003cimg src=\"https://img.shields.io/packagist/dt/inphinit/inphinit\" alt=\"Total Downloads\"\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/inphinit/inphinit\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/inphinit/inphinit\" alt=\"Última versão estável\"\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/inphinit/inphinit\"\u003e\u003cimg src=\"https://img.shields.io/packagist/l/inphinit/inphinit\" alt=\"Licença\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n- [Instalação](#instalação)\n- [Testes](#testes)\n- [NGINX](#nginx)\n- [Estrutura de pastas](#estrutura-de-pastas)\n- [Criando rotas](#criando-rotas)\n- [Agrupando rotas](#agrupando-rotas)\n- [Padrões de rotas e URLs](#padrões-de-rotas-e-urls)\n- [Documentação](#documentação)\n\n## Instalação\n\nRequisitos:\n\n1. Recomendado: *PHP 8* (consulte as versões atualmente suportadas em https://www.php.net/supported-versions.php)\n   - Mínimo: *PHP 5.4* (a compatibilidade retroativa é mantida para ambientes com limitações de upgrade)\n   - Se precisar de um servidor completo no Windows ou macOS, considere usar WampServer, XAMPP, Laragon, EasyPHP ou AMPPS.\n2. (Opcional) Extensão PHP Intl, necessária para utilizar a classe `Inphinit\\Utility\\Strings`.\n3. (Opcional) Extensão PHP COM ou cURL, necessárias para utilizar a classe `Inphinit\\Filesystem\\Size`.\n\nApós instalar o PHP, você pode instalar o Inphinit via Composer ou Git.\n\nPara instalar via Composer, execute o comando (veja mais detalhes em https://getcomposer.org/doc/03-cli.md):\n\n```bash\nphp composer.phar create-project inphinit/inphinit my-application\n```\n\nSe o Composer estiver instalado globalmente, use:\n\n```bash\ncomposer create-project inphinit/inphinit my-application\n```\n\nPara instalar via Git:\n\n```bash\ngit clone --recurse-submodules https://github.com/inphinit/inphinit.git my-application\ncd my-application\n```\n\n## Testes\n\nApós navegar até o diretório do seu projeto, execute o seguinte comando para iniciar o [servidor web integrado do PHP](https://www.php.net/manual/en/features.commandline.webserver.php):\n\n```bash\nphp -S localhost:5000 -t public index.php\n```\n\nEm seguida, acesse no seu navegador em `http://localhost:5000/`.\n\n## NGINX\n\nSe você deseja usar o NGINX, pode configurar seu `nginx.conf` da seguinte forma:\n\n```none\nlocation / {\n    root /home/foo/bar/my-application;\n\n    # Redireciona erros de página para o sistema de rotas\n    error_page 403 /index.php/RESERVED.INPHINIT-403.html;\n    error_page 500 /index.php/RESERVED.INPHINIT-500.html;\n\n    try_files /public$uri /index.php?$query_string;\n\n    location = / {\n        try_files $uri /index.php?$query_string;\n    }\n\n    location ~ /\\. {\n        try_files /index.php$uri /index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        # Substitua pelo seu endereço FPM ou FastCGI\n        fastcgi_pass 127.0.0.1:9000;\n\n        fastcgi_index index.php;\n        include fastcgi_params;\n\n        set $teeny_suffix \"\";\n\n        if ($uri != \"/index.php\") {\n            set $teeny_suffix \"/public\";\n        }\n\n        fastcgi_param SCRIPT_FILENAME $realpath_root$teeny_suffix$fastcgi_script_name;\n    }\n}\n```\n\n\u003e **Nota:** Para PHP-FPM (FastCGI Process Manager), use `fastcgi_pass unix:/var/run/php/php\u003cversion\u003e-fpm.sock` (substitua `\u003cversion\u003e` pela versão do seu PHP).\n\n## Estrutura de Pastas\n\n```bash\n├───.htaccess                  # Arquivo de configuração do Apache para lidar com requisições e roteamento\n├───index.php                  # Ponto de entrada principal; modifique constantes apenas se necessário\n├───server                     # Atalho para iniciar o servidor built-in do PHP no Linux ou macOS\n├───server.bat                 # Atalho para iniciar o servidor built-in do PHP no Windows\n├───web.config                 # Arquivo de configuração do IIS para reescrita de URL e roteamento\n├───public/                    # Contém assets estáticos e scripts PHP standalone fora do fluxo principal\n│   └───.htaccess              # Configuração do Apache para servir arquivos estáticos ou scripts standalone\n└───system/                    # Contém todo o código-fonte e configuração da aplicação\n    ├───dev.php                # Ponto de entrada para o modo de desenvolvimento; executa antes de main.php\n    ├───errors.php             # Lida com páginas de erro (ex: 404, 405) e pode renderizar arquivos estáticos ou views\n    ├───main.php               # Arquivo principal de roteamento e definição de eventos para todos os ambientes\n    ├───boot/                  # Configurações de Autoload e inicialização (similar ao autoload do Composer)\n    │   ├───importpackages.php # Define imports adicionais de pacotes para o autoloader\n    │   └───namespaces.php     # Mapeia namespaces para diretórios para o autoloader de classes\n    ├───configs/               # Contém arquivos de configuração; evite commitar dados sensíveis ao controle de versão\n    │   ├───app.php            # Configuração da aplicação; modifique os valores existentes conforme necessário\n    │   └───debug.php          # Configuração de debug; modifique os valores existentes conforme necessário\n    ├───Controllers/           # Contém classes Controller referenciadas nas definições de rota\n    ├───storage/               # Usado para arquivos temporários, logs ou dados de cache\n    ├───vendor/                # Dependências de terceiros e o núcleo do framework\n    └───views/                 # Contém templates e arquivos de view\n```\n\nNo modo de desenvolvimento, o script `system/dev.php` é sempre executado primeiro, seguido por `system/main.php`. Se ocorrer um erro (ex: 404 ou 405), o último script a ser executado será `system/errors.php`.\n\n## Criando Rotas\n\nPara criar uma nova rota, edite o arquivo `system/main.php`. Se você quiser que a rota esteja disponível apenas no modo de desenvolvimento, edite o arquivo `system/dev.php`.\n\nO sistema de roteamento suporta *controllers*, [*callables*](https://www.php.net/manual/en/language.types.callable.php) e [*funções anônimas*](https://www.php.net/manual/en/functions.anonymous.php). Por exemplo:\n\n```php\n\u003c?php\n\n// Função anônima\n$app-\u003eaction('GET', '/closure', function () {\n    return 'Olá \"closure\"!';\n});\n\nfunction foobar() {\n    return 'Olá \"function\"!';\n}\n\n// Função callable\n$app-\u003eaction('GET', '/function', 'foobar');\n\n// Método estático de classe callable — o autoloader inclui o arquivo da classe automaticamente\n$app-\u003eaction('GET', '/class-static-method', ['MyNameSpace\\Foo\\Bar', 'hello']);\n\n// Método de instância de classe callable\n$foo = new Sample;\n$app-\u003eaction('GET', '/class-method', [$foo, 'hello']);\n\n// Você não precisa incluir o prefixo do namespace Controllers — o framework o adiciona automaticamente\n$app-\u003eaction('GET', '/controller', 'Boo\\Bar::xyz');\n\n/**\n * Controller do arquivo `./system/Controllers/Boo/Bar.php`:\n *\n * \u003c?php\n * namespace Controllers\\Boo;\n *\n * class Bar {\n *    public function xyz() {\n *        ...\n *    }\n * }\n */\n```\n\n## Agrupando rotas\n\nO sistema de agrupamento de rotas é simples e flexível. Ele é baseado na URL ou caminho completo e suporta o *wildcard* `*`, bem como os mesmos padrões disponíveis para rotas.\n\n```php\n\u003c?php\n\n/*\n * As rotas só serão adicionadas se o caminho começar com /blog/\n *\n * Exemplos:\n *\n * http://localhost:5000/blog/\n * http://localhost:5000/blog/post\n * http://localhost:5000/blog/search\n */\n$app-\u003escope('/blog/', function ($app, $params) {\n    $app-\u003eaction('GET', '/', function () { ... });\n    $app-\u003eaction('POST', '/post', function () { ... });\n    $app-\u003eaction('GET', '/search', function () { ... });\n});\n\n// As rotas só serão adicionadas se o acesso for via HTTPS\n$app-\u003escope('https://*', function ($app, $params) {\n    ...\n});\n\n// As rotas só serão adicionadas se o acesso for via HTTP\n$app-\u003escope('http://*', function ($app, $params) {\n    ...\n});\n\n// As rotas só serão adicionadas quando o host da requisição for mysite2.org\n$app-\u003escope('*://mysite2.org/', function ($app, $params) {\n    ...\n});\n\n// As rotas só serão adicionadas se você estiver acessando um subdomínio de main.org, ex: site1.main.org\n$app-\u003escope('*://*.main.org/', function ($app, $params) {\n    ...\n});\n\n// Usando um padrão para capturar o subdomínio:\n$app-\u003escope('*://\u003csubdomain\u003e.main.org/', function ($app, $params) {\n    $subdomain = $params['subdomain'];\n    ...\n});\n\n// Usando um padrão para capturar parâmetros do caminho:\n$app-\u003escope('*://*/users/\u003cid:num\u003e/\u003cuser\u003e', function ($app, $params) {\n    $id = $params['id'];\n    $username = $params['user'];\n    ...\n});\n```\n\nVeja mais exemplos no arquivo `system/dev.php`.\n\n## Padrões de rotas e URLs\n\n| Tipo      | Exemplo                                                | Descrição                                                                                             |\n| --------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |\n| `alnum`   | `$app-\u003eaction('GET', '/baz/\u003cvideo:alnum\u003e', ...);`      | Aceita apenas parâmetros alfanuméricos; `$params` retorna `['video' =\u003e ...]`                          |\n| `alpha`   | `$app-\u003eaction('GET', '/foo/bar/\u003cname:alpha\u003e', ...);`   | Aceita apenas parâmetros alfabéticos; `$params` retorna `['name' =\u003e ...]`                             |\n| `decimal` | `$app-\u003eaction('GET', '/baz/\u003cprice:decimal\u003e', ...);`    | Aceita apenas parâmetros numéricos decimais; `$params` retorna `['price' =\u003e ...]`                     |\n| `num`     | `$app-\u003eaction('GET', '/foo/\u003cid:num\u003e', ...);`           | Aceita apenas parâmetros de número inteiro; `$params` retorna `['id' =\u003e ...]`                         |\n| `nospace` | `$app-\u003eaction('GET', '/foo/\u003cnospace:nospace\u003e', ...);`  | Aceita qualquer caractere exceto espaços, como `%20` ou tabs (veja o padrão regex `\\S`)               |\n| `uuid`    | `$app-\u003eaction('GET', '/bar/\u003cbarcode:uuid\u003e', ...);`     | Aceita parâmetros no formato UUID; `$params` retorna `['barcode' =\u003e ...]`                             |\n| `version` | `$app-\u003eaction('GET', '/baz/\u003capi:version\u003e', ...);`      | Aceita parâmetros no formato *Semantic Versioning 2.0.0 (SemVer)*; `$params` retorna `['api' =\u003e ...]` |\n\nVocê pode adicionar ou modificar padrões existentes usando o método `$app-\u003esetPattern(name, regex)`. Exemplo:\n\n```php\n\u003c?php\nuse Inphinit\\Viewing\\View;\n\n$app-\u003eaction('GET', '/about/\u003clang:locale\u003e', function ($params) {\n    $lang = $params['lang'];\n    ...\n});\n\n$app-\u003eaction('GET', '/product/\u003cid:customid\u003e', function ($params) {\n    $id = $params['id'];\n    ...\n});\n\n$app-\u003esetPattern('locale', '[a-z]{1,8}(\\-[A-Z\\d]{1,8})?'); // exemplos: en, en-US, en-GB, pt-BR, pt\n$app-\u003esetPattern('customid', '[A-Z]\\d+'); // exemplos: A0001, B002, J007\n```\n\nModificando um padrão existente:\n\n```php\n\u003c?php\n\n// Substitui SemVer por \u003cmajor\u003e.\u003cminor\u003e.\u003crevision\u003e.\u003cbuild\u003e\n$app-\u003esetPattern('version', '\\d+\\.\\d+\\.\\d+\\.\\d+');\n\n// Substitui SemVer por \u003cmajor\u003e.\u003cminor\u003e (útil para APIs web)\n$app-\u003esetPattern('version', '\\d+\\.\\d+');\n```\n\n## Documentação\n\n- Inglês: https://inphinit.github.io/en/docs/\n- Português: (Em breve)\n- Referência da API: https://inphinit.github.io/api/\n\nA documentação é mantida em um [repositório GitHub](https://github.com/inphinit/inphinit.github.io) separado.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finphinit%2Finphinit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finphinit%2Finphinit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finphinit%2Finphinit/lists"}