操纵API应用程序的控制器映射

时间:2018-07-26 13:34:34

标签: yii2

我的应用程序中有一组扩展(yii2-advanced),必须在自己的存储库中进行维护。为了使它们尽可能分离,它们自己注册为模块,并添加到菜单中并进行如下迁移:

vendor \ ext \ Ext.php     

namespace vendor\ext;

use yii\base\BootstrapInterface;

class ext implements BootstrapInterface
{
    public function bootstrap($app)
    {
        $this->addToMenu($app);
        $this->addToModules($app);
        $app->params['migrations'] = array_merge($app->params['migrations'], ['@vendor/ext/migrations']);
    }

    private function addToMenu($app)
    {
        ...
    }

    private function addToModules($app)
    {
    $app->setModule('ext', ['class' => 'vendor\ext\Module']);
    }
}

vendor \ ext \ composer.json

"extra": {
  "bootstrap": "vendor\\ext\\Ext"
},

vendor\ext\controllers\中的控制器一起使用时,效果很好。我创建了一个额外的应用程序作为REST API,我需要该应用程序访问vendor\ext\api\而不是vendor\ext\controllers\

因此,如果您访问example.com/ext/controller,则会得到vendor\ext\controllers\controller::index(),但是如果您访问api.example.com/ext/controller,则会得到vendor\ext\api\controller::index()

为了解决我拥有的自举功能,我已经阅读了很多文档,但是似乎无法弄清楚。

2 个答案:

答案 0 :(得分:0)

也许您可以映射控制器:

https://www.yiiframework.com/doc/guide/2.0/en/rest-routing#routing

根据该文档中的示例:

[
    'class' => 'yii\rest\UrlRule',
    'controller' => ['u' => 'user'],
]

您可以使用引导程序在UrlManager中创建规则。

通常,我在Rest API中使用严格的解析,因此无论如何我们都必须明确定义规则。

答案 1 :(得分:0)

我通过将每个API版本添加为另一个模块并在我的API应用程序的相应版本模块中注册来解决了该问题。

现在,我可以在单独的存储库中开发每个模块及其受支持的api版本,并且所有内容都会自动注册。

如果有人需要,可以在下面发布引导代码,以进行类似的操作。

public $supported_api_versions = [];

public function bootstrap($app)
{
    $this->addToMenu($app);
    if($app->id == 'app-frontend')
    {
        $this->addToModules($app);
    }
    elseif($app->id == 'app-backend')
    {
        // Add code here if the module should be available in backend application
    }
    elseif($app->id == 'app-api')
    {
        foreach ( $this->supported_api_versions as $api ) {
            $module = $app->getModule($api);
            $module->setModule($this->name, ['class' => 'vendor\\'.$this->name.'\api\\'.$api.'\Module']);
        }
    }
    elseif($app->id == 'app-console')
    {
        $app->params['migrations'] = array_merge($app->params['migrations'], ['@vendor/'.$this->name.'/migrations']);
    }
}