awoyotoyin / zfe-base
Zend Expressive/Doctrine ORM 基础库
Requires
- php: ^5.6 || ^7.0
- dasprid/container-interop-doctrine: ^1.1
- zendframework/zend-log: ^2.9
Requires (Dev)
- phpunit/phpunit: ^6.0.8 || ^5.7.15
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) ]); } }