0

PhlyRestfully を使用して、他のモジュールにビジネス ロジック (サービス、エンティティなど) を持つ Web ベースの API を開発しています。そのために、Hydrator を使用するように PhlyRestfully を構成した「Api」という名前のモジュールを作成しましたClassMethods。問題は、エンティティに多くのプロパティがあり、API 応答がエンティティを反映していて、それを望んでいないことです。

たとえば、私のエンティティにはプロパティがあります:

class Deal {
   $deal_id;
   $title;
   $description;
   $price;
}

Model/Service で作成された fetch メソッドは Deal を返しますが、title と deal_id のみを選択します。これらは応答に表示したい列だけだからです。応答には、必要なタイトルと deal_id だけではなく、ホール エンティティが反映されています。構成でハイドレーターを指定していない場合、応答は希望どおりです (title と deal_id を使用) が、応答には別の問題があり、キーには追加のテキスト ("\u0000*\u0000) があります。私が見たものからコードでは、キャストのために追加のテキストが追加され、ハイドレーターが必要です。

「Api」モジュールで別のロジックを構築せずにこの問題を解決する解決策はありますか? 誰かが私に他の解決策を提案できますか?


リソース:

namespace Api\Resources;

class Deals extends AbstractListenerAggregate
{

    protected $listeners = array();

    protected $table;

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

    public function attach(EventManagerInterface $events)
    {
        $this->listeners[] = $events->attach('create', array($this, 'onCreate'));
        $this->listeners[] = $events->attach('fetch', array($this, 'onFetch'));
        $this->listeners[] = $events->attach('fetchAll', array($this, 'onFetchAll'));
    }

    public function onCreate(ResourceEvent $e)
    {
        $data  = $e->getParam('data');
        $paste = $this->table->save($data);
        if (!$paste) {
            throw new CreationException();
        }
        return $paste;
    }

    public function onFetch(ResourceEvent $e)
    {
        $id = $e->getParam('id');
        $paste = $this->table->getDealMapper()->fetchById($id);
        $paste->addresses = new HalResource(array('deals'), 1);
        if (!$paste) {
            throw new DomainException('Paste not found', 404);
        }
        return $paste;
    }

    public function onFetchAll(ResourceEvent $e)
    {
        // getDealsApi is selecting only the deal_id and the title
        $deals = $this->table->getDealMapper()->getDealsApi();
        foreach($deals as $deal) {

            $deal->categories = array(
                '3' => array(
                    'name' => 'asdasd', 
                    'href' => 'url'
                )
            );
        }

        return $deals;
    }
}

「共通」モジュールのエンティティ:

namespace Common\Entity;

class Deal
{
    protected $deal_id;

    protected $store_id;

    protected $title;

    protected $short_description;

    protected $list_price;

    protected $price;

    protected $discount;

    protected $discount_type;

    protected $image_url;

    protected $link;


    /**
     * @return dealId
     */
    public function getDealId()
    {
        return $this->deal_id;
    }

    /**
     * @param $dealId
     * @return self
     */
    public function setDealId($dealId)
    {
        $this->deal_id = (int) $dealId;
        return $this;
    }

    /**
     * @return store_id
     */
    public function getStoreId()
    {
        return $this->store_id;
    }

    /**
     * @param $storeId
     * @return self
     */
    public function setStoreId($storeId)
    {
        $this->store_id = $storeId;
        return $this;
    }

     /**
     * @return title
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @param $title
     * @return self
     */
    public function setTitle($title)
    {
        $this->title = $title;
        return $this;
    }

    /**
     * @return shortDescription
     */
    public function getShortDescription()
    {
        return $this->short_description;
    }

    /**
     * @param $description
     * @return self
     */
    public function setShortDescription($description)
    {
        $this->short_description = $description;
        return $this;
    }

    /**
     * @return link
     */
    public function getLink()
    {
        return $this->link;
    }

    /**
     * @param $link
     * @return self
     */
    public function setLink($link)
    {
        $this->link = $link;
        return $this;
    }     

    /**
     * @return list_price
     */
    public function getListPrice()
    {
        return $this->list_price;
    }

    /**
     * @param $listPrice
     * @return self
     */
    public function setListPrice($listPrice)
    {
        $this->list_price = $listPrice;
        return $this;
    }   

    /**
     * @return price
     */
    public function getPrice()
    {
        return $this->price;
    }

    /**
     * @param $price
     * @return self
     */
    public function setPrice($price)
    {
        $this->price = $price;
        return $this;
    }   

    /**
     * @return discount
     */
    public function getDiscount()
    {
        return $this->discount;
    }

    /**
     * @param $discount
     * @return self
     */
    public function setDiscount($discount)
    {
        $this->discount = $discount;
        return $this;
    }   

    /**
     * @return discount_type
     */
    public function getDiscountType()
    {
        return $this->discount_type;
    }

    /**
     * @param $discounType
     * @return self
     */
    public function setDiscountType($discounType)
    {
        $this->discount_type = $discounType;
        return $this;
    }   

    /**
     * @return image_url
     */
    public function getImageUrl()
    {
        return $this->image_url;
    }

    /**
     * @param $imageUrl
     * @return self
     */
    public function setImageUrl($imageUrl)
    {
        $this->image_url = $imageUrl;
        return $this;
    }   
}

API モジュール構成:

<?php

return array(
    'controllers' => array(
        'invokables' => array(
            'Api\Controller\Index' => 'Api\Controller\IndexController',
        ),
    ),
    'router' => array(
        'routes' => array(
            'api' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/api',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Api\Controller',
                        'controller'    => 'Index',
                      //  'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'deals' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/deals[/[:id]]',
                            // 'controller' => 'Api\Controller\Deals',
                            'defaults' => array(
                                'controller' => 'Api\Controller\Deals',
                            ),

                        ),
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'strategies' => array(
            'ViewJsonStrategy'
        ),
    ),
    'phlyrestfully' => array(
        'resources' => array(
            'Api\Controller\Deals' => array(
                'listener' => 'Api\Resource\Deal',
                'route_name' => 'api/deals',
                'resource_http_options'   => array('get'),
                'page_size' => 1,  
            )
        ),
        'renderer' => array(
            'hydrators' => array(
                'Common\Entity\Deal' =>'Hydrator\ClassMethods',
            ),
        ),
    ),
    'service_manager' => array(
        'invokables' => array(
            'Hydrator\ClassMethods' => 'Zend\Stdlib\Hydrator\ClassMethods',
        ),
    ),    
);

このコードを使用した応答:

{
    "_links": {
        "self": {
            "href": "http://deal.local.com/api/deals?page=1"
        },
        "first": {
            "href": "http://deal.local.com/api/deals"
        },
        "last": {
            "href": "http://deal.local.com/api/deals?page=1"
        }
    },
    "_embedded": {
        "items": [
            {
                "deal_id": 1,
                "type": null,
                "store_id": null,
                "title": "Title of the deal",
                "short_description": null,
                "long_description": null,
                "status": null,
                "slug": null,
                "link": null,
                "list_price": null,
                "price": null,
                "discount": null,
                "discount_type": null,
                "image_url": null,
            }
        ]
    }
}

ご覧のとおり、getDealsApi() によって返されないキーに NULL を設定します。

そして、私はこのようになりたいです:

{
    "_links": {
        "self": {
            "href": "http://deal.local.com/api/deals?page=1"
        },
        "first": {
            "href": "http://deal.local.com/api/deals"
        },
        "last": {
            "href": "http://deal.local.com/api/deals?page=1"
        }
    },
    "_embedded": {
        "items": [
            {
                "deal_id": 1,
                "title": "Title of the deal",
            }
        ]
    }
}

どんな助けでも大歓迎です!

ありがとうございました

4

1 に答える 1