追随者/核心

该软件包最新版本(dev-master)没有提供许可证信息。

我的框架的核心

dev-master 2017-10-05 21:39 UTC

This package is not auto-updated.

Last update: 2024-09-24 19:11:44 UTC


README

概览

框架核心构建为 composer 模块(https://getcomposer.org.cn/)。

index.php

<?php

require_once('vendor/autoload.php');
require_once('config.php');

$project = new \MyProject\EntryPoint\Site();
$project->init();

config.php

\Core\Config::setDb('default', [
  'host' => '192.168.0.1',
  'name' => ‘dbname’,
  'user' => 'user',
  'password' => 123456,
  'charset' => 'utf8'
]);

Config::registerProject('MyProject', 'default');

composer.json

{
  "require": {
    "follower/core": "dev-master"
  },
  "autoload": {
    "classmap": [
      "vendor/follower/core/backend",
      "app"
    ]
  }
}

“app” - 是你的应用程序文件夹。推荐的后端项目结构

Api/

Controller/

Service/

EntryPoint/

Object/

Routes/

Controller/API

在“Api”和“Controller”文件夹中,有针对不同应用程序入口点的控制器(例如 api.php 和 index.php)。

这里有一些具有 methodGet、methodList 等方法的类,它们使用 Orm、OrmMapper、ActiveRecord 或 Service 进行数据处理。

class Entry extends Api
{
  public function methodGet($args)
  {
    $entry = \MyProject\Object\Entry::find($args[‘id’]);
    return $entry->getValues();
  }
}

服务

在“Service”文件夹中有服务提供者。你应该在那里编写业务逻辑(而不是在模型和控制台中)。控制器用于输出,模型用于仅与其属性相关的逻辑。

class UserProvider
{
   public function getUsersWithPermissions($permissions)
   {
      return \MyProject\Object\User::all()
          ->addFilter(‘permissions.alias’’, $permissions)
          ->load();
       }
}

入口点

在这里,你应该设置访问规则、控制器命名空间设置、注册路由,并为具体入口点运行应用程序的其他设置。

class Site extends \Core\EntryPoint
{
   public function init()
   {
      Config::set('site.language', 'ru');
      Routes::register();

      $this->setLib('\Accounting\Controller');
      $app = new App($this);
      $app->run();
   }
}

对象

对象类是模型。它包含数据表字段、名称和其他实体之间的关系描述。以下是配置示例。

self::$_config->setTable('User');
self::$_config->setFields([
          'name' => [
            'type' => 'varchar',
            'default' => '',
            'null' => false,
],
'password' => [
            'type' => 'varchar',
            'default' => '',
            'null' => false,
]); 

路由

在“Routes”中,你可以为每个入口点创建路由类并重新定义默认路由规则。添加自定义路由示例

\Core\Router::register(['/add', 'post'], 'Index', 'new', []);

这意味着向 /add URL 发送 POST 查询将转到控制器:Index,方法:methodNew()。

默认路由规则

/controller/ -- 控制器,methodIndex()。

/controller/action -- 控制器,methodAction()。

框架哲学

对象

对象是一个模型,它代表某些实体

主要方法:$obj->setValue('property', $value); // 或 setValues,为多个值设置 $obj->getValue('property'); // 或 getValues,获取所有值

也可以使用 ActiveRecord 风格:$obj->property = $value; $obj->save();

框架支持模型之间的关系。

集合

表示具有方法和属性的数组对象的包装类。

getData() - 返回包含完整对象的数组,键是对象 ID。

getHashMap('id','name') - 返回哈希数组,id => name

getValues('id') - 返回 ID 的简单数组

集合流

用于在集合中执行复杂对象过滤。示例

$stream = $collection->stream();

$filter1 = function($obj) { /* complex filtering logic */  };
$stream = $stream->filter($filter1);

$filter2 = function($obj) { /* complex filtering logic */  }
$stream = $stream->filter($filter2);

//And then return filtered collection:
$stream->find(); 

数据库

原始查询

您仍然可以使用 PDO 编写原始 mysql 查询。

$db = \Core\Database\PDO::getInstance();
$result = $this->db->rows("SELECT * FROM `Entry` WHERE user_id = ?", array($user_id));

小型查询助手

还有一个用于简单查询的小类。

MySQL::insert($table, $params);
MySQL::update($table, $params, $conditions);
MySQL::delete($table, $conditions);

示例

MySQL::update(‘User’,  array(‘name’ => $new_name), array(‘id’ => 1));
MySQL::delete(‘User’,  array(‘id’ => 1));

QueryBuilder

用于使用不同条件逐步构建查询的查询构建器。也用于 \Core\Orm 内部。

composeSelectQuery() 方法将返回要执行的原始查询字符串。

$query = new QueryBuilder(‘User’);
$query->setBaseAlias('pc')
  ->select('id', 'title', 'name')
  ->join('left', User_Catalog, 'pc', ['catalog', 'another.id'])
  ->where('somevalue', [124, 125])
  ->where('max(count)', 20, '<')
  ->where('title', '%test', 'like')
  ->where('test', null);
  ->orderBy('id', 'asc')
  ->groupBy('param1')
  ->limit(20);

echo $query->composeSelectQuery();

Orm

用于与数据库一起工作的层,它封装查询并支持关系。

主要方法

Orm::create($class_name);
Orm::save($object);
Orm::delete($object);

Orm::find($class_name, $filterFields, $filterValues, $params);
Orm::findOne($class_name, $filterFields, $filterValues, $params);
Orm::load($class_name, $id);
Orm::count($class_name, $filterFields, $filterValues);

简单示例

$user = Orm::create(‘User’);
$user->setValues(array(‘name’ => $name, ‘password’ => $password));
Orm::save($user);

$users = Orm::find(‘User’, array(‘name’, ‘type’), array($name, $type)));
$user = Orm::load(‘User’, 12);
Orm::delete($user);

Mapper

另一个更灵活的类。

$mapper = OrmMapper::create(User);
$mapper->setFields(['test', 'name', 'amount']);
  ->setFilter(['test', 'name', 'amount'], [1,2,3]);
  ->load();

$users  = $mapper->getCollection();

ActiveRecord

方便地处理对象的途径。一些示例

$users = User::all()
  ->addFilter(‘type’, $id)
  ->load()
  ->getCollection();

$user = User::find($id);
$user->name = ‘Peter’;
$user->save();