apishka/easy-extend

PHP类扩展实现的简单库

安装次数: 1,909

依赖者: 11

建议者: 0

安全: 0

星标: 0

关注者: 3

分支: 1

开放问题: 0

类型:composer-plugin

2.1.1 2019-11-25 10:59 UTC

README

Current build status image

什么是easy-extend?

这是一个composer组件,帮助开发者编写通用库并在项目中扩展它们。

快速开始

  • 将easy-extend添加到库的composer需求中
"require": {
    "apishka/easy-extend": "^1.0.0"
}
  • 创建.apishka.php(结构文档)。最常见的文件如下所示
<?php

return array(
    'easy-extend' => array(
        'finder' => function($finder)
        {
            $finder
                ->in('source/')
                ->files()
                ->name('*.php')
            ;

            return $finder;
        }
    ),
);
  • 运行composer update
  • 实现你想要轻松扩展的类的特质。

如何扩展?

扩展类

某些库已经有了你想要扩展的类的基本实现,并且该库实现了EasyExtend

class Library_User_Implementation
{
    /**
     * We have to include trait
     */
    use Apishka\EasyExtend\Helper\ByClassNameTrait;
}

为了扩展这个类而不重写任何库代码,或者检查新用户类应该在哪个类中扩展,你需要做的是扩展该类

class My_Library_User_Implementation extends Library_User_Implementation
{
}

你需要做的是使用以下方式创建类的实例

Library_User_Implementation::apishka(); // instanceof My_Library_User_Implementation

所有库都可以根据你自定义项目的需求轻松扩展。无需要求大量的代码。

##项目路由 创建路由并实现两个方法

class My_Library_ItemsRouter extends \Apishka\EasyExtend\Router\ByKeyAbstract
{
    protected function isCorrectItem(\ReflectionClass $reflector)
    {
        return $reflector->isSubclassOf('My_Library_ItemsInterface');
    }

    protected function getClassVariants(\ReflectionClass $reflector, $item)
    {
        return $item->getAliases();
    }
}

创建项目

class My_Library_ItemApple implements My_Library_ItemsInterface
{
    public function getAliases()
    {
        return array(
            'apple',
            'red_apple',
        );
    }
}

现在你可以通过别名获取类

var_dump(
    get_class(My_Library_ItemsRouter::apishka()->getItem('apple')
); // My_Library_ItemApple

var_dump(
    get_class(My_Library_ItemsRouter::apishka()->getItem('red_apple')
); // My_Library_ItemApple

你也可以扩展你的项目

class My_Library_ItemRedApple extends My_Library_ItemApple
{
}

// after ./vendor/bin/easy-extend
var_dump(
    get_class(My_Library_ItemsRouter::apishka()->getItem('apple')
); // My_Library_ItemRedApple