strategio/megio-starter

Megio 应用和网站的模板

0.8.16 2024-10-01 11:20 UTC

This package is auto-updated.

Last update: 2024-10-01 11:21:04 UTC


README

Megio 上构建的应用、网站和 API 的框架。

模板渲染

class ArticleController extends Controller
{
    public function list(EntityManager $em, int $page): Response
    {
        $articles = $em->getRepository(Article::class)->findBy(['page' => $page])
        
        return $this->render(Path::viewDir() . '/controller/article.latte', [
            'articles' => $articles
        ]);
    }
}

API 请求处理

class DownloadRequest extends Request
{
    // Inject custom dependencies here
    public function __construct(protected readonly EntityManager $em) 
    {
    }
    
    // Add request validations
    public function schema(array $data): array
    {
        return [
            'invoice' => Expect::structure([
                'type' => Expect::anyOf(
                    'invoice', 'proforma', 'invoice-annul', 'proforma-annul'
                ),
                'number' => Expect::string()->required(),
                'issue_date' => Expect::string()->required(),
                'due_date' => Expect::string()->required(),
                'currency' => Expect::string()->required(),
                'items_text' => Expect::string(),
                'footer_text' => Expect::string(),
            ])->required()->castTo('array')
        ];
    }
    
    // Process validated data
    public function process(array $data): Response
    {
        $invoice = new Invoice();
        $invoice->setType($data['invoice']['type'])
        
        ...
        
        $this->em->persist($invoice)
        $this->em->flush()
        
        return $this->json(['id' => $invoice->getId()]);
    }
}

路由

return static function (RoutingConfigurator $routes): void {
    $routes->add('download', '/api/invoice/download')
        ->methods(['POST'])
        ->controller(\App\Http\Request\Invoice\DownloadRequest::class)
        ->options(['auth' => false]);
    
    $routes->add('article', '/article/{page}')
        ->methods(['GET'])
        ->controller([\App\Http\Controller\ArticleController::class, 'list'])
        ->requirements(['page' => '\d+'])
        ->defaults(['page' => 1])
        ->options(['auth' => false]);
};