Você pode usar este aplicativo de esqueleto para começar a trabalhar em um novo aplicativo embrionário 3.
Usando compositor:
$ composer create-project davidecesarano/embryo [my-app-name]
O embrião utiliza a biblioteca PHP dotenv. Em uma instalação de embriões frescos, o diretório raiz do seu aplicativo conterá um arquivo .env.example . Quando você instala embrião via compositor, esse arquivo será renomeado automaticamente para .env .
| Diretório | Descrição |
|---|---|
| App | Contém o código principal do seu aplicativo. Este diretório contém uma variedade de diretórios adicionais, como Controllers , Exceptions , Helpers , Middleware , Models e Services . |
| Bootstrap | Contém os arquivos que inicializam seu aplicativo, como instanciação de aplicativos, middleware, serviços e configurações. |
| público | Contém o ponto de entrada para todas as solicitações (arquivo index.php ) e o diretório de assets . |
| rotas | Contém todas as definições de rota para o seu aplicativo. Por padrão, vários arquivos de rota estão incluídos no embrião: app.php e api.php . |
| armazenar | Contém seus logs ( logs ), arquivo de modelos compilados ( views ), sessões baseadas em arquivos ( sessions ), arquivos em cache ( cache ). |
| Traduções | Contém seus arquivos de idioma. |
| visualizações | Contém os arquivos de visualizações. |
bootstrap/app.php com a classe EmbryoApplication . Durante a instanciação, o embrião registra serviços para as dependências ( bootstrap/services.php ), Middlewares ( bootstrap/middleware.php ) e arquivos de rotas (no diretório routes ). O construtor de aplicativos aceita uma matriz de configurações opcionais que configura o comportamento do aplicativo ( bootstrap/settings.php ).routes o diretor define rotas usando os métodos de roteamento da instância do aplicativo. Esses métodos de instância registram uma rota com o objeto do roteador do aplicativo. Cada método de roteamento retorna a instância da rota para que você possa invocar imediatamente os métodos da instância da rota para adicionar middleware ou atribuir um nome.public/index.php Invoca o método run() da instância do aplicativo. Este método inicia o seguinte processo:O embrião suporta interfaces do PSR-7 para seus objetos de solicitação e resposta.
Você pode executar o código antes e depois do seu aplicativo embrião para manipular os objetos de solicitação e resposta à medida que você achar adequado. Isso é chamado de middleware. Um middleware implementa a interface do middleware do PSR-15.
O embrião usa um contêiner de dependência para preparar, gerenciar e injetar dependências de aplicativos. O embrião suporta contêineres que implementam o PSR-11.
Você pode definir rotas de aplicativos usando os métodos de roteamento da instância do aplicativo. Todo método aceita dois argumentos:
class@method ou uma matriz ['class', 'method'] ) use Embryo Http Message { Response , ServerRequest };
// GET Route
$ app ->get( ' /blog/{id} ' , function ( ServerRequest $ request , Response $ response , int $ id ) {
return $ response -> write ( ' This is post with id ' . $ id );
} O roteamento de embriões suporta métodos de get, post, put, patch, exclusão e solicitação de opções. Todo método de solicitação corresponde a um método do objeto do roteador: get() , post() , put() , patch() , delete() e options() . Você pode usar all() e map() para apoiar todos os métodos ou métodos de rota específicos.
Veja a documentação completa: roteamento de embriões.
Todas as rotas de embriões são definidas em seus arquivos de rota, localizados no diretório routes . Esses arquivos são carregados automaticamente pelo seu aplicativo no arquivo boostrap/app.php . Se você deseja criar um novo arquivo de ruote, adicione -o no diretório de rotas e registre -o no método import() da instância do aplicativo no arquivo boostrap/app.php :
$ app -> import ([
root_path ( ' bootstrap/services.php ' ),
root_path ( ' bootstrap/middleware.php ' ),
root_path ( ' routes/api.php ' ),
root_path ( ' routes/app.php ' ),
root_path ( ' routes/my_route_file.php ' )
]); No embrião, você pode criar um middleware PSR-15 no diretório de appMiddleware . Você pode adicionar middleware ao aplicativo, à rota específica ou ao grupo de rotear.
Se você deseja o middleware do registro para cada solicitação HTTP, adicione o middleware do aplicativo no bootstrapmiddleware.php . O método addMiddleware() aceita uma string, uma matriz ou uma instância de PsrHttpServerMiddlewareInterface .
$ app -> addMiddleware ( App Middleware MyCustomMiddleware::class); Você pode usar o método middleware() para atribuir um ou mais middleware na rota. O método middleware() aceita uma string, uma matriz ou uma instância de PsrHttpServerMiddlewareInterface .
$ app -> get ( ' /users ' , function ( ServerRequest $ request , Response $ response ) {
//...
})-> middleware ( ' AppMiddlewareTestMiddleware1::class ' , ' AppMiddlewareTestMiddleware2::class ' ); Além das rotas, você pode atribuir um ou mais middleware a um grupo e a rotas individuais dentro do grupo. O método middleware() aceita uma string, uma matriz ou uma instância de PsrHttpServerMiddlewareInterface .
$ app -> prefix ( ' /api ' )-> middleware ( App Middleware GroupMiddlewareTest::class)-> group ( function ( $ app ) {
$ app -> get ( ' /user/{id} ' , function ( ServerRequest $ request , Response $ response , int $ id ) {
//...
})-> middleware ( App Middleware RouteMiddlewareTest::class);
});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". Vamos dar uma olhada em um exemplo de um controlador básico. Observe que o controlador estende a classe Base Controller incluída no embrião:
namespace App Controllers ;
use Embryo Controller ;
use Embryo Http Message Response ;
class UserController extends Controller
{
/**
* @param int $id
* @return Response
*/
public function show ( int $ id ): Response
{
return $ this -> response ()-> write ( $ id );
}
}Você pode definir uma rota para este método do controlador como assim:
use App Controllers UserController ;
$ app -> get ( ' /user/{id} ' , [UserController::class, ' show ' ]); Os controladores são obrigados a estender uma classe base. No entanto, você não terá acesso a recursos como os métodos get() , request() e response() .
Você pode digitar qualquer dependência que seu controlador possa precisar em seu construtor. As dependências declaradas serão resolvidas e injetadas automaticamente na instância do controlador:
namespace App Controllers ;
use Embryo Controller ;
use Path To Service ;
class UserController extends Controller
{
/**
* @var Service $service
*/
private $ service ;
/**
* @param Service $service
*/
public function __construct ( Service $ service )
{
$ this -> service = $ service ;
}
}Além da injeção de construtor, você também pode digitar dependências de ponta dos métodos do seu controlador:
namespace App Controllers ;
use Embryo Controller ;
use Embryo Http Message ServerRequest ;
class UserController extends Controller
{
/**
* @param ServerRequest $request
*/
public function store ( ServerRequest $ request )
{
//...
}
} Além disso, você também pode usar o método get() da classe Base Controller:
namespace App Controllers ;
use Embryo Controller ;
use Path To Service ;
class UserController extends Controller
{
public function show ()
{
$ service = $ this -> get (Service::class);
//...
}
} A classe Base Controller também tem acesso aos métodos PSR-7 request() e response() :
namespace App Controllers ;
use Embryo Controller ;
use Embryo Http Message Response ;
class UserController extends Controller
{
/**
* @return Response
*/
public function store (): Response
{
$ params = $ this -> request ()-> getParsedBody ();
//...
return $ this -> response ()-> write ( ' Hello! ' );
}
} Como alternativa, você pode acessar a request() e response() ajudantes:
namespace App Controllers ;
use Embryo Controller ;
use Embryo Http Message Response ;
class UserController extends Controller
{
/**
* @return Response
*/
public function store (): Response
{
$ params = request ()-> getParsedBody ();
return response ()-> write ( ' Hello! ' );
}
}Os provedores de serviços são o local central de todo o Bootstrapping de Aplicativo de Embrião. Seu próprio aplicativo, bem como todos os serviços principais do embrião, são inicializados por meio de provedores de serviços.
A era dos provedores de serviços localizada no diretório app/Services . Todos os provedores de serviços estendem a classe EmbryoContainerServiceProvider e contém um método register . No método do registro, você deve vincular apenas as coisas ao contêiner de serviço.
namespace App Services ;
use Embryo Container ServiceProvider ;
class TestService extends ServiceProvider
{
/**
* Registers service provider.
*
* @return void
*/
public function register ()
{
$ this -> container -> set ( ' test ' , function ( $ container ){
return ' Hello from my test service ' ;
});
}
}