awoyotoyin/zfe-base

Zend Expressive/Doctrine ORM 基础库

1.1.1 2018-04-24 23:40 UTC

This package is not auto-updated.

Last update: 2024-09-15 05:21:55 UTC


README

安装

$ composer require awoyotoyin/zfe-base "~1.0.0"

注册模块

Zend Expressive

use Zfe\Common\ConfigProvider as CommonConfigProvider;

$aggregator = new ConfigAggregator([
    ...
    CommonConfigProvider::class,
    ...
], $cacheConfig['config_cache_path']);

使用方法

实体类

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Zfe\Common\Entity\AbstractEntity;

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="blog_post")
 */
class Post extends AbstractEntity
{
    /**
     * @ORM\Column(name="title", type="string", length=32)
     * @var string
     */
    private $title;

    /**
     * Get the value of title
     *
     * @return  string
     */
    public function getTitle(): string
    {
        return $this->title;
    }

    /**
     * Set the value of title
     *
     * @param  string  $title
     * @return self
     */
    public function setTitle(string $title): self
    {
        $this->title = $title;
        return $this;
    }
}

您的实体类应扩展 Zfe\Common\Entity\AbstractEntity。该 Zfe\Common\Entity\AbstractEntity 类定义了实体类的 Id、CreatedAt 和 UpdatedAt 属性。如果您从该类扩展,您的实体类必须定义生命周期回调,因为这对于 CreatedAt 和 UpdatedAt 属性都是必需的。

Zfe\Common\Entity\AbstractEntity 类还公开了一个 exchangeArray 方法,该方法接受一个数组作为其唯一参数,并从数组成员设置实体成员。

Example:
$data = [
    'title' => 'Some Title'
];

$post = new Post();
$post->exchangeArray($data);
$post->getTitle(); // Some Title

提供者类

提供者执行所有数据库相关操作,因此,此类将主要包含对实体的查询。您只需定义实体类,Zfe\Common\Provider\AbstractProvider 就会完成所有繁重的工作。

可用方法

public function fetchAll(): \Doctrine\ORM\QueryBuilder;

public function selectAll(array $filters = [], array $orderBy = [], array $groupBy = []): \Doctrine\ORM\QueryBuilder;

public function selectAllPaginate(
        $first = 0,
        $max = 20,
        array $filters = [],
        array $orderBy = [],
        array $groupBy = [],
        $fetchJoinCollection = true
    ): Doctrine\ORM\Tools\Pagination\Paginator;

public function selectJoin(
        $first = 0,
        $max = 20,
        array $filters = [],
        array $joins = [],
        array $orderBy = [],
        array $groupBy = []
    ): \Doctrine\ORM\QueryBuilder
<?php

/**
 * Description of PostProvider
 *
 * @author: Awoyo Oluwatoyin Stephen alias awoyotoyin <awoyotoyin@gmail.com>
 */

namespace App\Provider;

use Zfe\Common\Provider\AbstractProvider;

class PostProvider extends AbstractProvider
{
    protected $entityClass = 'App\Entity\Post';

    protected $entity_event_prefix = 'blog_post';
}

服务类

<?php

/**
 * Description of PostService
 *
 * @author: Awoyo Oluwatoyin Stephen alias awoyotoyin <awoyotoyin@gmail.com>
 */
namespace App\Service;

use Zfe\Common\Service\AbstractService;

class PostService extends AbstractService
{

}

系统事件

此库包含 Zend\EventManager\EventManager。默认情况下,有 4 个内置事件在以下操作之前和之后触发。

> Saving an Entity
> entity_save_before event fired before an entity is saved
> entity_save_after event fired after an entity is saved
>
> Deleting an Entity
> entity_delete_before event fired before an entity is deleted
> entity_delete_after event fired after an entity is deleted

要触发特定于实体的事件,您的提供者类必须设置 $entity_event_prefix 属性的值。请参阅上面的 PostProvider 定义。在这种情况下,以下事件现在也对我们可用。

> Saving an Entity
> blog_post_save_before event fired before an entity is saved
> blog_post_save_after event fired after an entity is saved
>
> Deleting an Entity
> blog_post_delete_before event fired before an entity is deleted
> blog_post_delete_after event fired after an entity is deleted

要注册您自己的自定义事件监听器,创建一个类似以下内容的 .config.php 文件。

<?php

return [
    'listeners' => [
        'events' => [
            // the event we are listening to
            'blog_post_save_before' => [
                'class' => \App\Observer\PostObserver::class, // points to the observer class
                'method' => 'onPostBeforeSaveHandled' // points to the method handling the event
            ]
        ],
    ]
];

config 文件夹中包含一个示例 events.config.php.dist 文件。

上面定义的 App\Observer\PostObserver 可以包含以下代码。用您的逻辑替换。

<?php
/**
 * Description of PostObserver
 *
 * @author: Awoyo Oluwatoyin Stephen alias awoyotoyin <awoyotoyin@gmail.com>
 */
namespace App\Observer;

use Interop\Container\ContainerInterface;
use Zend\EventManager\Event;
use Zend\Log\Logger;
use Zend\Log\Processor\PsrPlaceholder;
use Zend\Log\Writer;

class PostObserver
{
    public function __invoke(ContainerInterface $container)
    {
        // Grab some dependencies from the $container
        // And return self
        return new self();
    }

    public function onPostBeforeSaveHandled(Event $event)
    {
        // Do something with the $event here
        $name = $event->getName();
        $target = get_class($event->getTarget());
        $entity = $event->getParam('entity');

        /** Modify the Entity */
        if ($entity instanceof \Zfe\Common\Entity\EntityInterface) {
            $entity->setTitle('Title Changed');
        } elseif (is_array($entity)) {
            $entity['title'] = 'Title Changed';
        }

        /** Push changes back to the trigger */
        $event->setParam('entity', $entity);

        $logger = new Logger;
        $logger->addProcessor(new PsrPlaceholder);

        $writer = new Writer\Stream('data/log/events.log');
        $logger->addWriter($writer);

        $logger->notice('{event} was called on {target} with entity {entity}', [
            'event' => $event,
            'target' => $target,
            'entity' => json_encode($entity)
        ]);
    }
}