Phpstorm не работает автодополнение

CodeIgniter и PhpStorm — автодополнение

Из-за специфичной организации CodeIgniter (а именно способа подключения классов) связи между объектами получаются не очевидными до интерпретации и PhpStorm, как и другие IDE, их не распознаёт, и оттого автодополнение не работает почти что совсем.

Но не стоит переживать — решения есть.

Системные и пользовательские модели и библиотеки.

Отличное решение было предложено в phpStorm-CC-Helpers, на основе которого и были сделаны эти решения.

Суть решения в том, что все свойства (и, с помощью них, связи) можно прописать через @property в комментарии перед объявлением классов.

/**
* @property CI_DB_active_record $db This is the platform-independent base Active Record implementation class.
* @property CI_DB_forge $dbforge Database Utility Class
*/

Точно так же можно (или нужно) описать и свои модели:

/**
* @property Model_class_name $name_in_this
* @property User_model $user Just model for users
*/

В итоге получается вот такой набор свойств:

/**
* @property CI_DB_active_record $db This is the platform-independent base Active Record implementation class.
* @property CI_DB_forge $dbforge Database Utility Class
* @property CI_Benchmark $benchmark This class enables you to mark points and calculate the time difference between them.
Memory consumption can also be displayed.
* @property CI_Calendar $calendar This class enables the creation of calendars
* @property CI_Cart $cart Shopping Cart Class
* @property CI_Config $config This class contains functions that enable config files to be managed
* @property CI_Controller $controller This class object is the super class that every library in.
CodeIgniter will be assigned to.
* @property CI_Email $email Permits email to be sent using Mail, Sendmail, or SMTP.
* @property CI_Encrypt $encrypt Provides two-way keyed encoding using XOR Hashing and Mcrypt
* @property CI_Exceptions $exceptions Exceptions Class
* @property CI_Form_validation $form_validation Form Validation Class
* @property CI_Ftp $ftp FTP Class
* @property CI_Hooks $hooks Provides a mechanism to extend the base system without hacking.
* @property CI_Image_lib $image_lib Image Manipulation class
* @property CI_Input $input Pre-processes global input data for security
* @property CI_Lang $lang Language Class
* @property CI_Loader $load Loads views and files
* @property CI_Log $log Logging Class
* @property CI_Model $model CodeIgniter Model Class
* @property CI_Output $output Responsible for sending final output to browser
* @property CI_Pagination $pagination Pagination Class
* @property CI_Parser $parser Parses pseudo-variables contained in the specified template view,
replacing them with the data in the second param
* @property CI_Profiler $profiler This class enables you to display benchmark, query, and other data
in order to help with debugging and optimization.
* @property CI_Router $router Parses URIs and determines routing
* @property CI_Session $session Session Class
* @property CI_Sha1 $sha1 Provides 160 bit hashing using The Secure Hash Algorithm
* @property CI_Table $table HTML table generation
Lets you create tables manually or from database result objects, or arrays.
* @property CI_Trackback $trackback Trackback Sending/Receiving Class
* @property CI_Typography $typography Typography Class
* @property CI_Unit_test $unit_test Simple testing class
* @property CI_Upload $upload File Uploading Class
* @property CI_URI $uri Parses URIs and determines routing
* @property CI_User_agent $user_agent Identifies the platform, browser, robot, or mobile devise of the browsing agent
* @property CI_Validation $validation //dead
* @property CI_Xmlrpc $xmlrpc XML-RPC request handler class
* @property CI_Xmlrpcs $xmlrpcs XML-RPC server class
* @property CI_Zip $zip Zip Compression Class
* @property CI_Javascript $javascript Javascript Class
* @property CI_Jquery $jquery Jquery Class
* @property CI_Utf8 $utf8 Provides support for UTF-8 environments
* @property CI_Security $security Security Class, xss, csrf, etc.
* @property CI_Driver_Library $driver CodeIgniter Driver Library Class
* @property CI_Cache $cache CodeIgniter Caching Class
*
* User models:
* @property User_model $user User Class
* @property Main_model $main_model Main model
* @property Admin_model $admin Admin model
*/

Далее этот комментарий нужно выставить перед CI_Model и CI_Controller, то есть сразу в два места, что неудобно. Эту проблему можно решить просто: данный комментарий назначить классу-родителю, а CI_Model и CI_Controller наследовать от него. И здесь появляются два варианта:

Вариант 1.

В этом варианте код проекта не меняется вообще: используются инструменты среды PhpStorm.

К написанному выше большому комментарию со свойствами дописываем несколько строчек, а получившийся класс CIPS.php сохраняем где-нибудь вне проекта.

/**
* @property CI_DB_active_record $db This is the platform-independent base Active Record implementation class.
* .
* @property Admin_model $admin Admin model
*/

class CI_Controller extends CIPS < >
class CI_Model extends CIPS

Подключаем его как внешнюю библиотеку (External Libraries -> Configure PHP Include Paths).

Далее, чтобы имеющиеся в system/core CI_Model и CI_Controller не перебивали свойства, помечаем их как текстовые файлы (Mark as Plain Text). Ни для работы сайта ни для его разработки это не повредит — правка этих двух классов либо крайне редка либо её вовсе не бывает (если Вы успели изменить эти классы, то для Вас ниже есть вариант 2).

Всё, теперь после набора $this PhpStorm предложит так недостающий ранее db .

То есть, в результате имеем внешнюю библиотеку (CIPS.php) и помеченные как тестовые файлы Controller.php и Model.php в папке system/core.

Пример получившегося CIPS.php можно посмотреть здесь: ссылка.

При добавлении новых моделей стоит не забывать их добавлять в свойства объекта CIPS.

Если же Вы успели заметно исправить эти два системных класса, то вариант 1 вряд ли Вас устроит — ссылаться PhpStorm будет не на классы из системной папки, а на внешнюю библиотеку и, соответственно, вручную добавленные методы автозаполняться не будут.

Автозаполнение можно сделать добавив все функции в класс CIPS, например:

class CI_Controller extends CIPS <
public function __construct ( ) < >
/**
* @return CI_Controller
*/
public static function & get_instance ( ) < >
/**
* @return string
*/
public function print_page ( $data = null ) < >
>

Но вот проблему ссылок это не решит. В таком случае Вас может спасти второй вариант.

Вариант 2.

В этом варианте уже нет никаких внешних библиотек, все изменения вносятся непременно в код проекта.

Здесь объявление класса CIPS не меняется, меняется объявление классов CI_Model и CI_Controller: они будут наследоваться от CIPS уже в папке system/core.

  1. В корень проекта (рядом с index.php), вставляем этот CIPS.php, который уже выглядит так: ссылка.
  2. Подключаем его в index.php (или любой иной файл, который выполняется раньше классов из ядра CodeIgniter):
    include ( ‘CIPS.php’ ) ;
  3. CI_Model и CI_Controller наследуем от CIPS:
    class CI_Controller extends CIPS <
    .
    >

class CI_Model extends CIPS <
.
>

Всё, теперь автозаполнение и ссылки будут работать с методами, находящимися в системных классах.

Active Records (DB_active_rec.php)

В этом классе проблема автозаполнения заключается в следующем (метод chaining не поюзаешь):

То есть, этот метод (всего таких 42 в этом классе) не отдаёт в return ссылку на нужный объект ( CI_DB_active_record или CI_DB_result ). Это происходит из-за некорректного описания функции:

/**
* From
*
* Generates the FROM portion of the query
*
* @param mixed can be a string or array
* @return object
*/
public function from ( $from )

Решить можно двумя способами:

  1. Убрать весь комментарий или хотя бы строку с @return .
  2. Прописать корректный @return : /**
    * From
    *
    * Generates the FROM portion of the query
    *
    * @param mixed can be a string or array
    * @return CI_DB_active_record
    */
    public function from ( $from )

И да, это придётся проделать с каждым методом в этом классе, которому прописан некорректный @return.

Это решение так же можно сделать в двух вариантах: во внешней библиотеке (с помечанием системного класса system/database/DB_active_rec.php как текстового) и непосредственно изменяя этот класс.

В любом случае результат радует:

Полностью исправленный DB_active_rec можно посмотреть здесь: ссылка.

Источник

Автодополнение SQL кода прямо в редакторе PHPStorm

В PHPStorm есть встроенная возможность подключения автодополнения имен таблиц и полей в редакторе кода, однако не все об этом знают.

Если у вас код отображается примерно так, то прошу под кат.

Шаг 1. Подключение базы данных

Устанавливаем курсор в область SQL кода, у меня она выделена красным, и нажимаем Alt+Enter. Выбираем Configure Data Source

В открывшемся окошке выбираем JDBC драйвер, в данном случае MySQL, и, если нужно, нажимаем Click here. Выбираем какую-нибудь папку, где хотим разместить файлы, и нажимаем OK.

После того как шторм скачает драйвер, выбираем JDBC driver class.
В поле Database URL выбираем шаблон и меняем настройки на ваши, также указываем имя пользователя и пароль.

Если все сделали правильно, после нажатия на кнопку Test Connection появится подобное окошко.

Шаг 2. Выбираем SQL Dialects

SQL код в редакторе все еще красный. Бежим в настройки.
FileSettingsSQL Dialects
Напротив папки или отдельного файла нажимаем на keywords only и выбираем MySQL.
Теперь код в редакторе поменял цвет, и даже наверняка подсветились используемые поля, однако автодополнения все еще нет, точнее оно есть, но там нет ни полей, ни таблиц.

Шаг 3. Добавляем автодополнение

В данном случае этот шаг дела вкуса. Возможно вы не захотите автодополнения полей прямо в редакторе, ведь вы можете редактировать отдельно SQL код.
Для этого установите курсор в область SQL кода, нажмите Alt+Enter и выберите нечто вроде Edit MySQL fragment. В открытой области будет автодополнение полей и таблиц.

Но если вы все-таки решили не останавливаться, то устанавливаем курсор в SQL код, нажимаем Alt+Enter и выбираем Language Injection Settings.
В появившемся окошке щелкаем по php: «SQL select/delete/insert/update/create» и выбираем MySQL.

Все! Должно работать. Еще советую нажать в автодополнении на букву А в нижнем правом углу, если у вас там она, и переключиться на Sort by relevance.

UDP.
Пользователь Ramzeska подсказывает, что последний шаг можно выполнить зайдя в настройки проекта
«Language Inspections» => «PHP SQL select/delete. » ( в выпадающем меню попап-окна надо выбрать MySQL)

Источник

PhpStorm зависает и зависает при редактировании кода

Я испытал резкое падение производительности PhpStorm. IDE, которая работала очень хорошо (без каких-либо заметных признаков задержки ответа), стала вялой и зависала на долю секунды каждый раз, когда выполнялось автозаполнение.

Несмотря на доступную память 16 ГБ (и увеличение максимальной памяти для программы в настройках PhpStorm до 2 ГБ) IDE не использует дополнительную память и по-прежнему зависает каждые несколько секунд. Ни одно из доступных в Интернете предложений по отключению ненужных плагинов, очистке индексов или замене памяти не было успешным. Уменьшение уровня выделения не влияет на описанные проблемы.

Вопрос : есть ли другой способ восстановить нормальную производительность без отключения некоторых жизненно важных функций IDE?

3 ответа

Мне удалось выявить причину резкого падения производительности, о которой идет речь. Причиной этого было добавление в проект библиотек Gulp, которые, казалось, были больше, чем PHPStorm мог индексировать в реальном времени.

Решение : исключите каталог node_modules из индексации. Для этого перейдите в Настройки> Каталоги , выберите node_modules и отметьте его как исключенный. Ваша производительность PHPStorm должна вернуться в норму.

Раньше я сталкивался с подобными проблемами с производительностью. Я использовал следующие варианты:

  1. Увеличьте память кучи до 4 ГБ
  2. Исключить папки из индексации
  3. Отключите некоторые плагины (в прошлый раз проблема была с плагином PHP Inspections)

У меня тоже была эта проблема, но node_modules уже был исключен (я думаю, что PHPStorm делает это по умолчанию).

Я только что исключил расположение скомпилированных файлов. В моем случае это была вся общая папка. (Используя Laravel и Elixir.)

Источник

Читайте также:  Как управлять телефоном через компьютер если не работает дисплей
Оцените статью