php-Yii2,组件,创建单个实例并在Web应用程序中的任何位置访问它
作者:互联网
我想在yii2中创建一个可以在整个Web应用程序中访问的组件,但是只能创建一个实例,并且能够在需要时检索该实例.
namespace app\components;
use yii;
use yii\base\Object;
class ContentManagerComponent extends Object
{
public function init(){
parent::init();
}
public function toBeUsed (){
return 'some variable';
}
}
然后,我希望能够在Web应用程序的其他部分中调用该组件,例如在控制器中.
namespace app\Controllers;
use yii;
use app\controllers\
class SomeController extends Controller {
public function actionDoSomething(){
$contentComponent = Yii::$app->content;
$someVariable = $contentComponent->toBeUsed()
return $this->render( 'someView',[
'variable' => $someVariable,
]
}
}
我还将该组件放在了web.php文件中.
$config = [
'components' => [
'content' => [
'class' => 'app\components\ContentManagerComponent',
],
],
],
我最后要讲的是phpstorm告诉我该类不存在.我还希望像应用程序中的其他组件一样具有intelisense.
智力:
noIntele:
更新:#
如下面的答案所建议,通过添加此行,我可以使intelisense工作. / ** @var ContentComponent $contentManager * /
但是,我厌倦了每次想要使用内容组件时都总是在上面键入内容.因此,我在需要内容组件的组件的基类中创建了一个函数,该组件使用Yii :: app-> content方法返回Continent组件.在将返回Content Component的函数上方,我添加了以下注释:它将返回ContentComponent和ContentComponent的类.现在为了让我在智能感知工作中使用该组件.我所要做的就是$this-> getContentComponent. Phpstorm将能够确定内容组件属于返回的类.贝娄就是一个例子.
class BaseClass extends object
{
/**
* @return ContentComponent
*/
function getContentComponent () {
$contentComponent = Yii::app->content;
return $contentComponent
}
}
class SomeClass extends BaseClass
public function someFunction () {
$contentComponent = $this->getContentComponent;
}
解决方法:
PHPStorm无法识别您的自定义组件,因为它们是在框架加载时动态创建的,并在运行时附加到Yii :: $app,这就是PHPStorm无法识别您的自定义组件的原因.因此,在有人为PHPStorm等IDE开发智能插件之前,您必须进行一些调整才能实现目标.
您有2个选择:
>创建一个新的Yii.php文件(在根目录中)以供所有
必要的文档,这将告诉整个项目中的PHPStorm
有关您的组件的信息(如果您想创建仅对控制台/ Web /两者均可用的组件,我在此处给出了完整的示例),请参阅* @property ContentManagerComponent $content(More read-归功于samdark Alexander Makarov,Yii核心贡献者之一) :
<?php
use app\components\ContentManagerComponent;
use yii\BaseYii;
/**
* Class Yii
* Yii bootstrap file.
* Used for enhanced IDE code autocompletion.
*/
class Yii extends BaseYii
{
/**
* @var BaseApplication|WebApplication|ConsoleApplication the application instance
*/
public static $app;
}
/**
* Class BaseApplication
* Used for properties that are identical for both WebApplication and ConsoleApplication
*
* @property ContentManagerComponent $content
*/
abstract class BaseApplication extends yii\base\Application
{
}
/**
* Class WebApplication
* Include only Web application related components here
*
*/
class WebApplication extends yii\web\Application
{
}
/**
* Class ConsoleApplication
* Include only Console application related components here
*/
class ConsoleApplication extends yii\console\Application
{
}
>在要使用组件的任何地方创建一个PHP文档
会告诉PHPStorm您的变量是组件的实例:
public function actionDoSomething()
{
/** @var ContentManagerComponent $contentComponent */
$contentComponent = Yii::$app->content;
$someVariable = $contentComponent->toBeUsed();
return $this->render('someView', [
'variable' => $someVariable,
]);
}
如您所见,选项1是Yii框架的核心贡献者之一提供的解决方案,因此,我认为这是目前正确的选择(直到JetBrains或任何插件将提供本机支持)
标签:yii2-basic-app,yii2,php 来源: https://codeday.me/bug/20191025/1929132.html