понедельник, 27 июля 2015 г.

Ручная установка composer

Если вы разрабатываете web приложения с использованием PHP фреймворков и до сих пор не пользуетесь composer, то пришло время начать это делать. На самом деле composer очень удобная утилита управления PHP пакетами. Особенно удобным composer становится при командной разработке.

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

В этой статье я опишу процесс ручной установки утилиты composer на Windows и на Ubuntu. Причем установка будет глобальной для системы.

Да. Согласитесь, что само слово "глобальной" уже вызывает недоверие и сомнение у скептиков. Но это только в том случае, если вы не понимаете что делаете и зачем вы это делаете. В нашем случае, на самом деле, все очень просто: мы ставим composer глобально чтобы можно было его использовать из любого места системы (из любой папки). Как вы убедитесь ниже никаких глобальных супер-изменений системы мы не производим.

Установка composer в Windows 7

Для Windows существует инсталлятор и скачать его можно с офф-сайта проекта, но мы пойдем менее простым но зато понятным путем — установим composer вручную.

Первым делом, создадим новую папку "C:\Program Files\composer" и скачаем дистрибутив в эту папку (в самом низу страницы доступны релизы для ручного скачивания). В той же папке создадим файл composer.bat такого содержания:

@php "%~dp0composer.phar" %*

Теперь, пропишем путь к нашей папке в переменную окружения PATH и перегрузим систему. После чего composer буден доступен из любой папки. Откроем CMD, или ConEmu и введем команду:

$ composer -V

Кстати, нужно заметить, что в ConEmu вывод разноцветный, и воспринимается лучше чем в стандартном, монотонном CMD.

Если вы собираетесь работать с composer в корпоративной сети, с выходом в Интернет через прокси, то вам придется использовать команды composer'а в связке с командой SET. Например:

SET HTTP_PROXY=http://<proxy>:<port>
composer create-project symfony/framework-standard-edition my_project_name

Переменная окружения HTTP_PROXY устанавливается всего один раз для консольного сеанса и действует пока консоль не будет закрыта. Таким образом, все последующие команды composer'а можно вводить без команды SET.

У меня был случай, когда после переустановки ConEmu в другую папку, composer "упал" и отказывался работать. Решение проблемы нашел на офф-сайте.

Установка composer в Ubuntu

В Ubuntu, как и следовало ожидать, все попроще. Скачиваем дистрибутив в папку ~ (домашняя папка пользователя). В самом низу страницы доступны релизы для ручного скачивания. Далее выполняем последовательность команд:

$ sudo mv ~/composer.bin /usr/bin/composer
$ sudo chmod 755 /usr/bin/composer

Введите команду

$ composer -V

и получите версию утилиты.

Если говорить о прокси настройках для composer в Ubuntu, то здесь, опять же, все намного проще. А именно, в конец файла ~/.bashrc нужно добавить две строчки:

export http_proxy=http://<proxy>:<port>
export https_proxy=http://<proxy>:<port>
Таким образом, мы указали терминалу bash экспортировать две переменные при каждом его запуске.

Это все.

Текстовый редактор Atom

В последнее время, довольно большой популярности набирает текстовый редактор Atom, от команды Github. Одна из причин роста популярности Atom — его расширяемость. Функционал Atom легко расширяется подключением соответствующих пакетов. Помимо этого, Atom очень привлекательный на вид и удобный в использовании.

Важно понимать, что Atom не является полноценным IDE, таким как Netbeans или PhpStorm, например. Это простой текстовый редактор с расширенными возможностями, которые можно настраивать под свои нужды.

В этой статье я опишу как установить и настроить Atom для использования HTML, JavaScript, AngularJs и PHP.

Установка на Windows 7

Установка не вызывает затруднений — скачиваем установщик с офф-сайта и запускаем его. Настроек никаких особых не нужно производить кроме указания пути установки.

Установка на Ubuntu

В Ubuntu все также просто. В терминале выполняем последовательность команд:

$ sudo add-apt-repository ppa:webupd8team/atom
$ sudo apt-get update
$ sudo apt-get install atom

Если у вас соединение через прокси, то последовательность команд должна быть следующей:

export http_proxy=http://<proxy>:<port>
export https_proxy=http://<proxy>:<port>

$ sudo -E add-apt-repository ppa:webupd8team/atom
$ sudo apt-get update
$ sudo apt-get install atom

Установка пакетов

Установка пакетов производится проще простого — через интерфейс Atom

  • Для Windows — File → Settings → Install
  • Для Ubuntu — Edit → Preferences → Install

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

  1. atom-save-all — назначает сочетанию клавиш Ctrl + S сохранения всех измененных файлов. По умолчанию Atom сохраняет только активный файл.
  2. javascript-snippets — пакет для автоматического дополнения JavaScript NodeJS кода.
  3. AngularJS-Atom — пакет для автоматического дополнения AngularJS тегов и кода.
  4. autoclose-html — пакет для автоматического закрытия HTML тегов.
  5. atom-bootstrap3 — пакет для автоматического дополнения классов Twitter Bootstrap.
  6. autocomplete-php — пакет для автоматического дополнения PHP методов.
  7. color-picker — очень удобный пакет для подбора цветов.

Опять же, относительно прокси. В моем случае доступные пакеты в Atom отображаются, а вот установить их не получается никак — ни через интерфейс ни с помощью apm или npm. В таком случае, если пакет не имеет зависимостей от других пакетов, то он легко устанавливается копированием в папку ~/.atom/packages, где символ ~ означает домашний каталог пользователя.

Если кому-то интересно мое личное мнение об Atom, то скажу, что мне он понравился. Удобный в пользовании, настраиваемый функционал, приятный интерфейс.

среда, 22 июля 2015 г.

Консольный эмулятор ConEmu

Если вы пользователь ОС Windows, и не желаете переходить на Ubuntu, или другую Unix-подобную систему, то для более удобной работы с командной строкой я предлагаю установить очень мощный и удобный в использовании консольный эмулятор ConEmu.

Если же вы думаете, что командная строка вам не понадобится, так как вы используете Windows, то спешу заверить вас, что вы сильно ошибаетесь. Существует большое количество программ которые очень упрощают жизнь web разработчику. К таким программам относятся: composer, bower и git. Возможно, существуют графические варианты этих программ, но всегда удобнее будет работать с ними из консоли.

ConEmu — живой и довольно популярный проект заслуживающий внимания. И хотя ConEmu обладает огромными возможностями, я же наведу небольшой список тех из них, которые дают основательный повод заменить им обычный CMD. Итак:

  • открытие нескольких вкладок. Вкладки можно открывать как от обычного пользователя так и от имени администратора.
  • удобный copy/paste. Выделенный мышкой текст автоматически копируется в буфер, а вставка происходит по нажатию Ctrl + V.
  • подсветка текста разными цветами. Практически все вышеупомянутые вспомогательные программы подсвечивают свой вывод разными цветами. Это очень удобно по сравнению с монотонным выводом в CMD.

Об ConEmu рассказывать можно много, но лучше попробовать самому.

среда, 15 июля 2015 г.

Автозагрузка классов в PHP

Разрабатывая более-менее серьёзное web приложение с использованием OOP, очень часто приходится подключать классы используя инструкции require, require_once, include, include_once. При этом, как правило, каждый скрипт начинается из длинного списка подключаемых классов. Безусловно это проблема. Что если, например, изменится путь к какому то классу? В таком случае придется пройтись по всем файлам в котором используется этот класс и внести соответствующие изменения. К счастью для нас, разработчиков, предусмотрено решение этой проблемы.

В этой статье я очень подробно опишу процесс автозагрузки с практической точки зрения.

Немного истории

Давайте вспомним как мы делали в самом начале нашего пути изучения PHP, как мы только начинали использовать классы:

Файл index.php
<?php
  require_once 'src/User.php'
  $user = new User();

Как то так! При этом, мы подразумевали, что папка с нашими классами (src) находится в том же каталоге что и файл index.php. Это очень простой и бездумный вариант реализации, но очень трудно поддерживаемый в дальнейшем.

Функция __autoload()

Начиная с версии PHP 5, появился механизм автозагрузки классов и функция __autoload(), которая вызывается каждый раз, когда создается объект неизвестного класса. Единственное что оставалось разработчику, так это реализовать ее, и больше не было необходимости писать require. Вот как это выглядит на практике:

Файл index.php
  <?php
  function __autoload($class) {
    require_once "src/$class.php";
  }
  // далее можно просто создавать объекты
  $user = new User('Victor');

Следует заметить, что на сегодняшний день, функция __autoload() считается устаревшей и её использование не рекомендуется. Вместо неё, начиная с версии PHP 5.1.2 появился ряд методом, которые позволяют управлять процессом автозагрузки более гибко. Любопытному читателю я рекомендую почитать пост на хабре, в котором подробно описываются все эти методы и наводятся примеры их использования.

Автозагрузка классов из пространств имен

Быть может устаревший метод __autoload() Вам придется очень даже по душе (по своей простоте). Тем не менее, предлагаю пойти дальше и воспользоватся более продвинутыми возможностями версии PHP 5.3 — пространствами имен.

Автозагрузка классов из пространств имен подразумевает четко определенную структуру каталогов. К примеру, вот такая структура:

Здесь у нас объявлено два класса User и UserRepository. Описывая эти классы, мы должны указать пространство имен с помощью ключевого слова namespace.

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

В этом, конкретном случае, классы выглядят так:

Файл User.php
<?php
  namespace Project\Entity;
  class User implements \JsonSerializable {  
    private $id;
    ...
Файл UserRepository.php
<?php
  namespace Project\Repository;
  use Project\Entity\User;
  class UserRepository {
    protected $connect;
    ...

  public function all(){
    $user = new User();
  }

Теперь, давайте посмотрим, что представляет из себя класс NamespaceAutoloader. Вообще то ничего сложного:

Файл NamespaceAutoloader.php
<?php
class NamespaceAutoloader {

    protected $namespaceMap = array();

    public function addNamespace($namespace, $rootDir){
        if (is_dir($rootDir)){
            $this->namespaceMap[$namespace] = $rootDir;
            return true;
        }
        return false;
    }

    public function register(){
        spl_autoload_register(array($this, 'autoload'));
    }

    protected function autoload($class){
        $pathParts = explode('\\', $class);
        if (is_array($pathParts)){
            $namespace = array_shift($pathParts);
            if (!empty($this->namespaceMap[$namespace])){
                $filePath = $this->namespaceMap[$namespace].'/'.implode('/', $pathParts).'.php';
                require_once $filePath;
                return true;
            }
        }
        return false;
    }
}

Принцип действия приведенного автозагружчика следующий:

  1. Сперва мы регистрируем пространство имен. Для этой цели используется метод addNamespace(). Для регистрации пространства имен, нужно передать два параметра: название пространсва имен и путь к папке в которой размещены классы.
  2. Далее, вызовом метода register(), мы запускаем процесс автозагрузки.

В реальном примере, использование автозагружчика, выглядит таким образом:

Файл index.php
<?php
header('Content-type: application/json');

// Подключаем класс автозагружчика и создаем его экземпляр
require_once 'NamespaceAutoloader.php';
$autoloader = new NamespaceAutoloader();

// Регистрируем пространство имен и запускаем автозагрузку
$autoloader->addNamespace('Project', 'ServerSide');
$autoloader->register();

// Используем классы из пространства имен
use Project\Repository\UserRepository;

$userRepo = new UserRepository($connect);
echo json_encode($userRepo->all());

В приведенном примере, мы зарегистрировали пространство имен Project. Путь к папке с классами указываем относительно файла index.php.

Это весь код, который необходимо написать чтобы автоматически подгружался любой класс из пространства имен Project. Теперь мы можем создавать необходимые классы из любого файла приложения не используя инструкции типа include, как показано в листинге 4, например.

При создании поста использовались такие ресурсы:

  1. Механизм автозагрузки классов в PHP
  2. Автозагрузка классов в PHP с использованием SPL

Ярлыки

Популярные записи