Uma boa opção para iniciar um projeto PHP, ele pode ser usado para o desenvolvimento da Web e da API. Leva apenas um minuto para iniciar um projeto. Tem desempenho super alto e uma experiência de desenvolvimento muito fácil de usar. Não há conceitos complicados, por isso tem a menor curva de aprendizado.
composer create-project amazephp/amazephp
Ou use o clone git:
git clone https://github.com/w3yyb/AmazePHP.git
cd AmazePHP
composer install
cd public/
php -S localhost:9080 server.php
Abra http: // localhost: 9080 no seu navegador.
Php 8.1+
O diretório de aplicativos contém o código principal do seu aplicativo. Em breve exploraremos este diretório com mais detalhes; No entanto, quase todas as classes do seu aplicativo estarão neste diretório.
O diretório de configuração, como o nome indica, contém todos os arquivos de configuração do seu aplicativo. Inclua o arquivo de configuração de rota.
O auxiliar funciona nele.
O diretório principal da estrutura, inclui alguma classe lib. E você pode colocar seu arquivo de classe nele.
O diretório público contém o arquivo index.php, que é o ponto de entrada para todas as solicitações que inseram seu aplicativo e configura a carga automática. Este diretório também abriga seus ativos, como imagens, JavaScript e CSS.
O diretório de cache contém seus arquivos de cache, inclua arquivos de log.
O diretório de modelos contém seus arquivos de modelo HTML.
config('app'); //will read config/app.php, app.php return an array.
config('app.url')// == config('app')['url'];
// Retrieve a default value if the configuration value does not exist...
$value = config('app.timezone', 'Asia/Seoul');
Para definir valores de configuração em tempo de execução, passe uma matriz para a função de configuração:
config(['app.timezone' => 'America/Chicago']);
$value = cache('key');
cache(['key' => 'value'], 10);// Expires after 10 seconds
O mecanismo de modelo usa BladeOne , um motor de modelo semelhante ao Laravel blade , clique aqui https://github.com/eftec/bladeone/wiki/bladeone-Manual View the Bladene Manual.
echo view('greeting', ['name' => 'James']);
O primeiro parâmetro é o nome do modelo, ou seja template/greeting.blade.php , e o segundo parâmetro é a variável passada para o modelo.
env('key');
env('key','default');
O segundo valor passado para a função Env é o "valor padrão". Esse valor será retornado se não houver variável de ambiente para a chave fornecida.
logger('some msg');//error log
logger('some msg','warning'); //warning log | support:emergency ,alert ,critical ,error ,warning ,notice ,info ,debug
Consulte Config/Route.php
[
['GET'],
'/',
[AppControllersIndex::class, 'index'],
'routename',
'middleware'=>[AppMiddlewarea2Middleware::class,AppMiddlewareb2Middleware::class],
],
A primeira linha é o método de solicitação HTTP, que suporta a cabeça, a obtenção, a publicação, o patch, o patch, a exclusão. ['POST,GET'] significa que o post e o get são suportados. ['*'] indica que todos os métodos HTTP são suportados.
A segunda linha representa o caminho, como /users/{uid}/posts/[{pid}][/] : nos aparelhos encaracolados, são parâmetros variáveis, parâmetros opcionais entre colchetes, ou seja, parâmetros que não passaram no URL, [/] para remover o slash de trilha.
A terceira linha indica retornos de chamada PHP, suporte para métodos de classe, métodos estáticos de classes, funções anônimas, funções etc.
A quarta linha é opcional e indica o nome da rota nomeada.
A chave do middleware é o middleware de roteamento de registro opcional.
A Alemavephp Request Class fornece uma maneira orientada a objetos de interagir com a solicitação HTTP atual que está sendo tratada pelo seu aplicativo, além de recuperar a entrada, cookies e arquivos que foram enviados com a solicitação.
$input = request()->all();
$name = request()->input('name');
$value = request()->cookie('name');
$value = request()->header('X-Header-Name');
$method = request()->method();
request()->host();
$url = request()->url();
$urlWithQueryString = request()->fullUrl();
$uri = request()->path();
if (request()->is('admin/*')) {
// ...
}
$input = request()->only(['username', 'password']);
$input = request()->except(['credit_card']);
$file = request()->file('upload');
if ($file && $file->isValid()) {
$file->move(PUBLIC_PATH.'/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'upload success']);
}
Mais uso consulte Alemavephp/src/request.php.
O Alemavephp não fornece uma classe de resposta por motivos de desempenho. Use Header () funcion e eco ou retorne à resposta em controladores ou middleware.
Em vez de definir todas as suas solicitações de lógica de manuseio como fechamento em seus arquivos de rota, você pode organizar esse comportamento usando classes "controlador". Os controladores podem agrupar a lógica de manuseio de solicitações relacionadas em uma única classe. Por exemplo, uma classe UserController pode lidar com todas as solicitações recebidas relacionadas aos usuários, incluindo mostrar, criar, atualizar e excluir usuários. Por padrão, os controladores são armazenados no diretório app/Controllers .
No Dir app/Controllers , você pode escrever alguns controladores, por exemplo:
<?php
namespace AppControllers;
class Index
{
public function index()
{
echo 'Hello AmazePHP!';
}
}
Depois de escrever uma classe e método do controlador, você pode definir uma rota para o método do controlador como assim:
[
['GET'],
'/',
[AppControllersIndex::class, 'index']
],
Quando uma solicitação recebida corresponde à rota especificada URI, o método de índice na classe App Controllers Index será chamado e os parâmetros da rota serão passados para o método.
O middleware, também conhecido como Middleware HTTP, é usado principalmente para modificar ou filtrar solicitações ou respostas HTTP. Todos esses middleware estão localizados no diretório App/Middleware.
O middleware é dividido antes do middleware e após o middleware. Antes do middleware é usado principalmente para modificar as solicitações HTTP. Depois que o middleware é usado principalmente para modificar as respostas HTTP.
Request->Before middleware->Actual action->After middleware->Response
A principal diferença entre antes do middleware e após o middleware é onde o código é executado. No diretório de app/middleware:
Crie como bmiddleware.php
<?php
namespace AppMiddleware;
use AmazePHPMiddlewareInterface;
class bMiddleware implements MiddlewareInterface {
public function process($object, Closure $next,...$params)
{
//Perform some logic here
return $next($object);
}
}
?>
Criar como amiddleware.php
<?php
namespace AppMiddleware;
use AmazePHPMiddlewareInterface;
class aMiddleware implements MiddlewareInterface {
public function process($object, Closure $next,...$params)
{
$response = $next($object);
//Perform some logic here
return $response;
}
}
?>
Em config/middleware.php, escreva o seguinte:
return [
AppMiddlewareaMiddleware::class,
AppMiddlewarebMiddleware::class,
];
Veja o roteamento.
A fachada fornece uma interface de chamada estática para as classes (dinâmicas) da biblioteca de classe principal da estrutura.
No App Controllers Index Controller:
<?php
namespace AppControllers;
use AmazePHPFacadeRequest;
class Index
{
public function index()
{
echo Request::url();//call Request.php url method statically. Same as calling Request->url().
}
}
Todas as fachadas do sistema são colocadas no diretório AlemaphP/SRC/fachada.
O contêiner é uma ferramenta poderosa para gerenciar dependências de classe e executar a injeção de dependência.
Por exemplo:
<?php
namespace AppControllers;
use AmazePHPRequest;
class Foo
{
public function bar(Request $request, $id)
{
echo $request->url();
}
}
?>
O método da barra depende da classe Solicitação. Você pode colocar a solicitação $ solicitação nos parâmetros da barra. Framework irá ligar para a classe de solicitação, para que você possa usar o método da classe de solicitação: por exemplo $request->url() .
Os cenários que apóiam o uso da injeção de dependência incluem (mas não estão limitados a):
$response= httpGet('http://httpbin.org/get');
$response= httpGet('http://httpbin.org/get',['headername'=>'headervalue']);
$response= httpHead('http://httpbin.org/get',['headername'=>'headervalue']);
$response= httpDelete('http://httpbin.org/delete',['headername'=>'headervalue']);
$response= httpPost('http://httpbin.org/post',['senddataname'=>'senddatavalue']);
$response= httpPut('http://httpbin.org/put',['senddataname'=>'senddatavalue']);
$response= httpPatch('http://httpbin.org/patch',['senddataname'=>'senddatavalue']);
$ Response é uma matriz que contém dados status_code, cabeçalho e corpo.
Os parâmetros da função são os seguintes:
httpGet($url,$header = [])
httpHead($url,$header = [])
httpDelete($url,$header = [])
httpPost($url, $data, $isJson = true,$method='POST',$header = [])
httpPut($url, $data, $isJson = true,$method='PUT',$header = [])
httpPatch($url, $data, $isJson = true,$method='PATCH',$header = [])
A sessão é fechada por padrão, se você deseja abrir, altere a session_enable no arquivo .env para true.
session(["name" => "value"]);
$value = session('name')
$value = request()->cookie('name');
cookie('name','value',86400); // 86400 seconds
O componente do banco de dados está usando PdoOne , um wrapper de objetos de acesso ao banco de dados para PHP e PDO. Clique em https://github.com/eftec/pdoone para ver como usá -lo.
Abaixo está um exemplo de como usá -lo de maneira simples.
Selecione:
$results = db()->select("*")->from('users')->where("name like '%test%'")->toList();
print_r($results);
Use SQL bruto:
$sql='select * from users where id=1';
$pdoStatement=db()->runRawQuery($sql,[],false); // [] are the parameters
print_r($pdoStatement->fetchAll());
inserir:
db()->insert("users"
,['name','email','password']
,['kevin','[email protected]','123456']);
atualizar:
db()->update("users"
,['name'=>'Captain-Crunch','email'=>'[email protected]'] // set
,['id'=>6]); // where
excluir:
db()->delete("users"
,['id'=>6]); // where
// Get the current URL without the query string...
echo url()->current();
// Get the current URL including the query string...
echo url()->full();
// Get the full URL for the previous request...
echo url()->previous();
echo url("/posts/{$post->id}"); // http://example.com/posts/1
[
['GET'],
'/hello/{id}/foo/{sid}',
[new AppFoo, 'bar'],
'nameroute1'//Named Route
],
echo route('nameroute1', ['id' => 1, 'sid' => 2]);
// http://example.com/hello/1/foo/2
Se você quiser usá -lo, primeiro a sessão de ativação.
As falsificações de solicitação entre sites são um tipo de exploração maliciosa pela qual os comandos não autorizados são executados em nome de um usuário autenticado. Felizmente, o Alemavephp facilita a proteção de sua aplicação contra ataques de falsificação de solicitação entre sites (CSRF).
O AleaMePhp gera automaticamente um "token" CSRF para cada sessão de usuário ativa gerenciada pelo aplicativo. Este token é usado para verificar se o usuário autenticado é a pessoa que realmente faz as solicitações para o aplicativo. Como esse token é armazenado na sessão do usuário e alterações sempre que a sessão é regenerada, um aplicativo malicioso não consegue acessá -lo.
O token CSRF da sessão atual pode ser acessado através da função Helper csrf_token :
$token = csrf_token();
Sempre que você definir um formulário "post", "put", "patch" ou "excluir" o formulário HTML em seu aplicativo, você deve incluir um campo oculto de CSRF _token no formulário para que o middleware de proteção do CSRF possa validar a solicitação. Por conveniência, você pode usar a diretiva @csrf Blade para gerar o campo de entrada de token oculto:
<form method="POST" action="/profile">
@csrf
<!-- Equivalent to... -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Além de verificar o token CSRF como um parâmetro pós, o libVerifyCsrfToken também verificará o cabeçalho de solicitação do X-CSRF-TOKEN . Você pode, por exemplo, armazenar o token em uma meta tag html:
<meta name="csrf-token" content="{{ csrf_token() }}">
Em seguida, você pode instruir uma biblioteca como o jQuery para adicionar automaticamente o token a todos os cabeçalhos de solicitação. Isso fornece proteção CSRF simples e conveniente para seus aplicativos baseados em Ajax usando a tecnologia JavaScript Legacy:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
O AleaMPephp armazena o token CSRF atual em um cookie XSRF-TOKEN criptografado que está incluído em cada resposta gerada pela estrutura. Você pode usar o valor do cookie para definir o cabeçalho de solicitação X-XSRF-TOKEN .
Este cookie é enviado principalmente como uma conveniência do desenvolvedor, pois algumas estruturas e bibliotecas JavaScript, como Angular e Axios, colocam automaticamente seu valor no cabeçalho X-XSRF-TOKEN em solicitações de origem da mesma origem.
./phpunit --bootstrap vendor/autoload.php tests
./phpunit --bootstrap vendor/autoload.php tests --display-warnings
./phpunit --bootstrap vendor/autoload.php tests --display-deprecations
O Alemavephp é cerca de 9x mais rápido que o Laravel no hello world Benchmark.
Laravel: 2900 rps.
Alemavephp: 23000 rps.
Ambas as depuras abertas e o Laravel usa o driver da sessão de matriz.