我的应用程序中有一组扩展(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()
。
为了解决我拥有的自举功能,我已经阅读了很多文档,但是似乎无法弄清楚。
答案 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']);
}
}