hiqsol/core

Yii 3.0 建议方案 :: 不用于实际使用

dev-master 2018-07-20 14:36 UTC

This package is auto-updated.

Last update: 2024-09-18 07:43:16 UTC


README

Latest Stable Version Total Downloads Build Status Scrutinizer Code Coverage Scrutinizer Code Quality Dependency Status

此包是 Yii 3.0 架构变更建议。

不打算用于实际使用

想法

  • 框架被分割成部分,不是彻底的,而是功能性的
    • yiisoft/core - 所有之前框架但现在之后的所有内容
    • yiisoft/di - 如此,修复了一些错误
    • yiisfot/yii-web - 来自 webfilter 文件夹的所有内容,可以在没有 yiisoft/console 的情况下使用,但需要 core
    • yiisfot/yii-console - 来自 console 文件夹的所有内容,可以在没有 yiisoft/web 的情况下使用,但需要 core
    • yiisoft/log - 来自 log 文件夹的所有内容,任何 PSR 兼容的缓存都可以使用,可以做到框架无关
    • yiisoft/cache - 来自 caching 文件夹的所有内容,任何 PSR 兼容的缓存都可以使用,可以做到框架无关
    • yiisoft/db - 不是所有应用都需要它,可以做到框架无关
    • yiisoft/rbac - 不是所有应用都需要它,可以做到框架无关
    • 还应考虑
      • 网格
      • 小部件
      • 分割数据库和 ActiveRecord
    • 请参阅讨论 #1
  • 除了 composer.json 文件中的版本约束外,任何地方都不提及框架版本
    • 重命名以 yii- 为前缀的 yii 扩展
    • 经验法则
      • 如果扩展需要直接或通过依赖关系使用 yiisoft/core - 则使用 yii- 前缀
      • 如果扩展可以在没有 yii 的情况下使用(完全或部分)- 则不带 yii- 前缀命名
      • 如果扩展在提供更多功能时使用 yii - 则建议使用 yii
  • yiisfot/core 只需要虚拟 psr 实现,而不是具体的 yii 包
    • 实际上,现在并非所有 psr 实现都能正常工作,但这是一种意向声明,迟早会实现
  • 每个部分都在 config 文件夹中提供自己的配置,请参阅下面的示例
    • 总结配置是通过 composer-config-plugin 组装的,我们可以考虑其他配置组装工具,但这个已经经过测试,并且没有其他工具 :)
    • 我理解这是一个最有争议的问题,但它可能成为主框架功能
    • 允许丢弃 coreComponents 和其他诸如合并框架代码中可用的配置部分之类的辅助工具
    • 配置成为 DI 容器的配置,包含应用程序和所有服务的配置(之前它是应用程序的配置)
    • 允许创建洋葱式应用程序和插件,请参阅 我的文章
    • 请参阅讨论 #2
  • yii2-composer - 不再需要
    • yii2-extension composer 包类型不再需要,扩展将成为 library
    • 此外,yii2-composer 组装 extensions.php,用于别名,而 composer-config-plugin 做了同样的事情,但更有效
  • 考虑完全删除引导功能
    • 它主要用于将扩展合并到应用程序配置中 - 应使用 composer-config-plugin 来做这件事
    • 应配置所有其他情况的事件触发
      • 这通过仅在特定情况下运行任务来提高性能,而不是在每次请求时都运行
  • DI
    • 完全移除 ServiceLocator,使用 DI 代替
    • 完全从ApplicationModule中移除组件支持
      • 根据我的经验,依赖注入(DI)已经足够
    • Application变得非常简洁
  • 完全移除ConfigurableYii::configure(),以及与之相关的init()
    • 移除所有地方的$config(最后一个构造函数参数)
    • Configurable是这样工作的
      • $config数组被传递给构造函数
      • $config通过Yii::configure()应用
      • 构造函数执行init()
      • 由于以下原因,它不与新DI兼容
        • 新的DI首先调用构造函数,然后设置属性
        • 从构造函数中无法调用init
        • 理论上,可以使用DI调用init,但必须确保它在设置所有属性之后调用
    • 必须修复所有具有init()的类
    • 这是一个严重的BC-break,但一切都会变得简单
      • 不需要修改yiisoft/di
      • 初始化最好用getter替代,使其延迟,从理论上讲更高效
  • Yii重做为一个干净的辅助工具,没有全局静态属性
    • 不需要在入口脚本中引入Yii
    • 将所有其他助手移动到yii\helpers\Yii
    • 移除“全局变量”Yii::$appYii::$logger
    • 将别名移动到Application
    • 仅保留:Yii::t()Yii::createObject()以及日志和性能分析函数
    • 为了使它们工作,必须在入口脚本中调用Yii::setContainer($container)
    • 如果未定义容器,则所有函数将以默认方式操作,例如使用PHP内置功能进行日志记录
    • 我认为应该从版本中弃用Yii::createObject(),首先在框架中移除其使用,然后在下一个版本中完全移除,以Factory::create()代替
    • 将许多定义移动到config/defines.php,composer-config-plugin也会组装定义
  • 清理
    • 将文件夹web重命名为public
    • 将别名@webroot重命名为@public
    • 我希望在重载的文件夹(base、web)中减少文件数量,增加一些文件夹,但不要增加文件夹深度
      • 将所有异常移动到base和web中的自己的文件夹
      • 将web格式化器移动到自己的文件夹
      • 考虑:url、action

入口脚本

<?php
use hiqdev\composer\config\Builder;
use yii\di\Container;
use yii\helpers\Yii;

(function () {
    require_once __DIR__ . '/../vendor/autoload.php';
    require_once Builder::path('defines');

    $container = new Container(require Builder::path('web'));
    Yii::setContainer($container);

    $container->get('app')->run();
})();

配置示例

来自yiisoft/core的示例,src/config/common.php

<?php

return [
    yii\base\Application::class => Reference::to('app'),
    'app' => [
        'aliases' => [
            '@root'     => dirname(__DIR__, 5),
            '@vendor'   => dirname(__DIR__, 4),
        ],
        'params' => $params,
    ],

    yii\base\Request::class => Reference::to('request'),
    yii\base\View::class => Reference::to('view'),
];

来自yiisoft/web的示例,src/config/web.php

<?php

return [
    'app' => [
        '__class' => yii\web\Application::class,
        'id' => 'web',
        'name' => 'web',
    ],

    'request' => [
        '__class' => yii\web\Request::class,
    ],
    'view' => [
        '__class' => yii\web\View::class,
    ],
];

来自yiisoft/console的示例,src/config/console.php

<?php

return [
    'app' => [
        '__class' => yii\console\Application::class,
        'id' => 'console',
        'name' => 'console',
    ],

    'request' => [
        '__class' => yii\console\Request::class,
    ],
    'view' => [
        '__class' => yii\console\View::class,
    ],
];

来自yiisoft/log的示例,src/config/common.php

<?php

return [
    'logger' => [
        '__class' => yii\log\Logger::class,
    ],

    Psr\Log\LoggerInterface::class => yii\di\Reference::to('logger'),
];

部分和文件夹

许可证

本项目根据BSD-3-Clause许可证发布许可协议。更多信息请参阅此处

版权所有 © 2018,sol (http://hiqdev.com/)