<rmcreative>

RSS

Yii, автокомплит для Yii::app

4 августа 2011

Yii неплохо дополняется в различных IDE, но для этого его нужно немного настроить. После первоначальной настройки можно сделать ещё одну штуку, полезную, когда вы работаете исключительно с веб-приложием.

  • В index.php подключаем YiiBase.php вместо yii.php, дописываем свой класс с аннотацией для IDE:
require(dirname(__FILE__) . '/../framework/YiiBase.php');
 
class Yii extends YiiBase {
    /**
     * @static
     * @return CWebApplication
     */
    public static function app()
    {
        return parent::app();
    }
}
 
$config=dirname(__FILE__).'/../protected/config/main.php';
 
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
$app = Yii::createWebApplication($config)->run();

После всех манипуляций получим дополнение, например, для Yii::app()->user->.

Комментарии RSS

  1. №5129
    Максим
    Максим 04.08.2011, 22:07:09

    Как вариант - да, но хотелось бы нативной поддержки

  2. №5130
    Sam
    Sam 04.08.2011, 22:24:51

    А как тогда быть с CConsoleApplication?

  3. №5131
    Максим
    Максим 04.08.2011, 23:07:21

    С ними не имел дело, тут понятия не имею. Про нативную это я про поддержку средствами самого IDE.

  4. №5132
    Sam
    Sam 04.08.2011, 23:10:20

    IDE сейчас верно работают т.к. в коде Yii явно прописан класс CApplication, а не CWebApplication.

  5. №5134
    Максим
    Максим 04.08.2011, 23:23:33

    Это то понятно, но, для потомка CConsoleCommand можно было бы подсказать по CConsoleApplication, по аналогии и с CController.

  6. №5135
    Максим
    Максим 04.08.2011, 23:24:53

    Плохо что в IDE нет нечто вроде редактора символьной базы по коду. Так бы каждый смог настроить все под себя.

  7. №5136
    mrix
    mrix 05.08.2011, 6:55:16

    А почему нельзя поменять комментарий в фрэймворке?

  8. №5138
    Sam
    Sam 05.08.2011, 14:25:45

    mrix, в фреймворке два типа приложений: CWebApplication и CConsoleApplication. Если явно прописать CWebApplication, для консольного будут дополняться вещи, которых в нём нет.

  9. №5142
    mrix
    mrix 05.08.2011, 18:53:36

    Я понимаю. Я имел в виду, что я в фрэймворке меняю сам. Это комментарий, от которого зависит только удобство.

  10. №5143
    Sam
    Sam 05.08.2011, 20:01:29

    mrix, и так каждый раз при выходе новой версии?

  11. №5145
    Максим
    Максим 05.08.2011, 22:41:39

    2Sam, может ввести Console::app(), Web::app() ?

  12. №5146
    mrix
    mrix 06.08.2011, 8:06:27

    Да. С консольными приложениями работаю редко. Только команды по cron: рассылка писем, чистка базы, сбор статистики и т.п. Написал и забыл.

    Переименовать CApplication в CWebApplication требует немного времени. Новые версии выходят раз в 3 месяца.

  13. №5147
    mitallast
    mitallast 06.08.2011, 11:32:42

    А зачем вообще файл yiilite делать с расширением .php ? Интерпретатору глубоко пофиг, какой файл инклюдить. Я имею в виду, что можно переименовать файл в yiilite.phpcache например, тогда иде не будут считать этот файл типа php. Что-то подобное есть в Symfony 2.

  14. №5148
    Sam
    Sam 06.08.2011, 16:56:14

    Да, вариант, конечно. Хотя, в Yii2, скорее всего, lite вообще не будет.

  15. №5149
    mitallast
    mitallast 06.08.2011, 20:39:11

    На Yii2 посмотреть хочется. Мне в целом нравится минимализм фреймворка, нет нагромождения абстракций - но к сожалению много очень магии, из-за которой люди, не слишком то знакомые с фреймворком, начинают делать велосипеды =(

  16. №5151
    Sam
    Sam 06.08.2011, 22:59:32

    mitallast, если есть 20 постов на официальном форуме, можно поучаствовать в обсуждении.

  17. №5156
    Андрей
    Андрей 09.08.2011, 13:40:14

    Sam

    mitallast, если есть 20 постов на официальном форуме, можно поучаствовать в обсуждении.

    Ссылка битая.

  18. №5157
    Sam
    Sam 09.08.2011, 17:18:09

    Она не битая. Просто у вас, скорее всего, нет 20-и постов.

  19. №5492
    Виталий
    Виталий 12.10.2011, 15:37:19

    Почему после такой настройки CWebLogRoute выводит только логи БД?

  20. №5493
    Sam
    Sam 12.10.2011, 17:22:11

    Эта настройка к логам отношения не имеет.

  21. №5494
    Виталий
    Виталий 12.10.2011, 18:20:28

    Поэтому я и задался вопросом, почему так происходит. Если описание класса Yii положить в корень фреймворка и заинклудить из index.php то логи работают нормально.

  22. №5653
    grigori
    grigori 09.12.2011, 14:27:20

    спасибо, классная идея - писать класс yii в index.php

    только надо исключить из ide нативный класс

  23. №5703
    Алексей
    Алексей 22.12.2011, 15:21:02

    Сделал эту штуку, спасибо за совет. В строке "Yii::app()->user->id" слово "user" перестало подсвечивать жёлтым, отлично. Но теперь жёлтым подсвечивает "id". Это можно как-то исправить, или геттеры настроить нельзя?

    (Здесь user имеет тип WebUser, наследуемый от CWebUser.)

  24. №5704
    Sam
    Sam 22.12.2011, 17:35:06

    Можно, если в вашем WebUser прописать @property integer $id id of the user в его phpdoc.

  25. №5705
    Алексей
    Алексей 22.12.2011, 17:48:43

    Так ведь это свойство явно не определено, оно берётся методом getId().

    (Кроме того, его явное добавление в WebUser не помогло, потому что PhpStorm считает, что user имеет тип CWebUser.)

  26. №5707
    Sam
    Sam 23.12.2011, 17:21:31

    Ну вот как раз при помощи @property мы подсказываем IDE, что оно есть. Вообще в 1.1.9 будут везде расставлены эти мета-теги, так что дополнять будет в разы лучше изначально.

  27. №5928
    Sasha_ch
    Sasha_ch 19.02.2012, 23:38:36

    Супер! Пользуюсь PHPStorm. Сегодня осознал что мне нужно что-то типа автокомплита, т.к. для меня это своего рода хелп. Настроил ИДЕ по http://yiiframework.ru/doc/cookbook/ru/ide + по методу данного посту.

    почему-то у меня с require(dirname(FILE) . '/../framework/YiiBase.php'); возникает на всех страницах проекта ошибка: Cannot redeclare class cbaseactiverelation in Y:\home\framework\YiiBase.php on line 399

    ..если кто с этим сталкивался - просьба откликнуться в чем там проблема. (за 30 минут не разобрался). Yii ver.:1.1.10

    Кстати, в итоге сделал в index.php так : if($_SERVER['HTTP_HOST']=='IDE'){ $yii=(dirname(FILE).'/../framework/YiiBase.php'); class Yii extends YiiBase { /** * @static * @return CWebApplication */ public static function app() { return parent::app(); } } require_once($yii); }

    ($_SERVER['HTTP_HOST']=='IDE' - умышленно не актуальный хост. Но в phpstrom автокомплит работает!!!

    Как "плюс" в этом я вижу что не надо ничего править при закачке на боевой сервер.

  28. №5929
    Sasha_ch
    Sasha_ch 19.02.2012, 23:41:27

    ..сори проглядел кнопку "код"

    /////для IDE
    if($_SERVER['HTTP_HOST']=='IDE'){
        $yii=(dirname(__FILE__).'/../framework/YiiBase.php');
        class Yii extends YiiBase {
            /**
             * @static
             * @return CWebApplication
             */
            public static function app() {
                return parent::app();
            }
        }
        require_once($yii);
    }
  29. №6582
    Дмитрий
    Дмитрий 18.08.2012, 22:11:41

    Использую Yii 1.1.12-dev. IDE PhpStorm.

    Sam, не подскажешь, есть ли возможность, при расширении компонента, прописав в нем phpDoc, сделать автокомплит новых методов.

    К примеру я расширяю класс CWebUser

    class WebUser extends CWebUser {
        public function getLoginUrl() {
           ...
        }
    }

    Можно ли как-то сделать, чтобы IDE при автокомплите показывала и мой метод getLoginUrl?

  30. №6584
    Sam
    Sam 23.08.2012, 1:39:25

    Можно. В своём классе Yii прописать @property и свой application, в нём уже пользователя.

  31. №6585
    Дмитрий
    Дмитрий 23.08.2012, 9:42:16

    Спасибо большое, Sam.

  32. №6651
    redbook
    redbook 17.09.2012, 12:50:18

    Большое спасибо, недавно приобрел phpStorm, как раз в Yii не хватало нормлаьного автокомплита.

  33. №7332
    Александр
    Александр 29.12.2012, 22:00:10

    Все отлично, но зачем $app?

  34. №7335
    Sam
    Sam 30.12.2012, 19:47:19

    Александр, незачем, в общем-то.

  35. №7858
    Mazaj
    Mazaj 29.04.2013, 18:39:32

    хммм...

    делаю в storm вот так: $transaction = Yii::app()->db->beginTransaction();

    чуть ниже $transaction->(Ctrl+Space) и тишина ...

    быстренько открыл тот же файл в netbeans и все нормально, даже без yii плагинов

  36. №7859
    Mazaj
    Mazaj 29.04.2013, 18:47:17

    после вопроса все заработало)) походу надо было перезагрузить и все таки, я правильно понял Storm индексирует файлы только через phpdoc?

  37. №7862
    Sam
    Sam 30.04.2013, 0:18:25

    Mazaj, нет, не только через phpdoc.

  38. №8201
    standalone
    standalone 25.07.2013, 17:54:09

    Вот не знаю, хоть убейте, но phpDesigner гораздо удобнее в плане автокомплита и вывода подсказок по методам, и плагинов никаких не нужно ставить.

  39. №8316
    DenisOgr
    DenisOgr 05.09.2013, 15:35:09

    Спасибо. Все четко работает!

  40. №8565
    Stas
    Stas 14.11.2013, 16:03:37

    Мне для Yii больше нравится Codelobster

    Тут есть специальный плагин для автокомплита и помощи.

  41. №8636
    Visteras
    Visteras 27.11.2013, 11:59:14

    Угу, автодополнение получил... но само приложение работать перестало. Это так и должно быть? Просто белый экран...

  42. №8801
    meliorator
    meliorator 06.02.2014, 17:41:02

    Для версии Yii 1.1.13 для автокомплита в PhpStorm можно просто в файл yii.php внутрь класса Yii закинуть вот такое

    /**
         * @static
         * @return CWebApplication
         */
        public static function app()
        {
            return parent::app();
        }
  43. №8986
    Павел
    Павел 25.04.2014, 9:30:43

    2meliorator Спасибо:)

  44. №9121
    zazu
    zazu 24.07.2014, 10:24:55

    Круто, очень полезно. Также важно взять на заметку то, что если делать require($pathToYiiBase); до других define-ов в индексном файле, то они не будут учитываться в define-ах в файле YiiBase.php.

  45. №9170
    Рамазан
    Рамазан 10.09.2014, 4:39:38

    Вставлю свои пять копеек, т.к. считаю, что в индексе ничего лишнего не должно быть.

    1. Создаём в проекте файл phpdoc.php в корне проекта.
    2. Добавляем этот файл в игнор VCS
    3. Прописываем в phpdoc.php нужные классы.

    Например:

    /**
     * Class Yii
     * @method static CWebApplication app()
     */
    class Yii extends YiiBase {}
     
    /**
     * Class Yii
     * @property ComponenClassName $componentId
     */
    class CWebApplication extends CApplication {}
  46. №10008
    Максим
    Максим 06.10.2015, 11:45:42

    Отличное решение, но автокомплит для Yii::app()-> предлагает только дефолтные компоненты. Можно ли сделать так чтобы он предлагал и свои? Компоненты унаследованы от CApplicationComponent и прописаны в конфиге в секции components. Пользуюсь штормом 9 версии

  47. №10010
    zazu
    zazu 06.10.2015, 17:24:37

    Максим, нужно phpdoc property добавить с типом и названием.

  48. №10011
    Максим
    Максим 07.10.2015, 10:21:52

    @zazu а можете пример привести? Что-то никак не подставляет :/

  49. №10015
    zazu
    zazu 07.10.2015, 19:16:48

    Максим, почитайте о phpdoc'ах. Пример: @property MyCustomComponent $myCmp И вы получаете подсказку myCmp для свойства Yii::app()

  50. №10017
    Максим
    Максим 08.10.2015, 10:34:33

    @zazu, благодарю :)

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.