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でグローバル関数を記述し、それらを任意のビューで記述する方法を知っている人はいますか?
似たようなトピックがいくつかあります カスタム回答について話し合います ですが、カスタムの方法ではなく、公式の方法があるかどうかを知りたいと思います。
次のステップ:
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();
?>
ビューではコントローラー機能にアクセスできません。
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();
コンポーネントを簡単に作成できます。
<?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()?>">
1つのオプションは、関数を含むファイル(おそらくコンポーネントディレクトリ内)を作成することです。
function myFunction($parameters)
{
// Do stuff and return stuff
}
次に、それをindex.php
ファイルに含めます。
require_once(__DIR__ . "../components/MyGlobalFunctions.php');
欠点は、これがアプリケーションのOOPスコープ外にあることです。このメソッドを使用して、Laravel hasのようなdd()
(ダンプアンドダイ)関数を作成しました。 。
として、質問はすでに答えられています。しかし、それでも私は将来の使用のためにそれに答えたいと思います。
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()
は自動的に呼び出しを取得します。したがって、ログインアクセスがないメンバーは、自動的にログアウトになります。
それが役立つことを願っています。問題/質問があれば、遠慮なく質問してください。
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
}
Yii2はまだ起動していませんが、静的関数を使用して同様の機能を実現できるはずです。
次の内容で「MyGlobalFunctions.php」と言うクラスを作成します
<?php
class MyGlobalFunctions{
public static function myFunction($args){
// logic here
return someValu here
}
}
あなたの見解では、この関数を次のように呼び出すことができます
MyGloabalFunctions::myFunction($args);
私は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;
}
}
}