Импорт файлов в Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
egorpromo
Сообщения: 113
Зарегистрирован: 2012.11.25, 12:24

Импорт файлов в Yii2

Сообщение egorpromo »

Как в Yii2 делать импорт файлов? Интересует как делать импорт файлов:
а) в конфиге, чтобы эти файлы были доступны в веб-приложении везде
б) в любом другом месте, например, в контроллере. В Yii1 это делалось с помощью Yii::import()
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Импорт файлов в Yii2

Сообщение vova07 »

1) Для любого компонента в конфиге доступен параметр 'class' в котором достаточно прописать полный нэймспэйс нужного класса. После этого класс можно юзать в любом месте приложения через Yii::$app->myComponent;
2) Так как Yii2 полностью написан на нэймспэйсах, то для загрузки любого файла, достаточно просто прописать use my\namespace\MyClass; и использовать данный класс по имени $var = new MyClass; в контроллере или в любом другом файле.
egorpromo
Сообщения: 113
Зарегистрирован: 2012.11.25, 12:24

Re: Импорт файлов в Yii2

Сообщение egorpromo »

Спасибо за ответ.
tar_m
Сообщения: 140
Зарегистрирован: 2012.12.26, 07:37

Re: Импорт файлов в Yii2

Сообщение tar_m »

Код: Выделить всё

/** @see YiiBase::setAlias(); */
Yehor
Сообщения: 1
Зарегистрирован: 2015.06.24, 14:49

Re: Импорт файлов в Yii2

Сообщение Yehor »

Несовсем понятный ответ на вышезаданый вопрос. Ранее в YII1 в параметре import конфигурационного файла мы указывали алиас который указывал на расположение импортируемых файлов. Как??? параметр 'class' в котором мы прописываем полный нэймспэйс нужного класса может указать на расположение самого файла с классом ведь неймспейс ето всего лишь часть имени класса.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Импорт файлов в Yii2

Сообщение ElisDN »

Yehor писал(а):Как??? параметр 'class' в котором мы прописываем полный нэймспэйс нужного класса может указать на расположение самого файла с классом ведь неймспейс ето всего лишь часть имени класса.
Как искался раньше по алиасу 'application.components.service.MyClass', так и ищется теперь по имени класса с неймспейсом app\components\service\MyClass.

У корневой папки сайта базовый неймспейс app. У каждого компонента в папке vendor - свой. Остальной путь неймспейса совпадает с папками. Так что если вписали

Код: Выделить всё

$object = new \app\components\service\MyClass();
или

Код: Выделить всё

use app\components\service\MyClass;
$object = new MyClass();
то и будет искаться файл components/service/MyClass.php.
ishpanec
Сообщения: 50
Зарегистрирован: 2014.01.11, 18:32

Re: Импорт файлов в Yii2

Сообщение ishpanec »

это все конечно здорово, но как быть если надо использовать сторонний плагин, который написан не на namespace ?
переписывать тонны кода то еще извращение
DeaTh
Сообщения: 41
Зарегистрирован: 2010.05.09, 14:30

Re: Импорт файлов в Yii2

Сообщение DeaTh »

ishpanec писал(а):это все конечно здорово, но как быть если надо использовать сторонний плагин, который написан не на namespace ?
переписывать тонны кода то еще извращение
Working with Third-Party Code
ishpanec
Сообщения: 50
Зарегистрирован: 2014.01.11, 18:32

Re: Импорт файлов в Yii2

Сообщение ishpanec »

DeaTh писал(а):Working with Third-Party Code
я правильно понимаю, что мне надо использовать вот это

Код: Выделить всё

Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
где-то после

Код: Выделить всё

require(__DIR__ . '/my/vendor/yiisoft/yii2/Yii.php');
ishpanec
Сообщения: 50
Зарегистрирован: 2014.01.11, 18:32

Re: Импорт файлов в Yii2

Сообщение ishpanec »

все разобрался, для этого надо в index.php (или где удобнее) подключить свой класс который не имеет namespace

Код: Выделить всё

Yii::$classMap['Class1'] = 'path/to/Class1.php'; 
затем нужно выйти из пространства имен и где надо (например в action) использовать свой класс

Код: Выделить всё

$myClass1 = new \Class1(); 
слеш перед \Class1() - обязательно! это и есть выход из пространства имен.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Импорт файлов в Yii2

Сообщение Onotole »

ishpanec писал(а): это и есть выход из пространства имен.
Это есть глобальное пространство имен
ishpanec
Сообщения: 50
Зарегистрирован: 2014.01.11, 18:32

Re: Импорт файлов в Yii2

Сообщение ishpanec »

Onotole писал(а):Это есть глобальное пространство имен
ну да, забыл слово "текущее" (пространство имен)
yakoval
Сообщения: 7
Зарегистрирован: 2013.04.08, 12:17

Re: Импорт файлов в Yii2

Сообщение yakoval »

Всем привет!

1. Правильно ли понял, что если у меня сотня моделей, то их все нужно каждый раз подключать вот так?

Код: Выделить всё

use common\models\Country;
use common\models\City;
...
То есть былого раздела import

Код: Выделить всё

 'import' => array(
        'application.models.*',)
в конфиге yii2 нет?

2. При динамическом задании имени класса автозагрузка не работает. Это норма? Как с сим работать?
Например есть файл Helper.php

Код: Выделить всё

namespace common\components;
use common\models\Region;

class Helper 
{
    ...
    public static function getArray($modelName)
    {
        $model = new $modelName();
        ...
    }
} 
Вызов

Код: Выделить всё

use common\models\Region;
Helper::getArray('Region');

падает с ошибкой Class 'Region' not found.
Если new $modelName() заменить на жестко прописанное new Region(), всё работает нормально.

Помогите, пожалуйста!
И конечно, всех с праздниками - пучть в новом году все запускается, мёрджится и отрабатывает как по маслу!
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Импорт файлов в Yii2

Сообщение Onotole »

На оба вопроса ответ один.
Это неймспейсы (пространства имен).
Во втором случае необходимо указать полное имя класса включая пространство имен: common\components\Helper
yakoval
Сообщения: 7
Зарегистрирован: 2013.04.08, 12:17

Re: Импорт файлов в Yii2

Сообщение yakoval »

Onotole, спасибо за ответ, но вопрос не о том "что это за слеши в названии классов", хех

1. Вопрос о том, как не писать "use Html" в каждом из множества view-файлов! Наверняка это можно сделать 1 раз где-то, неужели нет?

2. Оказалось, для этого есть метод

Код: Выделить всё

Yii::createObject($className)
!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Импорт файлов в Yii2

Сообщение ElisDN »

yakoval писал(а):1. Вопрос о том, как не писать "use Html" в каждом из множества view-файлов! Наверняка это можно сделать 1 раз где-то, неужели нет?
Выбросить Блокнот и поставить любую нормальную IDE.
yakoval писал(а):2. Оказалось, для этого есть метод createObject($className)
Это для другого.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Импорт файлов в Yii2

Сообщение zelenin »

yakoval писал(а):Onotole, спасибо за ответ, но вопрос не о том "что это за слеши в названии классов", хех

1. Вопрос о том, как не писать "use Html" в каждом из множества view-файлов! Наверняка это можно сделать 1 раз где-то, неужели нет?

2. Оказалось, для этого есть метод

Код: Выделить всё

Yii::createObject($className)
!
дело в том, что пять (где вы были эти пять лет?) назад в php введены неймспейсы, и вся работа с классами ведется на основе их ПОЛНОГО (с неймспейсом) имени. Как с ними работать вы можете узнать из документации (google => php namespaces). Форум не место обучения по справочным вопросам.
yakoval
Сообщения: 7
Зарегистрирован: 2013.04.08, 12:17

Re: Импорт файлов в Yii2

Сообщение yakoval »

ElisDN писал(а):
yakoval писал(а):1. Вопрос о том, как не писать "use Html" в каждом из множества view-файлов! Наверняка это можно сделать 1 раз где-то, неужели нет?
Выбросить Блокнот и поставить любую нормальную IDE.
Но IDE не влияет на интерпритацию кода? :)
Если имеете ввиду подсветку синтаксиса, то вопрос не о ней, разумеется. Похоже, не понял Вас.
ElisDN писал(а):
yakoval писал(а):2. Оказалось, для этого есть метод createObject($className)
Это для другого.
Но он же ищет класс в контейнере имём, где можно описать необходимое соответствие (напр., 'Region' к 'common\models\Region') специально для динамических указаний имён создаваемых классов.

zelenin писал(а):
yakoval писал(а):Onotole, спасибо за ответ, но вопрос не о том "что это за слеши в названии классов", хех

1. Вопрос о том, как не писать "use Html" в каждом из множества view-файлов! Наверняка это можно сделать 1 раз где-то, неужели нет?

2. Оказалось, для этого есть метод

Код: Выделить всё

Yii::createObject($className)
!
дело в том, что пять (где вы были эти пять лет?) назад в php введены неймспейсы, и вся работа с классами ведется на основе их ПОЛНОГО (с неймспейсом) имени. Как с ними работать вы можете узнать из документации (google => php namespaces). Форум не место обучения по справочным вопросам.
Работал с внутрикорпоративными фреймворками, в которых воплощено описанное мною выше оперирование с namespaces (на вопрос "как" ответить не могу - ушёл с этого места).
А вот с переходом на Yii2 запоздал.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Импорт файлов в Yii2

Сообщение ElisDN »

yakoval писал(а):Но IDE не влияет на интерпритацию кода?
IDE автоматически ставит use, чтобы не прописывать их вручную.
yakoval писал(а):где можно описать необходимое соответствие (напр., 'Region' к 'common\models\Region') специально для динамических указаний имён создаваемых классов
Можно и без соответствия обойтись:

Код: Выделить всё

Helper::getArray('\common\models\Region'); 
yakoval
Сообщения: 7
Зарегистрирован: 2013.04.08, 12:17

Re: Импорт файлов в Yii2

Сообщение yakoval »

ElisDN писал(а):IDE автоматически ставит use, чтобы не прописывать их вручную.
Ого, а в PHPStorm есть такой дивный помощник? Не смог найти. Правда, использую 5 версию.
ElisDN писал(а): Можно и без соответствия обойтись:

Код: Выделить всё

Helper::getArray('\common\models\Region'); 
Вот тут хочется именно динамической передачи типа объекта в метод в виде "Region" (без пространства имён, которое можно принять одинаковым в рамках этого метода). Хотя, хм, можно попробовать

Код: Выделить всё

'\common\models\' . $className

Не блестяще, но уже что-то. Спасибо за наводку.
Ответить