Composer json в другой папке. Введение в Composer

Всем привет. Сегодня мы поговорим о том, что такое пакетные менеджеры , и рассмотрим один из них - composer .

Для начала разберемся, для чего нужны пакетные менеджеры ? Пакетные менеджеры помогают через консоль буквально в паре строк скачать все пакеты, зависимости, какие-то фреймворки, плагины, используемые языком программирования. В нашем случае composer - это пакетный менеджер для языка программирования php .

Чтобы показать вам, как работает composer, давайте скачаем фреймворк yii

Итак, зайдите на сайт http://getcomposer.org/ и нажмите кнопку "Getting Started" . Теперь нажмите Installation - *nix , чтобы установить его на Mac или Linux . Откройте терминал и вставьте следующие команды:

1) $ curl -sS https://getcomposer.org/installer | php

2) $ mv composer.phar /usr/local/bin/composer

После того, как вы все сделали, введите команду composer и, если у вас появилась большая надпись "COMPOSER" и некоторая информация, то вы все сделали правильно и composer успешно установился.

Чтобы установить composer на Windows , перейдите по ссылке https://getcomposer.org/doc/00-intro.md#installation-windows и скачайте инсталятор. Если во время установки у вас будут выскакивать ошибки библиотек, то просто зайдите в файл php.ini и отключите те библиотеки, которые не дают установится пакетному менеджеру composer .

После того, как composer установлен, перейдите на рабочий стол и создайте папку с названием "composer" . Теперь в консоли перейдите в нее

Cd Desktop/composer/

Чтобы инициализировать composer, введите команду

Composer init

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

Продолжим устанавливать наш фреймворк. Как я уже сказал, вводим

Search for a package:

Введите тут название нашего фреймворка

Search for a package: yii

Вы увидите перед собой все совпадения, которые нашел composer . Наш нужно yiisoft/yii Слева в квадратных скобках стоит номер. В моем случае это 0 , я ввожу его и нажимаю enter. Дальше нам нужно ввести версию. А откуда вообще composer все это качает? Есть такой сайт, где хранится много всякой всячины - http://packagist.org/ Там введите в строке поиска yii и перейдите по первой ссылке, там вы увидите, что версия называется dev-master . Введите это в консоль и нажмите enter.

Do you confine generation?

Выше этой надписи вы можете видеть, как выглядит файл composer.json . Это как раз таки тот файл, который вы дадите новому сотруднику.

Итак, нас все устраивает, нажимаем enter.

Теперь, если вы зайдете в нашу папку на рабочем столе composer , то увидите, что там появился наш json файл.

Теперь введите в консоль команду

Composer install

После того, как установка будет закончена, в нашей папке на рабочем столе появится новая папка с именем vendor , где хранятся все файлы нашего фреймворка.

Вот так легко работать с пакетным менеджером composer , а главное, что теперь вам не придется скачивать все вручную. Достаточно один раз сделать json файл и затем просто использовать его для скачки и установки нужных вам фреймворком, плагинов, библиотек и прочего.

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

Глобальная установка (Global)

Несмотря на то, что данная опция доступно описана в документации, Composer может (а в большинстве случаев должен) быть установлен глобально. Глобальная установка означает, что вместо:

Php composer.phar somecommand
Вы можете в любом проекте просто ввести:

Composer somecommand
Это позволяет очень просто создавать новые проекты (например, с помощью команды create-project ) в любом месте вашей файловой системы.

Для установки Composer глобально, следуйте этим инструкциям .

Правильная установка зависимостей

При чтении вводных инструкций или README файлов многие напишут вам что-то вроде:
Just add the following to your composer.json file :
{ "require": { "myproject": "someversion" } }

Но данный подход имеет несколько недостатков. Во-первых, простой копипаст может привести к возникновению ошибок. Во-вторых, для новичка может быть не очевидно, где разместить данный код, если у него и так уже имеется обширный файл composer.json , и это также привести к ошибке. Наконец, некоторые люди будут иметь дело с Composer впервые, а возможно и впервые столкнутся с командной строкой. Поэтому хорошей практикой будет освещение всевозможных случаев, в которых новички могут чувствовать себя неуверенно (есть ли у них графический редактор или они будут использовать командную строку? Если второе, установлен ли в ней текстовый редактор, и если да, то какой? Объясняете ли вы саму процедуру редактирования файла? А что если файла composer.json ещё не существует в проекте? Описываете ли также принцип создания нового файла?).

Наилучший способ добавить новую зависимость в файл composer.json - это воспользоваться командой require :

Composer require somepackage/somepackage:someversion
Это добавит все необходимое в файл зависимостей, минуя ручное вмешательство.

Если вам нужно добавить пакеты в раздел require-dev , добавьте в команду опцию --dev :

Composer require phpunit/phpunit --dev
Также, команда require поддерживает добавление нескольких пакетов одновременно, для этого просто разделите их пробелом.

Файлы блокировок

Файл composer.lock сохраняет текущий список установленных зависимостей и их версии. Таким образом, на момент, когда версии зависимостей уже будут обновлены, другие люди, которые будут клонировать ваш проект, получат те же самые версии. Это позволяет убедиться в том, что каждый, кто получает ваш проект, имеет “пакетное окружение”, идентичное тому, которое вы использовали при разработке, и помогает избежать ошибок, которые могли бы возникнуть из-за обновления версий.

Также, файл composer.lock содержит хэш файла composer.json , так что, если вы даже просто обновляете данные об авторе проекта, вы получите предупреждение о том, что файл блокировки не соответствует .json файлу. В таком случае, поможет команда composer update --lock , которая обновит только сам файл блокировки, не касаясь ничего другого.

Версионирование

При указании допустимых версий пакетов можно использовать точное соответствие (1.2.3 ), диапазоны с операторами сравнения (<1.2.3 ), комбинации этих операторов (>1.2.3 <1.3 ), “последняя доступная” (1.2.* ), символ тильды (~1.2.3 ) и знак вставки (^1.2.3 ).

Последние два указания достойны отдельного объяснения:

  • указание тильды (~1.2.3 ) будет включать в себя все версии до 1.3 (не включительно), так как в семантическом версионировании это является моментом внедрения новых функциональных возможностей. В данном случае будет получена последняя из стабильных минорных версий. Как гласит документация, при данном указании изменяться может только последняя цифра версии.
  • указание знака вставки (^1.2.3 ) буквально означает “опасаться только критических изменений” и будет включать в себя версии вплоть до 2.0 . Применительно к semver, изменение мажорной версии является моментом внесения в проект критических изменений, так что версии 1.3 , 1.4 и 1.9 подходят, в то время как 2.0 - уже нет.
Кроме случая, когда вы знаете, что вам нужна конкретная версия пакета, я рекомендую всегда использовать формат ~1.2.3 - это самый безопасный выбор.

Локальная и глобальная конфигурация

Значения параметров по-умолчанию не высечены на камне. Подробное описание возможных параметров конфигураций (config ) см. по ссылке .

Например, указав:
{ "config": { "optimize-autoloader": true } }
вы заставляете Composer оптимизировать classmap после каждой установки или обновления пакетов (или, другими словами, всякий раз, когда генерируется файл автозагрузки классов). Это немного медленнее, чем создание автозагрузчика по-умолчанию, и замедляется при росте проекта.

Ещё одним полезным параметром может быть cache-files-maxsize . В больших проектах (как eZ Publish или Symfony) кэш может заполниться довольно быстро. Увеличение размера кэша позволить Composer работать быстро дольше.

Обратите внимание, что параметры конфигурации могут быть установлены глобально, и в таком случае будут действовать на все проекты (см. config). Например, чтобы глобально установить параметр размера кэша, нужно либо отредактировать файл ~/.composer/config.json , либо выполнить:

Composer config --global cache-files-maxsize "2048MiB"

Профилирование и подробный вывод (verbose)

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

Memory usage: 174.58MB (peak: 513.47MB), time: 54.7s
Но также в начало каждой строки вывода будет добавлено время выполнения команды и использованный размер памяти:

Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
Я использую данную опцию для определения “медленных” пакетов и для наблюдения за улучшением или ухудшением производительности на .

Подобно предыдущему, параметр --verbose заставит Composer выводить больше информации о каждой выполняемой операции, давая вам понять, что именно происходит в данный момент. Некоторые люди даже устанавливают composer --verbose --profile псевдонимом команды composer по-умолчанию.

Пользовательские источники

Если ваш проект ещё не на Packagist, иногда вам нужно просто установить пакет с GitHub (например, если пакет ещё находится в разработке). Для этого см. наше руководство .

Когда у вас есть своя версия популярного пакета, от которого зависит ваш проект, вы можете использовать пользовательские источники в сочетании с контекстными псевдонимами (inline aliasing), чтобы подставить собственную ветку для публичного пакета, как Matthieu Napoli.

Ускорение Composer

Используя отличный метод, описанный Mark Van Eijk , вы можете ускорить выполнение Composer, вызывая его через HHVM.

Ещё один способ - с помощью параметра --prefer-dist , при установке которого Composer будет скачивать стабильные, запакованные версии проекта, вместо клонирования из системы контроля версий (что значительно медленнее). Этот параметр используется по-умолчанию, так что вам не нужно включать его на стабильных проектах. Если вам нужно загрузить проект из исходников, используйте параметр --prefer-source . Подробнее об этом можно узнать в разделе install .

Уменьшение размера проекта Composer

Если вы разработчик «Composer-friendly» проектов, данная часть вас также заинтересует. По этому посту в Reddit , вы можете с помощью файла .gitattributes игнорировать некоторые файлы и папки во время упаковки пакета для режима --prefer-dist .
/docs export-ignore /tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore /.travis.yml export-ignore /phpunit.xml export-ignore
Как это работает? Когда вы загружаете проект на GitHub, он автоматически делает доступным ссылку “Download zip” , с помощью которой вы можете скачать архив вашего проекта. Более того, Packagist использует эти автоматически сгенерированные архивы для скачивания зависимостей с опцией --prefer-dist , которые он затем локально разархивирует (намного быстрее клонирования исходных файлов проекта). Если вы при этом добавите в .gitattributes тесты, документацию и прочие файлы, не имеющие отношения к логике работы проекта, указанные архивы не будут их содержать, став гораздо легче.

При этом людям, которые захотят отладить вашу библиотеку или запустить тесты, нужно будет указать параметр --prefer-source .

PhpLeague приняла этот подход и включила его в свой «скелет пакета» (Package skeleton), так что любой основанный на нем проект автоматически будет “dist friendly” .

Show

Если вы вдруг забыли, какую версию PHP или его расширения используете, или вам нужен список всех установленных проектов (с описанием каждого) с их версиями, вы можете использовать команду show с параметрами --platform (-p ) и --installed (-i ):

composer show --installed

$ composer show --installed behat/behat v3.0.15 Scenario-oriented BDD framework for PHP 5.3 behat/gherkin v4.3.0 Gherkin DSL parser for PHP 5.3 behat/mink v1.5.0 Web acceptance testing framework for PHP 5.3 behat/mink-browserkit-driver v1.1.0 Symfony2 BrowserKit driver for Mink framework behat/mink-extension v2.0.1 Mink extension for Behat behat/mink-goutte-driver v1.0.9 Goutte driver for Mink framework behat/mink-sahi-driver v1.1.0 Sahi.JS driver for Mink framework behat/mink-selenium2-driver v1.1.1 Selenium2 (WebDriver) driver for Mink framework behat/sahi-client dev-master ce7bfa7 Sahi.js client for PHP 5.3 behat/symfony2-extension v2.0.0 Symfony2 framework extension for Behat behat/transliterator v1.0.1 String transliterator components/bootstrap 3.3.2 The most popular front-end framework for developing responsive, mobile first projects on the web. components/jquery 2.1.3 jQuery JavaScript Library doctrine/annotations v1.2.4 Docblock Annotations Parser doctrine/cache v1.4.1 Caching library offering an object-oriented API for many cache backends doctrine/collections v1.3.0 Collections Abstraction library doctrine/common v2.5.0 Common Library for Doctrine projects doctrine/dbal v2.5.1 Database Abstraction Layer doctrine/doctrine-bundle v1.4.0 Symfony DoctrineBundle doctrine/doctrine-cache-bundle v1.0.1 Symfony2 Bundle for Doctrine Cache doctrine/inflector v1.0.1 Common String Manipulations with regard to casing and singular/plural rules. doctrine/instantiator 1.0.4 A small, lightweight utility to instantiate objects in PHP without invoking their constructors doctrine/lexer v1.0.1 Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers. egulias/listeners-debug-command-bundle 1.9.1 Symfony 2 console command to debug listeners ezsystems/behatbundle dev-master bd95e1b Behat bundle for help testing eZ Bundles and projects ezsystems/comments-bundle dev-master 8f95bc7 Commenting system for eZ Publish ezsystems/demobundle dev-master c13fb0b Demo bundle for eZ Publish Platform ezsystems/demobundle-data v0.1.0 Data for ezsystems/demobundle ezsystems/ezpublish-kernel dev-master 3d6e48d eZ Publish API and kernel. This is the heart of eZ Publish 5. ezsystems/platform-ui-assets-bundle v0.5.0 External assets dependencies for PlatformUIBundle ezsystems/platform-ui-bundle dev-master 4d0442d eZ Platform UI Bundle ezsystems/privacy-cookie-bundle v0.1 Privacy cookie banner integration bundle into eZ Publish/eZ Platform fabpot/goutte v1.0.7 A simple PHP Web Scraper friendsofsymfony/http-cache 1.3.1 Tools to manage cache invalidation friendsofsymfony/http-cache-bundle 1.2.1 Set path based HTTP cache headers and send invalidation requests to your HTTP cache guzzle/guzzle v3.9.3 PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle hautelook/templated-uri-bundle 2.0.0 Symfony2 Bundle that provides a RFC-6570 compatible router and URL Generator. hautelook/templated-uri-router 2.0.1 Symfony2 RFC-6570 compatible router and URL Generator imagine/imagine 0.6.2 Image processing for PHP 5.3 incenteev/composer-parameter-handler v2.1.0 Composer script handling your ignored parameter file instaclick/php-webdriver 1.0.17 PHP WebDriver for Selenium 2 jdorn/sql-formatter v1.2.17 a PHP SQL highlighting library knplabs/knp-menu v1.1.2 An object oriented menu library knplabs/knp-menu-bundle v1.1.2 This bundle provides an integration of the KnpMenu library kriswallsmith/assetic v1.2.1 Asset Management for PHP kriswallsmith/buzz v0.13 Lightweight HTTP client league/flysystem 0.5.12 Many filesystems, one API. liip/imagine-bundle 1.2.6 This Bundle assists in imagine manipulation using the imagine library monolog/monolog 1.13.1 Sends your logs to files, sockets, inboxes, databases and various web services nelmio/cors-bundle 1.3.3 Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony2 application ocramius/proxy-manager 0.5.2 A library providing utilities to generate, instantiate and generally operate with Object Proxies oneup/flysystem-bundle v0.4.2 Integrates Flysystem filesystem abstraction library to your Symfony2 project. pagerfanta/pagerfanta v1.0.3 Pagination for PHP 5.3 phpdocumentor/reflection-docblock 2.0.4 phpspec/prophecy v1.4.1 Highly opinionated mocking framework for PHP 5.3+ phpunit/php-code-coverage 2.0.16 Library that provides collection, processing, and rendering functionality for PHP code coverage information. phpunit/php-file-iterator 1.4.0 FilterIterator implementation that filters files based on a list of suffixes. phpunit/php-text-template 1.2.0 Simple template engine. phpunit/php-timer 1.0.5 Utility class for timing phpunit/php-token-stream 1.4.1 Wrapper around PHP"s tokenizer extension. phpunit/phpunit 4.6.4 The PHP Unit Testing framework. phpunit/phpunit-mock-objects 2.3.1 Mock Object library for PHPUnit psr/log 1.0.0 Common interface for logging libraries qafoo/rmf 1.0.0 Very simple VC framework which makes it easy to build HTTP applications / REST webservices sebastian/comparator 1.1.1 Provides the functionality to compare PHP values for equality sebastian/diff 1.3.0 Diff implementation sebastian/environment 1.2.2 Provides functionality to handle HHVM/PHP environments sebastian/exporter 1.2.0 Provides the functionality to export PHP variables for visualization sebastian/global-state 1.0.0 Snapshotting of global state sebastian/recursion-context 1.0.0 Provides functionality to recursively process PHP variables sebastian/version 1.0.5 Library that helps with managing the version number of Git-hosted PHP projects sensio/distribution-bundle v3.0.21 Base bundle for Symfony Distributions sensio/framework-extra-bundle v3.0.7 This bundle provides a way to configure your controllers with annotations sensio/generator-bundle v2.5.3 This bundle generates code for you sensiolabs/security-checker v2.0.2 A security checker for your composer.lock swiftmailer/swiftmailer v5.4.0 Swiftmailer, free feature-rich PHP mailer symfony-cmf/routing 1.3.0 Extends the Symfony2 routing component for dynamic routes and chaining several routers symfony/assetic-bundle v2.6.1 Integrates Assetic into Symfony2 symfony/monolog-bundle v2.7.1 Symfony MonologBundle symfony/swiftmailer-bundle v2.3.8 Symfony SwiftmailerBundle symfony/symfony v2.6.6 The Symfony PHP framework tedivm/stash v0.12.3 The place to keep your cache. tedivm/stash-bundle v0.4.2 Incorporates the Stash caching library into Symfony. twig/extensions v1.2.0 Common additional features for Twig that do not directly belong in core twig/twig v1.18.1 Twig, the flexible, fast, and secure template language for PHP white-october/pagerfanta-bundle v1.0.2 Bundle to use Pagerfanta with Symfony2 whiteoctober/breadcrumbs-bundle 1.0.2 A small breadcrumbs bundle for Symfony2 zendframework/zend-code 2.2.10 provides facilities to generate arbitrary code using an object oriented interface zendframework/zend-eventmanager 2.2.10 zendframework/zend-stdlib 2.2.10 zetacomponents/base 1.9 The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package. zetacomponents/feed 1.4 This component handles parsing and creating RSS1, RSS2 and ATOM feeds, with support for different feed modules (dc, content, creativeCommons, geo, iTunes). zetacomponents/mail 1.8.1 The component allows you construct and/or parse Mail messages conforming to the mail standard. It has support for attachments, multipart messages and HTML mail. It also interfaces with SMTP to send mail or IMAP, P... zetacomponents/system-information 1.1 Provides access to common system variables, such as CPU type and speed, and the available amount of memory.

Репетиции (Dry Runs)

Чтобы просто посмотреть, пройдет ли установка новых зависимостей успешно, вы можете использовать параметр --dry-run для команд install и update . Composer в данном случае выведет все потенциальные проблемы без непосредственного выполнения самой команды. Никаких реальных изменений в проекте не произойдет. Этот прием отлично подходит для тестирования сложных зависимостей и настройки изменений перед реальным их внесением.

Composer update --dry-run --profile --verbose

Создание проекта

Последнее, но не менее важное, что мы должны упомянуть - это команда create-project .

Команда создания проекта принимает в качестве аргумента имя пакета, который она затем клонирует и выполняет composer install внутри него. Это отлично подходит для инициализации проектов - не нужно больше искать Url нужного пакета на GitHub, клонировать его, самому переходить в папку и выполнять команду install .

Крупные проекты, такие как Symfony и Laravel, уже используют данный подход для инициализации своих «skeleton» приложений, и многие другие также присоединяются.

Например, в Laravel это используется следующим образом:

Composer create-project laravel/laravel --prefer-dist --profile --verbose
В команду create-project можно передать еще два параметра: путь , в который нужно установить проект (если не указан, используется имя пакета), и версия (будет использована последняя, если не указать).

Заключение

Надеюсь, данный список советов и приемов использования оказался для вас полезным. Если мы что-то упустили, расскажите нам об этом, и мы обновим статью. И помните, если вы забыли какие-либо команды или опции, просто загляните в шпаргалку . Happy Composing!

Composer - менеджер зависимостей для PHP (Dependency Manager for PHP) или пакетный менеджер (зависимости это пакеты - логически законченные сторонние или собственные наработки, использующиеся в проекте).

Установить лучше глобально. Для OSX в терминале вводим

Curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer

Composer

Если всё правильно, то вы увидите список команд. Значит можно использовать composer.

1. Как создавать новый проект в composer?

Все зависимости composer хранит в файле composer.json, на вопрос "почему именно JSON?" разработчики Composer отвечают "Потому что. Просто примите это.".

Создать этот файл можно командой

Composer init (или php composer.phar init)

Композитор проведёт вас по нескольких шагам - название проекта, описание, лицензия. Для вас важен шаг, где composer просит указать пакет, который хотите установить. Он предложит поискать пакет (search for a package), где вы вводите, например, "yii" и поиск предлагает все пакеты для yii, имеющиеся на сайте packagist.org. Выбрав то, что вам надо composer создаст в папке вашего проекта файл composer.json, со всеми описанными зависимостями.

Теперь осталось их только установить командой:

Composer install

Все. Теперь в вашем проекте появилось все что вы хотели скачать.

2. Как создать проект из готового пакета через composer?

Делается это командой create-project ("Create new project from a package into given directory.") в папке, где хотите создать папку проекта.

Например возьмём пакет продвинутой заготовки для приложения на yii2 (https://packagist.org/packages/yiisoft/yii2-app-advanced). Значит этот пакет загрузили на packagist.org.

Composer create-project yiisoft/yii2-app-advanced yii2advanced 2.0.0-beta

yii2advanced - указываете название вашего проекта (папки на компьютере)
2.0.0-beta - версия (смотрим какие версии есть на packagist.org)

После этой команды composer скачивает пакет, и устанавливает все зависимости к нему (вам не надо искать по разным сайтам необходимые расширения - composer находит их сам).

3. Обновлять пакет.

Командой

(Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.) - обновляет все установленные (или установит заново случайно удалённые) пакеты до свежих версий. А может и не обновлять версии до самых свежих, если создать специальный composer.lock файл — это позволяет зафиксировать комбинацию из стабильных версий всех используемых в проекте библиотек;

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

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

А именно - начать использовать менеджер зависимостей для PHP - Composer . Он позволит нам легко устанавливать разные полезные вещи на сайт, обновлять их и даже удалять. Если вы уже работали с менеджером пакетов GNU/Linux - то вам всё это будет очень знакомо.

В качестве разминки, удалим Fenom из директории core и установим через Composer. Для этого нужно в корне сайта создать файл composer.json и прописать в нём требуемые пакеты (подробнее можно прочитать на Хабре):
{ "require": { "php":">=5.3.0", "fenom/fenom": "2.*" } } Теперь нужно только скачать composer.phar и запустить его в корне сайта:
php composer.phar install На modhost.pro и качать ничего не нужно - просто запускаем composer в директории:
composer install И волшебным образом у нас появляется директория /vendor/ с установленным Fenom. Что же с ним делать дальше?

Принцип работы

Давайте немного остановимся, и я объясню, как именно функционирует Composer, если вы еще не знаете.

Composer - это менеджер пакетов, который работает с ними согласно правил в composer.json . То, что мы там напишем, и будет устанавливаться.

При установке пакетов Composer пробегается по их правилам и генерирует самый важный файл - /vendor/autoload.php , который загружает все скачанные классы. Нам, выходит, нужно только подключить этот файл в своём проекте, и с этих пор мы можем запускать свои классы без require :
$Fenom = new Fenom::factory($tplDir, $compileDir); То есть, система уже знает, где физически находится Fenom и нам не нужно делать reuire_once("путь к fenom"). Также нам не нужно держать сам Fenom в своём проекте, достаточно хранить там наш composer.json .

Еще раз, для закрепления:

  1. Пишем composer.json
  2. Устанавливаем пакеты через composer.phar
  3. Подключаем в проект /vendor/autoload.php
  4. Используем любые установленные классы через new Class()
Лишних файлов в проекте нет, лишних require нет, установленные пакеты обновляются через тот же composer:
php composer.phar update Всё очень просто и удобно. Стоит только раз использовать такую схему работы и велосипедить дальше уже просто невозможно!

Подключаем Fenom

Для работы с установленными пакетами нам нужно просто добавить autoload.php в наш класс Core :
function __construct(array $config = array()) { $this->config = array_merge(array("controllersPath" => dirname(__FILE__) . "/Controllers/", "templatesPath" => dirname(__FILE__) . "/Templates/", "cachePath" => dirname(__FILE__) . "/Cache/", "fenomOptions" => array("auto_reload" => true, "force_verify" => true,),), $config); // Например, вот тут require_once dirname(dirname(__FILE__)) . "/vendor/autoload.php"; } Из метода getFenom() теперь можно выбросить проверку и подключение файлов, а также загрузку его классов. Итоговый метод выглядит так:
public function getFenom() { if (!$this->fenom) { try { if (!file_exists($this->config["cachePath"])) { mkdir($this->config["cachePath"]); } $this->fenom = Fenom::factory($this->config["templatesPath"], $this->config["cachePath"], $this->config["fenomOptions"]); } catch (Exception $e) { $this->log($e->getMessage()); return false; } } return $this->fenom; } Просто вызываем Fenom::factrory - и он сам загрузится. Вот коммит с изменениями - смотрите, сколько кода мы убрали сразу из своего проекта!

Зачем нам таскать с собой Fenom и обновлять его вручную, если давно придуман Composer, который об этом позаботится гораздо лучше? Всё, что нам нужно - положить в корень проекта composer.json .

Давайте теперь отрефакторим и наш собственный проект, чтобы он также подключался в autoload.php.

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

Отсюда следует два вывода: Composer можно использовать только в PHP 5.3+, и наш проект нужно переписать так, чтобы он использовал пространства имён.

Первым делом, нужно определить имя для нашего проекта. Пусть будет Brevis - от латинского «короткий». Теперь наша директория /core/ - это пространство имён Brevis. Значит:

  • Класс Core становится \Brevis\Core и находится в core\Core.php
  • Класс Controller становится \Brevis\Controller и находится в core\Controller.php
  • Класс Controlles_Home становится \Brevis\Controllers\Home и находится в core\Controllers\Home.php
  • Класс Controlles_Test становится \Brevis\Controllers\Test и находится в core\Controllers\Test.php
Обратите внимание, что физическое расположение файлов совпадает с пространством имён. Это потому, что мы уже следуем стандарту PSR-4 .

Теперь в начале каждого класса пишем используемое пространство имён. У основных классов это:
PhpStorm сразу начинает подсвечивать нам все использования Exception и Fenom как неправильные, потому что они вызываются внутри пространства имён, но без указания полного имени. Тут 2 варианта исправления:

  1. Пробежаться по всему коду и добавить к именам этих классов \, чтобы было \Exception и \Fenom
  2. Не страдать фигнёй, а использовать псевдонимы - возможность указать короткое имя для класса
Конечно, выбираем второй вариант:
Теперь переименовываем контроллеры и указываем в них псевдонимы:

Перемещаем autoload.php из класса \Brevis\Core в index.php, потому что пространство имён Brevis у нас скоро и само будет работать через автозагрузку и лишние require ему не нужны.

Index.php теперь выглядит вот так:
require_once dirname(__FILE__) . "/vendor/autoload.php"; $Core = new \Brevis\Core(); $req = !empty($_REQUEST["q"]) ? trim($_REQUEST["q"]) : ""; $Core->handleRequest($req);
Метод \Brevis\Core::handleRequest() переписываем, убирая всякие проверки файлов. Нам нужно проверять только наличие класса, используя get_class() :
public function handleRequest($uri) { $request = explode("/", $uri); $className = "\Brevis\Controllers\\" . ucfirst(array_shift($request)); /** @var Controller $controller */ if (!class_exists($className)) { $controller = new Controllers\Home($this); } else { $controller = new $className($this); } $initialize = $controller->initialize($request); if ($initialize === true) { $response = $controller->run(); } elseif (is_string($initialize)) { $response = $initialize; } else { $response = "Возникла неведомая ошибка при загрузке страницы"; } echo $response; } Как видите, мы определяем полное имя загружаемого контроллера, проверяем его наличие, а если такого контроллера нет - загружаем \Brevis\Controllers\Home .

В общем, вся логика осталась прежней, а количество кода сократилось. Нет ручной работы с файлами, нет никаких require, вся работа по подключению классов лежит на autoload.php. Соотвественно, и параметр controllersPath из системного конфига пропадает.

Осталось добавить и наш собственный проект в автозагрузку. Для этого меняем composer.json вот так:
{ "name": "Brevis", "autoload": { "psr-4": { "Brevis\\": "core/" } }, "require": { "php": ">=5.3.0", "fenom/fenom": "2.*" } } Блок autoload указывает, что загружать дополнительно, кроме установленных пакетов. Ключ psr-4 указывает, как именно загружать наш проект, и указывает директорию core/ как основную для пространства имён Brevis .

Запускаем
php composer.phar update и наши классы попадают в автозагрузку. Всё должно работать, смотрим изменения на GitHub .

Заключение

Вот мы и переписали наш проект в соотвествии с последними стандартами в мире программирования на PHP. Согласитесь, было не так уж и страшно?

Зато теперь наш код чистенький, опрятненький, соотвествует стандартам и отлично работает!

На следующем занятии мы установим через Composer xPDO 3.0 (да-да, он уже переписан и поддерживает namespaces, хоть пока и только в dev-ветке) и подключим его к нашей БД.

Напишем схему, сгенерируем по ней модель и создадим пару таблиц.

Я писал о том, как создать свой автозагрузчик классов на php. Но автозагрузку классов для своего проекта можно сделать и с помощью менеджера зависимостей для PHP - Composer . Это особенно актуально, если проект достаточно большой и планируется использование Composer в качестве установки сторонних библиотек (зависимостей).

Для внесения своих данных в файлы автозагрузчика Composer, нужно внести изменения в файл composer.json , а если его еще нет в корне приложения – создать.
Создание осуществляется с помощью выполнения в командной строке, например в консоли OpenServera:
composer init
Перед этим нужно перейти в корневой каталог приложения.
Если Composer установлен не глобально, то вместо composer нужно писать php composer.pha r.

При этом будет предложено ввести данные по названию проекта, автору, предложено сразу вписать нужные зависимости. Эти данные не имеют отношения к автозагрузке классов. В принципе, можно вообще создать самому файл composer.json и разместить там в фигурных скобках только объект autoload :
{ "autoload": { "psr-4": { "Services\\": "services", "App\\": "app" } } }
Если же создавать данный файл с помощью команды composer init или использовать файл который уже имеется (если объект autoload отсутствует), то нужно поставить запятую после последнего элемента (но до последней фигурной скобки) и вписать блок autoload.

Согласно примера, для пространства имен начинающегося с Services должна подключаться папка с названием services , находящаяся в корне приложения. С App аналогично.
То есть, например, класс Services\Application должен находиться в папке services/Application.php , тогда Composer автоматически подключит его.

Раздел autoload может включать и другие подразделы: classmap, files.

Подраздел classmap отвечает за описание классов, именование которых не соответствует стандарту PSR-4 . То есть, в карте классов мы просто указываем где искать определенные классы. Например:
"classmap": [ "services/myserv/", "services/myserv/Ksl.php" ]
Тут первым элементом массива classmap указываем каталог в котором нужно искать требуемые файлы классов. При этом не уточняем название класса.
Вторым элементом показан пример указания конкретного файла класса, чтобы Composer не приходилось искать в папке services/myserv что-то еще. Конечно стоит прописывать или первый или второй вариант.

Подраздел files отвечает за описание файлов, которые нам необходимо подключать в самом начале исполнения приложения. Например это настройки приложения - config.php . Вместо того, чтобы подключать его в index.php :
require_once "../config.php"; можно указать, чтобы его подключил Composer:
"files": [ "config.php" ] в данном случае подключится файл config.php находящийся в корне приложения (там же где и файл composer.json куда это прописываем). Можно подключить любой файл указав путь к нему.

То есть структура блока autoload может включать разные компоненты:
"autoload": { "classmap": [ "services/myserv/Ksl.php" ], "psr-4": { "Services\\": "services", "liw\\": "" }, "files": [ "config.php" ] }
После вписывания нужного кода в объект autoload, сохраняем изменения и далее нужно выполнить обновление файлов автозагрузчика Composer. Если файл composer.json вы сами перед этим создавали, то файлов автозагрузчика еще и вовсе нет. Для того, чтобы они появились, выполните
composer install создастся папка vendor, а в ней папка composer с файлами автозагрузки. Там же будет файл autoload_psr4.php в котором перезаписаны наши правила поиска классов согласно стандарта psr-4 и аналогичные файлы для карты классов и файлов.

Если папка vendor с данными файлами уже была, а вам нужно изменить данные для подключения своих классов, то нужно выполнить команду:
composer dump-autoload -o которая обновит файлы автозагрузчика Composer и при этом не будут устанавливаться и обновляться зависимости (библиотеки прописанные в блоке require).
Используя после команды ключ «-o », что значит «optimize», классы соответствующие стандарту psr-4 и прописанные для данного объекта будут прописаны в карте классов, что ускорит их загрузку в дальнейшем.

Так же в папке vendor находится файл autoload.php , который нужно подключить для того, чтобы заработала автозагрузка. Обычно его подключают в «точке входа» файле index.php :
require_once "../vendor/autoload.php"; используя «../» сначала поднимаемся на один уровень выше (у меня index.php находится в каталоге public). Если у вас другая структура, например индексный файл находится в корне приложения, то нужно прописать соответствующий путь к данному файлу.

 
Статьи по теме:
Компания Мери Кей: клиент или консультант?
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны. Подобные документы Особенности сетевого маркетин
Как выбрать зеркальные фотоаппараты Как выбрать фотоаппарат никон зеркальный
Зеркальный цифровой фотоаппарат или Digital single-lens reflex camera (DSLR) – предназначен для тех, кто мечтает почувствовать себя настоящим фотографом: научиться оперировать понятиями «выдержка» и «диафрагма» и создавать фотошедевры вручную, не слишком
Защита деловой репутации в сети интернет SERM как лучший инструмент для защиты
Какие действия необходимо предпринять для защиты своих прав? Можно ли обязать администрацию Instagram удалить данный пост? Известны ФИО пользователя, название его аккаунта, пользователь проживает в другом регионе.СергейЗдравствуйте. Можете письменно обрат
Планшет плохо ловит WiFi
Не определяет, отключается, не ловит wi-fi. Многие пользователи сталкиваются с проблемой, когда телефон либо планшет на базе Android начинает капризничать. Вроде и не падал негде и не «поливали» не чем, а работает не так, как должен. Например, в устройс