Как написать глобальные функции в 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;
}
}
}