webman这种常驻内存加多进程的框架是不是不适合像yii2那样组件化开发?

如果

之前一直用yii2开发。优点是参数配置组件配置什么的都在一个地方搞定了。然后代码里直接使用Yii::$app->组件名就可以调用。yii帮助做了组件对象的实例化。用webman开发时,感觉新写组件引用的到处都是,配置文件也写的很随意,没有能统一管理的地方。心中有点疑问:
1.webman是不是不适合像yii那种单例模式的开发?可以做到自始至终只有一个Application来处理所有事情
2.或者是我对webman理解的还不够,很多东西都需要自己再封装开发什么的。比如采用php的di就可以做到像yii那样优雅的开发?

1725 3 1
3个回答

admin

难道这不是容器吗?

  • 如果 2022-06-28

    有可能把组件的初始化像yii2那样直接用配置的方式引入么?比如yii2在web.php里配置一个wechat组件,其他任何地方都可以直接Yii::$app->wechat运行

hans

并不是

  • 暂无评论
walkor 打赏

这个属于习惯问题,有些人喜欢组件完全解耦,使用时直接使用命名空间引入即可,有些人喜欢在上面再包裹一层统一的入口。并不是说webman不适合yii那样组件开发。

如果喜欢yii那种模式,可以自己再封装一层,比如
新建 app/App.php

<?php
namespace app;
use support\Container;
use support\Db;
use support\Log;
use support\Redis;
use support\Request;
use Workerman\Protocols\Http\Session;

/**
 * @property-read Request $request
 * @property-read string $app
 * @property-read string $controller
 * @property-read string $action
 * @property-read Session $session
 */
class App
{
    /**
     * @var Db
     */
    public static $db = Db::class;

    /**
     * @var Redis
     */
    public $redis = Redis::class;

    /**
     * @var Log
     */
    public $log = Log::class;

    /**
     * @var Container
     */
    public $container = Container::class;

    /**
     * @param $name
     * @return mixed
     */
    public function __get($name)
    {
        switch ($name) {
            case 'request':
                return \request();
            case 'app':
                return \request()->app;
            case 'controller':
                return \request()->controller;
            case 'action':
                return \request()->action;
            case 'session':
                return \request()->session();

        }
    }
}

喜欢什么东西都可以自己手动加进去。

在 app/functions.php 里加一个函数

/**
 * @return App
 */
function app()
{
    static $app;
    $app = $app ?: new app\App;
    return $app;
}

使用的时候就可以这样使用

app()->db::table('table')->first();
app()->redis::get('key');
app()->request->path();

但是从视觉是并没有

Db::table('table')->first();
Redis::get('key');
$request->path();

这种用法简洁

  • 如果 2022-06-28

    谢谢大佬提供思路!

  • 如果 2022-06-28

    不过心里还有个疑问,就是这样的用法,多进程间的数据不会互相污染么?functions里的方法会在某个进程建立后,在这个进程内维持自己的数据对吧

  • walkor 2022-06-28

    进程间是完全隔离的,变量 数据都不互相影响

年代过于久远,无法发表回答
×
🔝