web-dev-qa-db-ja.com

Yii2でグローバル関数を記述し、任意のビューでそれらにアクセスする方法(カスタム方法ではありません)

Yii1.1 CControllerの基本クラスであるCBaseControllerを持つCComponentクラスがありました。 /protected/components/Controller.phpクラスがあり、そのクラスのすべての関数に任意のビューでアクセスできるようになりました。

Yii2はCComponentクラスを所有しなくなりました。 Yii2ガイド は、「Yii2.0は1.1のCComponentクラスをyii\base\Objectとyii\base\Componentの2つのクラスに分割する」ことを示しています。 /protected/components/Controller.phpを使用してYii1.1で行ったように、Yii2でグローバル関数を記述し、それらを任意のビューで記述する方法を知っている人はいますか?

似たようなトピックがいくつかあります カスタム回答について話し合います ですが、カスタムの方法ではなく、公式の方法があるかどうかを知りたいと思います。

9
intumwa

次のステップ:
1)次のディレクトリ「backend/components」を作成します
2)「components」フォルダーに「BackendController.php」コントローラーを作成します

<?php    
    namespace backend\components;
    use Yii;

    class BackendController extends \yii\web\Controller
    {
        public function init(){
            parent::init();

        }
        public function Hello(){
            return "Hello Yii2";
        }
    }

3)すべてのバックアップされたコントローラーは「BackendController」(のように)に拡張されます。

<?php
namespace backend\controllers;

use Yii;
use backend\components\BackendController;

class SiteController extends BackendController
{

    public function beforeAction($event)
    {
        return parent::beforeAction($event);
    }

    public function actionIndex(){
        /* You have to able for call hello function to any action and view */
        //$this->Hello(); exit;

        return $this->render('index');
    }
}

4)アクションビューページ「index.php」を作成します(のように)

<?php
print $this->Hello();
?>
9
Bharat Chauhan

ビューではコントローラー機能にアクセスできません。

Yii1では、ビューはコントローラーにアタッチされますが、Yii2では、ビューはViewクラスにアタッチされます(これはYii2の主要な変更の1つでした)。これにより、コントローラーとビューロジックが分離されますが、お気づきのように、グローバル機能が難しくなります。

Yii2自体もグローバル機能を必要としていました。彼らは「ヘルパー」を作成しました。実際には多くのヘルパーがあります: https://github.com/yiisoft/yii2/tree/master/framework/helpers それぞれが独自のグローバル関数のセットを提供します使用するため。

まだ推測していない場合は、これがYii2でグローバルを実行するための最良の方法です。これは、標準に準拠した方法(PSR-2など)でもあり、通常のグローバルよりも優れたコーディングと見なされます。

したがって、実際には、たとえば次のように、グローバルを使用して独自のカスタムヘルパーを作成する必要があります。

class MyHelpers
{
    public static function myGlobalToDoSomethingAwesome()
    {
        return $awesomeness;
    }
}

他のヘルパーと同じように、ビュー/コントローラーでそれを参照するだけです。

use common\components\MyHelpers;
MyHelpers::myGlobalToDoSomethingAwesome();
5
Sammaye

コンポーネントを簡単に作成できます。

<?php

namespace frontend\components;

use yii\base\Component;

class MyComponent extends Component
{
    public function hello()
    {
        return "Hello, World!";
    }
}

frontend/config/main.phpファイルのコンポーネントとして登録します。

return [
    'id' => 'app-frontend',
    'basePath' => dirname(__DIR__),
    // Some code goes here
    'components' => [
        // some code here
        'memem' => [
            'class' => 'frontend\components\MyComponent'
        ],
    ],
];

そして最後に必要な場所でそれを使用します:

<?php

/* @var $this \yii\web\View */
/* @var $content string */

use yii\helpers\Html;
use yii\widgets\Breadcrumbs;
?>
<?php $this->beginPage()?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="<?=Yii::$app->charset?>">
  <meta name="usage" value="<?=Yii::$app->memem->hello()?>">
2
meysam

1つのオプションは、関数を含むファイル(おそらくコンポーネントディレクトリ内)を作成することです。

function myFunction($parameters)
{
    // Do stuff and return stuff
}

次に、それをindex.phpファイルに含めます。

require_once(__DIR__ . "../components/MyGlobalFunctions.php');

欠点は、これがアプリケーションのOOPスコープ外にあることです。このメソッドを使用して、Laravel hasのようなdd()(ダンプアンドダイ)関数を作成しました。 。

2
smsalisbury

として、質問はすでに答えられています。しかし、それでも私は将来の使用のためにそれに答えたいと思います。

yii2-app-basicを使用しています。 [[〜#〜] note [〜#〜]:ディレクトリ構造はyii2-app-advanced。]

マイディレクトリ構造:

_->Root Folder
    ->assets
    ->commands
    .
    .
    ->controllers
        ->SiteController.php
        ->CommonController.php (New common controller created)
    ->mail
    .
    .
    ->modules
        ->users
            ->controllers
                ->UsersController.php
            ->models
                ->Users.php
            ->views
                ->index.php
            ->Users.php
    .
    .
    .
_

CommonController.php [必要に応じて、すべてのコントローラーで拡張される共通コントローラー(ディレクトリ構造を参照)。]

_<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;

class CommonController extends Controller
{
    .
    .
    // I used this function for checking login access of user
    public function checkLoginAccess() {
        //Write your own custom code
        // For example
        $loginAccess = "No";
        if($loginAccess == "No") {
            Yii::$app->user->logout();
        }
    }
}
_

sersController.php

_<?php
namespace app\modules\users\controllers;

use Yii;
.
.
use app\controllers\CommonController;

//Extend CommonController 
class UsersController extends CommonController 
{
  // Inside init() function, use checkLoginAccess() method to be called
  public function init() {
    parent::init();
    if(!Yii::$app->user->isGuest) {
      $this->checkLoginAccess();
    }
  }
    .
    .
    .
}
_

したがって、このsersController.phpコントローラーがアカウントに入ると、最初にinit()メソッドが呼び出され、init()メソッドではCommonControllerメソッドcheckLoginAccess()は自動的に呼び出しを取得します。したがって、ログインアクセスがないメンバーは、自動的にログアウトになります。

それが役立つことを願っています。問題/質問があれば、遠慮なく質問してください。

2
Nana Partykar

YII2でコンポーネントを作成することもできます

フロントエンドまたはバックエンドでYII1と同じディレクトリとファイルを作成し、その中に以下のコードを記述します

フロントエンド/コンポーネント/Controller.php

/**
 * Description of Controller
 *
 * @author mohit
 */

namespace frontend\components;
use Yii;
class Controller extends \yii\web\Controller{
    //put your code here

    public function beforeAction($action) {
        parent::beforeAction($action);
        if(true)
            return true;
        else
            return false;

    }
}

その後、このクラスをこのように拡張することにより、すべてのコントローラーで使用します-

namespace frontend\controllers;
use Yii;
use frontend\components\Controller;
class SomeController extends Controller
{
    // code
}
1
mohit

Yii2はまだ起動していませんが、静的関数を使用して同様の機能を実現できるはずです。

次の内容で「MyGlobalFunctions.php」と言うクラスを作成します

<?php
class MyGlobalFunctions{
    public static function myFunction($args){
       // logic here
     return someValu here
    }
}

あなたの見解では、この関数を次のように呼び出すことができます

MyGloabalFunctions::myFunction($args);
0
elixir

私はYiiに不慣れで、これを解決策として試しました。たとえば、レイアウトに表示されるメッセージは、フロントエンド/コンポーネントにbaseControllerを作成し(すべてのコントローラーはこのBaseControllerを拡張します)、常にinitセクションで必要なもの。ビューまたはレイアウトで$ this-> view-> paramsを使用してデータをビュー/レイアウトに設定します。 $ this-> paramsこれがベストプラクティスかどうかわかりません..英語が下手でごめんなさい、お役に立てば幸いです

 namespace frontend\components;
    use Yii;
    use frontend\models\UserMessages;

    class BaseController extends \yii\web\Controller
    {
        public function init(){
            parent::init();

            // user nachrichten
            if (!Yii::$app->user->isGuest) {
                    $messages = UserMessages::find()
                    ->where(['user_recipient_id' => Yii::$app->user->identity->id])
                    ->orderBy('date_created')
                    ->all();
                    $this->view->params['userMessages'] = $messages;
            }
        }
    }
0
Thomas Rohde