Как написать глобальные функции в Yii2 и получить к ним доступ в любом представлении (не пользовательским способом)

Yii1.1 имел класс CComponent, который имел CBaseController, который был базовым классом для CController. Был /защищенный / компоненты / контроллер.класс php, который позволил получить доступ к любой функции в этом классе в любом представлении.

Yii2 больше не обладают классом CComponent. The коде с Yii2 руководство указывает, что "Yii разбивает 2.0 в компонент права класса в 1.1 на два класса: объектные базы в Yii\и Yiiбазыкомпонент". Кто-нибудь знает, как писать глобальный функции в Yii2 и их в любом представлении, как и в Yii1.1 Использование / защита / компоненты / контроллер.РНР?

несколько похожих тем обсудить нестандартные ответы, но я хотел бы знать, существует ли официальный способ сделать это, не принято так.

8 ответов


Выполните Действие:
1) создайте следующий каталог "backend / components"
2) Создайте " 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) Создайте свою страницу просмотра действий " индекс.php " (like)

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

функции контроллера недоступны на вид.

В Yii1 представление, прикрепленное к контроллеру, тогда как в Yii2 представление присоединяется к View класс (это было одно из основных изменений в Yii2). Это разделяет контроллер и логику представления, но также усложняет глобальные функции, как вы заметили.

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();

один из вариантов-создать файл (возможно, в каталоге компонентов), в котором есть ваши функции:

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

а затем включите его в свой :

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

недостатком является то, что теперь это выходит за рамки ООП приложения. Я использовал этот метод для создания dd() (сбросьте и умрите) функция как Laravel имеет.


вы также можете сделать компоненты в YII2

создать каталог и файл так же, как в YII1 в frontend и backend, и написать ниже код в нем

интерфейс / компоненты / контроллер.в 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-приложение-основные. [Примечание: структура каталогов может отличаться для коде с Yii2-приложения-дополнительные.]

Моя Структура Каталогов:

->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();
        }
    }
}

UsersController.в 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();
    }
  }
    .
    .
    .
}

так, всякий раз, когда это UsersController.в PHP контроллер войдет в учетную запись, сначала init() метод будет вызван, и в init() метод CommonController метод checkLoginAccess() автоматически получит вызов. Таким образом, всякий раз, когда член не имеет acess входа, он/она будет автоматически выход.

надеюсь, это поможет. Любой Проблема/вопрос, не стесняйтесь спрашивать.


легко вы можете создать компонент:

<?php

namespace frontend\components;

use yii\base\Component;

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

зарегистрируйте его как компонент в своем :

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()?>">

Я не начал 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;
            }
        }
    }