
Из-за специфичной организации 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 CIPS{};
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.
Пошагово:
- В корень проекта (рядом с index.php), вставляем этот CIPS.php, который уже выглядит так: ссылка.
- Подключаем его в index.php (или любой иной файл, который выполняется раньше классов из ядра CodeIgniter):
include ('CIPS.php');
- 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)
Решить можно двумя способами:
- Убрать весь комментарий или хотя бы строку с @return.
- Прописать корректный @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 можно посмотреть здесь: ссылка.
Комментарии
Вопрос: как заюзать автокомплит при создании собственных библиотек?
После получения суперобъекта CodeIgniter через get_instance() автокомплит пропадает напрочь (((