https://github.com/inphinit/inphinit
👽 PHP web application using Inphinit framework
https://github.com/inphinit/inphinit
apache api composer css-selectors dom framework iis iis-express inphinit nginx performance php php5 php7 php8 rest-api router routing
Last synced: 4 days ago
JSON representation
👽 PHP web application using Inphinit framework
- Host: GitHub
- URL: https://github.com/inphinit/inphinit
- Owner: inphinit
- License: mit
- Created: 2016-05-28T00:20:24.000Z (almost 10 years ago)
- Default Branch: 2.x
- Last Pushed: 2024-12-12T19:30:51.000Z (over 1 year ago)
- Last Synced: 2025-04-09T19:19:53.216Z (12 months ago)
- Topics: apache, api, composer, css-selectors, dom, framework, iis, iis-express, inphinit, nginx, performance, php, php5, php7, php8, rest-api, router, routing
- Language: PHP
- Homepage: http://inphinit.github.io
- Size: 324 KB
- Stars: 40
- Watchers: 7
- Forks: 8
- Open Issues: 0
-
Metadata Files:
- Readme: README-PT.md
- License: LICENSE
Awesome Lists containing this project
README
- [Instalação](#instalação)
- [Testes](#testes)
- [NGINX](#nginx)
- [Estrutura de pastas](#estrutura-de-pastas)
- [Criando rotas](#criando-rotas)
- [Agrupando rotas](#agrupando-rotas)
- [Padrões de rotas e URLs](#padrões-de-rotas-e-urls)
- [Documentação](#documentação)
## Instalação
Requisitos:
1. Recomendado: *PHP 8* (consulte as versões atualmente suportadas em https://www.php.net/supported-versions.php)
- MÃnimo: *PHP 5.4* (a compatibilidade retroativa é mantida para ambientes com limitações de upgrade)
- Se precisar de um servidor completo no Windows ou macOS, considere usar WampServer, XAMPP, Laragon, EasyPHP ou AMPPS.
2. (Opcional) Extensão PHP Intl, necessária para utilizar a classe `Inphinit\Utility\Strings`.
3. (Opcional) Extensão PHP COM ou cURL, necessárias para utilizar a classe `Inphinit\Filesystem\Size`.
Após instalar o PHP, você pode instalar o Inphinit via Composer ou Git.
Para instalar via Composer, execute o comando (veja mais detalhes em https://getcomposer.org/doc/03-cli.md):
```bash
php composer.phar create-project inphinit/inphinit my-application
```
Se o Composer estiver instalado globalmente, use:
```bash
composer create-project inphinit/inphinit my-application
```
Para instalar via Git:
```bash
git clone --recurse-submodules https://github.com/inphinit/inphinit.git my-application
cd my-application
```
## Testes
Apó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):
```bash
php -S localhost:5000 -t public index.php
```
Em seguida, acesse no seu navegador em `http://localhost:5000/`.
## NGINX
Se você deseja usar o NGINX, pode configurar seu `nginx.conf` da seguinte forma:
```none
location / {
root /home/foo/bar/my-application;
# Redireciona erros de página para o sistema de rotas
error_page 403 /index.php/RESERVED.INPHINIT-403.html;
error_page 500 /index.php/RESERVED.INPHINIT-500.html;
try_files /public$uri /index.php?$query_string;
location = / {
try_files $uri /index.php?$query_string;
}
location ~ /\. {
try_files /index.php$uri /index.php?$query_string;
}
location ~ \.php$ {
# Substitua pelo seu endereço FPM ou FastCGI
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
set $teeny_suffix "";
if ($uri != "/index.php") {
set $teeny_suffix "/public";
}
fastcgi_param SCRIPT_FILENAME $realpath_root$teeny_suffix$fastcgi_script_name;
}
}
```
> **Nota:** Para PHP-FPM (FastCGI Process Manager), use `fastcgi_pass unix:/var/run/php/php-fpm.sock` (substitua `` pela versão do seu PHP).
## Estrutura de Pastas
```bash
├───.htaccess # Arquivo de configuração do Apache para lidar com requisições e roteamento
├───index.php # Ponto de entrada principal; modifique constantes apenas se necessário
├───server # Atalho para iniciar o servidor built-in do PHP no Linux ou macOS
├───server.bat # Atalho para iniciar o servidor built-in do PHP no Windows
├───web.config # Arquivo de configuração do IIS para reescrita de URL e roteamento
├───public/ # Contém assets estáticos e scripts PHP standalone fora do fluxo principal
│ └───.htaccess # Configuração do Apache para servir arquivos estáticos ou scripts standalone
└───system/ # Contém todo o código-fonte e configuração da aplicação
├───dev.php # Ponto de entrada para o modo de desenvolvimento; executa antes de main.php
├───errors.php # Lida com páginas de erro (ex: 404, 405) e pode renderizar arquivos estáticos ou views
├───main.php # Arquivo principal de roteamento e definição de eventos para todos os ambientes
├───boot/ # Configurações de Autoload e inicialização (similar ao autoload do Composer)
│ ├───importpackages.php # Define imports adicionais de pacotes para o autoloader
│ └───namespaces.php # Mapeia namespaces para diretórios para o autoloader de classes
├───configs/ # Contém arquivos de configuração; evite commitar dados sensÃveis ao controle de versão
│ ├───app.php # Configuração da aplicação; modifique os valores existentes conforme necessário
│ └───debug.php # Configuração de debug; modifique os valores existentes conforme necessário
├───Controllers/ # Contém classes Controller referenciadas nas definições de rota
├───storage/ # Usado para arquivos temporários, logs ou dados de cache
├───vendor/ # Dependências de terceiros e o núcleo do framework
└───views/ # Contém templates e arquivos de view
```
No 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`.
## Criando Rotas
Para 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`.
O 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:
```php
action('GET', '/closure', function () {
return 'Olá "closure"!';
});
function foobar() {
return 'Olá "function"!';
}
// Função callable
$app->action('GET', '/function', 'foobar');
// Método estático de classe callable — o autoloader inclui o arquivo da classe automaticamente
$app->action('GET', '/class-static-method', ['MyNameSpace\Foo\Bar', 'hello']);
// Método de instância de classe callable
$foo = new Sample;
$app->action('GET', '/class-method', [$foo, 'hello']);
// Você não precisa incluir o prefixo do namespace Controllers — o framework o adiciona automaticamente
$app->action('GET', '/controller', 'Boo\Bar::xyz');
/**
* Controller do arquivo `./system/Controllers/Boo/Bar.php`:
*
* scope('/blog/', function ($app, $params) {
$app->action('GET', '/', function () { ... });
$app->action('POST', '/post', function () { ... });
$app->action('GET', '/search', function () { ... });
});
// As rotas só serão adicionadas se o acesso for via HTTPS
$app->scope('https://*', function ($app, $params) {
...
});
// As rotas só serão adicionadas se o acesso for via HTTP
$app->scope('http://*', function ($app, $params) {
...
});
// As rotas só serão adicionadas quando o host da requisição for mysite2.org
$app->scope('*://mysite2.org/', function ($app, $params) {
...
});
// As rotas só serão adicionadas se você estiver acessando um subdomÃnio de main.org, ex: site1.main.org
$app->scope('*://*.main.org/', function ($app, $params) {
...
});
// Usando um padrão para capturar o subdomÃnio:
$app->scope('*://.main.org/', function ($app, $params) {
$subdomain = $params['subdomain'];
...
});
// Usando um padrão para capturar parâmetros do caminho:
$app->scope('*://*/users//', function ($app, $params) {
$id = $params['id'];
$username = $params['user'];
...
});
```
Veja mais exemplos no arquivo `system/dev.php`.
## Padrões de rotas e URLs
| Tipo | Exemplo | Descrição |
| --------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
| `alnum` | `$app->action('GET', '/baz/', ...);` | Aceita apenas parâmetros alfanuméricos; `$params` retorna `['video' => ...]` |
| `alpha` | `$app->action('GET', '/foo/bar/', ...);` | Aceita apenas parâmetros alfabéticos; `$params` retorna `['name' => ...]` |
| `decimal` | `$app->action('GET', '/baz/', ...);` | Aceita apenas parâmetros numéricos decimais; `$params` retorna `['price' => ...]` |
| `num` | `$app->action('GET', '/foo/', ...);` | Aceita apenas parâmetros de número inteiro; `$params` retorna `['id' => ...]` |
| `nospace` | `$app->action('GET', '/foo/', ...);` | Aceita qualquer caractere exceto espaços, como `%20` ou tabs (veja o padrão regex `\S`) |
| `uuid` | `$app->action('GET', '/bar/', ...);` | Aceita parâmetros no formato UUID; `$params` retorna `['barcode' => ...]` |
| `version` | `$app->action('GET', '/baz/', ...);` | Aceita parâmetros no formato *Semantic Versioning 2.0.0 (SemVer)*; `$params` retorna `['api' => ...]` |
Você pode adicionar ou modificar padrões existentes usando o método `$app->setPattern(name, regex)`. Exemplo:
```php
action('GET', '/about/', function ($params) {
$lang = $params['lang'];
...
});
$app->action('GET', '/product/', function ($params) {
$id = $params['id'];
...
});
$app->setPattern('locale', '[a-z]{1,8}(\-[A-Z\d]{1,8})?'); // exemplos: en, en-US, en-GB, pt-BR, pt
$app->setPattern('customid', '[A-Z]\d+'); // exemplos: A0001, B002, J007
```
Modificando um padrão existente:
```php
...
$app->setPattern('version', '\d+\.\d+\.\d+\.\d+');
// Substitui SemVer por . (útil para APIs web)
$app->setPattern('version', '\d+\.\d+');
```
## Documentação
- Inglês: https://inphinit.github.io/en/docs/
- Português: (Em breve)
- Referência da API: https://inphinit.github.io/api/
A documentação é mantida em um [repositório GitHub](https://github.com/inphinit/inphinit.github.io) separado.