2015-07-27 2 views
5

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

Yii2 больше не обладает классом CComponent. Yii2 guide указывает, что «Yii 2.0 разбивает класс CComponent в 1.1 на два класса: yii \ base \ Object и yii \ base \ Component». Кто-нибудь знает, как писать глобальные функции в Yii2 и их в любом представлении, точно так же, как в Yii1.1, используя /protected/components/Controller.php?

Несколько похожих тем discuss custom answers, но я хотел бы знать, есть ли официальный способ сделать это, а не обычай.

+0

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

ответ

6

Выполните шаг:
1) создать следующие директории "бэкэнда/компоненты"
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) создать действие вид страницы «index.php» (как)

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

Логика делает все это за исключением того, что в представлении это должно быть '$ this-> context-> Hello()' вместо '$ this-> Hello()' – intumwa

1

Вы также можете сделать компоненты в 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; 

    } 
} 

После этого использовать его в каждом контроллере, расширяя этот класс, как this-

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

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

Создать класс, скажем «MyGlobalFunctions.php» со следующим содержанием

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

в ваших взглядах вы можете вызвать эту функцию

MyGloabalFunctions::myFunction($args); 
+0

, это именно то, что классы помощников делают – MacGyer

2

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

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

и п включить его в свой файл index.php:

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

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

5

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

В 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(); 
+0

неработающим. ........................ –

+0

@ ЮрийСветлов Вы правильно пропустили класс? – Sammaye

+0

Да. Возможно, вам нужно добавить запись в /baisc/config/web.php -? И как это сделать? –

1

As, вопрос уже дан ответ. Но, тем не менее, я бы хотел ответить на него в будущем.

Я пользуюсь yii2-app-basic. [ПРИМЕЧАНИЕ: Структура каталогов может отличаться для 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() получит вызов автоматически. Таким образом, всякий раз, когда у члена, у которого нет логина, он автоматически будет вышел из системы.

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

0

Я новичок в 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

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

<?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()?>"> 
Смежные вопросы