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

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

iSergium

Из-за специфичной организации 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).

Mark as Plain Text

Всё, теперь после набора $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 можно посмотреть здесь: ссылка.

Комментарии

Andkorol 10.02.2016 15:28:33
Если в DB_active_rec.php заменить «@return CI_DB_active_record» на «@return CI_DB_active_record|CI_DB_result» – то в автокомплит добавятся также методы генерации результатов запроса (result_array(), row(), etc).
Вопрос: как заюзать автокомплит при создании собственных библиотек?
После получения суперобъекта CodeIgniter через get_instance() автокомплит пропадает напрочь (((
Stas Ustimenko 29.12.2016 13:32:15
Для CodeIgniter еще есть очень хороший плагин в Коелобстере: http://www.codelobster.com/codeigniter.html