eilander/gateway

Laravel 5网关生成器包。

v5.6.0 2018-02-09 07:15 UTC

This package is auto-updated.

Last update: 2024-09-21 20:18:01 UTC


README

网关模式的Laravel实现

A gateway encapsulates the semantic gap between the object-oriented domain layer and the relation-oriented persistence layer.

进一步阅读: http://ryantablada.com/post/two-design-patterns-that-will-make-your-applications-better

目录

[目录]

使用方法

步骤 1:添加服务提供者

在你的 config/app.php 中,将 Eilander\Repository\Providers\RepositoryServiceProvider:class 添加到 providers 数组的末尾

<?php
'providers' => [
    ...
    Eilander\Gateway\Providers\GatewayServiceProvider::class,
],

步骤 2:将包添加到 composer.json 以进行自动加载

将包添加到主 composer.json 中以进行自动加载,然后运行 composer dump-autoload,如下所示

<?php
   "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "Eilander\\Gateway\\": "../library/eilander/gateway/src/"
        }
    },
#!json

composer dump-autoload

控制器示例

<?php 

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Gateways\ProductGateway as Gateway;

class ProductController extends Controller
{
    /**
     * @var VodafoneGateway
     */
    protected $gateway;

    public function __construct(Gateway $gateway){
        $this->gateway = $gateway;
    }

    public funcion create() {
        return $this->gateway->createProduct();
    }

    ....
}

网关示例

<?php 

namespace  App\Gateways;

use Illuminate\Http\Request;

class TestGateway {

    public function __construct(Request $request) 
    {
        $this->request = $request;
    }

    public function createProduct() 
    {
        // some validation
        ...
        // screate new product
        $product = App\Product::create($this->request->all());
    }
}

网关类型

Laravel的eloquent(单个和多个)网关已包括在内。还包括一个空的Elasticsearch网关。

演示者

演示者作为对象的包装器和渲染器。

Fractal演示者

需要Fractal。

使用方法

创建转换器

use League\Fractal\TransformerAbstract;

class PostTransformer extends TransformerAbstract
{
    public function transform(\Post $post)
    {
        return [
            'id'      => (int) $post->id,
            'title'   => $post->title,
            'content' => $post->content
        ];
    }
}

创建演示者

use Eilander\Gateway\Presenter\FractalPresenter;

class PostPresenter extends FractalPresenter {

    /**
     * Prepare data to present
     *
     * @return \League\Fractal\TransformerAbstract
     */
    public function getTransformer()
    {
        return new PostTransformer();
    }
}

在网关中启用

<?php

namespace  App\Gateways\Eloquent;

use App\Gateways\Eloquent\Contracts\GebruikerGateway as Gateways;
use App\Repositories\Eloquent\Contracts\GebruikerRepository as Repository;
use App\Validators\GebruikerValidator as Validator;
use Eilander\Gateway\Eloquent\EloquentGateway;
use App\Presenters\GebruikerPresenter as Presenter;

/**
 * Class FruitRepository
 */
class GebruikerGateway extends EloquentGateway implements Gateways {
{

    ...

    public function presenter()
    {
        return Presenter::class;
    }
}

跳过网关中定义的演示者

在所有其他链式方法之前使用 skipPresenter

$posts = $this->gateway->skipPresenter()->all();