Как переопределять РНР классы через Composer
В этом руководстве мы рассмотрим, как переопределять классы с помощью Composer.
Если вы работаете с PHP, возможно, используете Laravel или другой фреймворк, в этом руководстве мы рассмотрим, как переопределять классы с помощью Composer.
Это полезно, когда вы используете библиотеку или пакет и хотите переопределить определенную функциональность, но не можете редактировать код напрямую.
Необходимые условия
Этот туториал предполагает, что у вас уже есть проект, использующий Composer, а значит, есть файл composer.json.
Но в начале о PSR-4
PSR расшифровывается как PHP Standard Recommendation. PSR-4 определяет стандарты для пространств имен, имен классов и т.д.
Допустим, у вас в проекте следующая файловая структура:
- app
|
|_ _ _ Model
|
|_ _ User.php
Это похоже на структуру, которую вы имеете при использовании Laravel. Стандарты PSR-4 говорят, что пространство имен должно быть точно таким же, как и структура файлов. Так, внутри User.php
пространство имен должно быть app/Model
.
Однако, когда мы используем Laravel, мы всегда пишем app
с большой буквы, поэтому пространство имен будет App\Model
. Как это не нарушает стандарт?
Это происходит благодаря следующим строкам в composer.json:
"autoload": {
"psr-4": {
"App\\": "app/",
//....
}
}
Итак, как это работает?
Автозагрузка в Composer
Используя ключ autoload
, мы можем указать, как загружать определенные файлы на основе спецификации, которой в данном случае является PSR-4.
Итак, сначала мы добавим ключ autoload
, который представляет собой объект с ключом psr-4
:
"autoload": {
"psr-4": {
}
}
Внутри объекта psr-4
у нас будут пары ключ-значение, которые определяют, как файлы должны быть загружены. Ключом будет пространство имен, которое будет загружено, а значением — место, откуда оно должно быть загружено. Так, в примере с Laravel, пространство имен App\
является ключом, а app/
— значением. Это означает, что все пространства имен App\
должны быть загружены из каталога app
.
Переопределение классов
Допустим, у нас есть класс Vendor\Model\User
, и мы хотим переопределить этот класс. Во-первых, класс, который его переопределяет, должен находиться в определенной директории. Так, вы можете создать пустую папку app/overrides
, чтобы поместить в неё переопределяемые классы. Это может быть любой путь, который вы хотите, это не имеет значения.
Допустим, мы создали app/overrides/User.php
и хотим, чтобы этот класс переопределял Vendor/Model/User
. Первый шаг — мы должны убедиться, что app/overrides/User.php
имеет то же пространство имен:
namespace Vendor/Model;
Затем вы можете разместить любой код внутри класса.
Далее нам нужно сообщить Composer, откуда загружать пространство имен Vendor/Model
. Итак, ключ здесь должен быть Vendor/Model
, а значение — путь к директории, в которой находится переопределяющий класс, в нашем случае это app/overrides
:
"autoload": {
"psr-4": {
"Vendor\\Model\\": "app/overrides"
}
}
Вот и все. Теперь автозагрузка для Vendor/Model
будет происходить из app/overrides
, а не из первоначального места, и таким образом вы сможете переопределить любой класс, который захотите.
Дополнительные опции
Вместо значения в виде строки, содержащей путь, по которому должно быть загружено пространство имен, вы можете указать массив. Это говорит Composer, что он должен искать классы в нескольких местах:
"Vendor\\Model\\": ["app/overrides", "src"]
Вы также можете указать резервный каталог для любого пространства имен:
"autoload": {
"psr-4": {
"": "app/overides/"
}
}
Источник: How to Override Classes in PHP and Composer.