Статьи

Автоматизация PHP с помощью Phake — Введение

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

Phake, инструмент автоматизации, написанный для PHP, может выполнить эти задачи за вас. Если вы знакомы с Ruby, это в основном клон Rake . В этой серии из двух частей я расскажу вам, как интегрировать Phake в ваш рабочий процесс. Я проведу вас через установку, некоторые основы использования Phake и, наконец, некоторые примеры из реальной жизни.

Установка

Phake должен быть установлен глобально через Composer:

composer global require 'jaz303/phake=*' 

Это делает Phake доступным из любой папки и не требует от вас изменения файла composer.json вашего проекта.

Если у вас нет доступа к команде «composer», установите Composer глобально .

основы

Для выполнения задач Phake вам нужно создать файл Phake. Phakefile содержит конфигурацию для задач, которые вы хотите выполнить. Если вы использовали Grunt раньше, Phakefile похож на Gruntfile .

Важное замечание о Phakefile — это просто файл PHP, поэтому вы можете просто написать его так же, как и в своих проектах PHP.

Создание задач

Вы можете создавать задачи, вызывая метод task() . Это принимает имя задачи в качестве первого аргумента и функцию для выполнения в качестве последнего аргумента.

 <?php task('task_a', function(){ echo "Hi I'm task A!\n"; }); 

Затем вы можете выполнить его с помощью следующей команды:

 phake task_a 

Это тогда возвратит следующий вывод:

 Hi I'm task A! 

зависимости

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

 <?php task('task_a', function(){ echo "Hi I'm task A!\n"; }); task('task_b', 'task_a', function(){ echo "Hi I'm task B! I need task A to execute first before I can do my thing!\n"; }); 

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

 phake task_b 

Выполнение этого вернет следующий вывод:

 Hi I'm task A! Hi I'm task B! I need task A to execute first before I can do my thing! 

И вы можете продолжать добавлять зависимости:

 <?php task('task_a', function(){ echo "I get to execute first!\n"; }); task('task_b', 'task_a', function(){ echo "Second here!\n"; }); task('task_c', 'task_b', function(){ echo "I'm the last one!\n"; }); 

Выполните их, вызвав последнюю задачу, которую нужно вызвать. В этом случае, это task_c который мы хотим выполнить последним:

 phake task_c 

Затем он вернет следующий вывод:

 I get to execute first! Second here! I'm the last one! 

Обратите внимание, что при использовании этого метода объявления зависимостей вызов task_b приведет к task_a что task_a будет вызываться первым. Если вы не хотите, чтобы это происходило, и вы все еще хотите выполнить определенную задачу отдельно, не выполняя сначала ее зависимости, тогда вы можете объявить ее, используя следующий метод:

 task('task_a', function(){ echo "I get to execute first!\n"; }); task('task_b', function(){ echo "Second here!\n"; }); task('task_c', 'task_a', 'task_b', function(){ echo "I'm the last one!\n"; }); 

В приведенном выше примере мы устанавливаем task_a и task_b в качестве зависимостей task_c . Обратите внимание, что порядок имеет значение здесь. Таким образом, задача сразу после основной задачи ( task_a ) будет выполнена первой, а следующая справа от нее ( task_b ) будет второй, а затем, наконец, будет выполнена основная задача ( task_c ).

В Phake есть еще один способ определения ваших зависимостей: использование блоков «до» или «после» сразу после определения основной задачи. В этом случае наша основная задача — eat поэтому мы определяем задачи, которые мы хотим выполнить до и после него в соответствии с его объявлением:

 task('eat', function(){ echo "Yum!"; }); before('eat', function(){ echo "Wash your hands before you eat\n"; }); after('eat', function(){ echo "Brushy brush! brush!\n"; }); 

Когда вы выполняете eat вы получаете следующий вывод:

 Wash your hands before you eat Yum! Brushy brush! brush! 

Группировка задач

С помощью Phake вы также можете группировать связанные задачи:

 group('clean_the_house', function(){ task('polish_furniture', function(){..}); task('wash_the_clothes', function(){..}); task('mop_the_floor', function(){..}); }); 

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

 phake clean_the_house:polish_furniture 

Если вы хотите выполнить все задачи в группе, вы можете просто сделать окончательную задачу зависимой от первой и второй задачи. В приведенном ниже примере последней задачей, которую мы хотим выполнить, является задача mop_the_floor поэтому мы делаем ее зависимой от polish_furniture и wash_the_clothes :

 group('clean_the_house', function(){ task('polish_furniture', function(){..}); task('wash_the_clothes', function(){..}); task('mop_the_floor', 'polish_furniture', 'wash_the_clothes' function(){..}); }); 

Затем мы просто вызываем задачу mop_the_floor из терминала:

 phake clean_the_house:mop_the_floor 

Затем это вызовет задачи в следующем порядке:

 polish_furniture wash_the_clothes mop_the_floor 

Описание задач

Через некоторое время использования Phake вы можете накапливать кучу задач в своем Phakefile , поэтому неплохо иметь какую-то документацию. К счастью для нас, Phake поставляется с утилитой, которая позволяет нам описать, что делает конкретная задача Phake. Вы можете использовать его, вызывая метод desc прямо перед объявлением задачи, которую вы хотите описать:

 desc('Allows you to water the plants'); task('hose', function(){..}); desc('Allows you to wash the dish'); task('dish_washer', function(){..}); 

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

 phake -T 

Он вернет вывод, подобный следующему:

 hose Allows you to water the plants dish_washer Allows you to wash the dish 

Передача аргументов к задачам

Чтобы сделать задачи более гибкими, мы также можем передать аргументы. Это можно сделать, объявив параметр в функции. Затем это можно использовать для доступа к отдельным аргументам, которые вы передаете задаче:

 task('brush_teeth', function($args){ $motion = (!empty($args['motion'])) ? $args['motion'] : 'circular'; $includes = (!empty($args['includes'])) ? $args['includes'] : ''; brush($motion, $includes); }); 

Аргументы могут быть переданы путем включения пары имя-значение сразу после имени задачи. Если вы хотите передать более 1 аргумента, вы можете разделить их, используя один пробел между значением первого аргумента и именем второго аргумента:

 phake brush_teeth motion=horizontal includes=tongue,teeth,gums 

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

 phake brush_teeth motion="circular horizontal and vertical" 

Вывод

Теперь, когда мы увидели, для чего нужен Phake и как мы можем выполнять с ним задачи, мы подготовили ландшафт для некоторых реальных приложений во второй части. Будьте на связи!