编程语言
首页 > 编程语言> > php-Yii2,组件,创建单个实例并在Web应用程序中的任何位置访问它

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.

智力:

intelense

noIntele:

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