Маршрутизация

Обзор

Пример hello world из предыдущей статьи был очень простым. Расширим его, добавив следующий код перед $f3→run():

$f3->route('GET /about',
    function() {
        echo 'О нашем сайте!';
    }
);

Данный код создаёт новый роут (правило маршрутизации), при переходе на который (ссылка ваш_домен/about) будет выведен текст «О нашем сайте!».

Если Вы не хотите загромождать глобальное пространство имен именами функций, то F3 поможет тем, что распознает различные способы сопоставления обработчиков маршрутов с классами и методами ООП, например:

class WebPage {
    function display() {
        echo 'I cannot object to an object';
    }
}
 
$f3->route('GET /about','WebPage->display');

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

$f3->route('GET /login','Controller\Auth::login');

У вас возникла ошибка 404 Not Found ? Проверьте конфигурацию вашего сервера .

Маршруты и токены

В качестве демонстрации мощного DSL от Fat-Free вы можете создать один роут (модель маршрутизации) для обработки различных параметров:

$f3->route('GET /brew/@count',
    function($f3) {
        echo $f3->get('PARAMS.count').' bottles of beer on the wall.';
    }
);

В этом примере показано, как мы можем указать токен @count для представления части URL-адреса. Платформа будет обслуживать любой URL-адрес запроса, соответствующий /brew/ префиксу, например /brew/99 , /brew/98 и т.д. При этом будет отображаться '99 bottles of beer on the wall'и '98 bottles of beer on the wall', соответственно. Fat-Free также примет запрос страницы для /brew/unbreakable. (При этом отобразится 'unbreakable bottles of beer on the wall'.) Когда такой динамический маршрут указан, Fat-Free автоматически заполняет глобальную переменную PARAMS массива, значениями из строки URL. Метод $f3→get() возвращает значение переменных F3, в том числе и PARAMS.

Обратите внимание, что Fat-Free понимает точечную нотацию массивов. Вместо этого вы можете использовать в коде обычный метод работы с массивом с помощью квадратных скобок и одинарных кавычек PARAMS['count']. В шаблонах фреймворк допускает использование точки @PARAMS.count.

Вот еще один способ доступа к токенам в шаблоне запроса:

$f3->route('GET /brew/@count',
    function($f3,$params) {
        echo $params['count'].' bottles of beer on the wall.';
    }
);

Вы можете использовать звездочку (*), чтобы принять любой URL-адрес после маршрута /brew:

$f3->route('GET /brew/*',
    function() {
        echo 'Enough beer! We always end up here.';
    }
);

Важный момент, который следует учитывать: чтобы избежать путаницы нельзя использовать и GET /brew/@count и GET /brew/* вместе в одном приложении. Используйте или первый метод или другой. Как вариант: Fat-Free рассматривает маршрут GET /brew как отдельный и отличный от маршрута GET /brew/@count. У каждого могут быть разные обработчики.

ВАЖНО: всем обработчикам маршрутов автоматически передается экземпляр базового класса F3 и токены маршрута.

Именованные маршруты

Когда вы определяете маршрут, вы можете присвоить ему имя. Используйте имя маршрута в коде и шаблонах вместо типизированного URL. Затем, если вам нужно изменить свои URL-адреса, например для SEO, или иных целей, вам нужно только внести изменения в том месте, где был определен маршрут. Имена маршрутов должны соответствовать правилам именования переменных php (без точек, тире и дефисов).

Назовем маршрут:

$f3->route('GET @beer_list: /beer', 'Beer->list');

Имя вставляется после механизма маршрута (GET в этом примере), которому предшествует символ @, и отделяется от части URL-адреса символом двоеточия :. Вы можете вставить пробел после двоеточия, если это облегчает чтение кода (как показано в примере).

Чтобы перенаправить посетителя на новый URL-адрес, вызовите именованный маршрут внутри reroute()метода, например:

// именованный маршрут - это строковое значение
$f3->reroute('@beer_list'); // обратите внимание на одинарные кавычки

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

$f3->route('GET @beer_list: /beer/@country', 'Beer->bycountry');
 
// набор пар ключ-значение передается в качестве аргумента к именованному маршруту
$f3->reroute('@beer_list(@country=Germany)');
 
// если понадобится больше одного токена в вашем маршруте.
$f3->route('GET @beer_village_list: /beer/@country/@village', 'Beer->byvillage');
$f3->reroute('@beer_village_list(@country=Germany,@village=Rhine)');

Помните о методеurlencode() в своих аргументах и токенах. Если у вас есть символы, которые не соответствуют рекомендациям RFC 1738 для правильно сформированных URL-адресов - это может вызвать проблемы.

Именованные маршруты в шаблонах

Чтобы получить доступ к именованному маршруту в шаблоне, вы можете передать имя маршрута фильтру псевдонимов (алиасов):

<a href="{{ 'beer_list' | alias }}">view beer list</a>

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

<a href="{{ 'beer_village_list', 'country=Germany,village=Rhine' | alias }}">view beer list from Rhine, Germany</a>

Это также работает с переменными, которые выглядят так :

{{ @name, 'a=5,b='.@id | alias }}

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

Если вам необходимо заменить шаблонные маркеры в маршруте (то есть GET @complex:/resize/@format/*/sep/*), используйте числовой индекс, чтобы указать, что это новое значение, например:

{{'complex','format=20x20,2=foo/bar,3=baz.gif'|alias}}

.

Чтобы сгенерировать URL-адреса в коде контроллера, см. Методы alias и build .

Динамические веб-сайты

Все маршруты F3 виртуальные. Они не отражают структуру папок нашего жесткого диска. Если у вас есть программы или статические файлы (изображения, CSS и т.д.), которые не используются в F3 - до тех пор, пока пути к этим файлам не конфликтуют с каким-либо маршрутом, определенным в вашем приложении, - программное обеспечение вашего веб-сервера доставит их в браузер пользователя при условии, что сервер настроен правильно.

Пример конфигурации Apache

Если вы используете Apache, убедитесь, что вы активировали модуль перезаписи URL (mod_rewrite) в вашем файле apache.conf (или httpd.conf). Вам также следует создать файл .htaccess, содержащий следующее:

RewriteEngine On

RewriteRule ^(app|dict|ns|tmp)\/|\.ini$ - [R=404]

RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

Сценарий сообщает Apache, что всякий раз, когда приходит HTTP-запрос и если не может быть найден физический файл (!-f), путь (!-d) или символическая ссылка (!-l), он должен передать управление в index.php, который содержит наш главный контроллер и который, в свою очередь, вызывает базовый класс и настроенные роуты.

.htaccess содержащий директивы Apache, должен всегда находиться в той же папке что и index.php.

Вам также необходимо настроить Apache, чтобы он знал физическое местоположение index.php на вашем жестком диске. Типичная конфигурация:

DocumentRoot "/var/www/html"
<Directory "/var/www/html">
    Options -Indexes +FollowSymLinks +Includes
    AllowOverride All
    Order allow,deny
    Allow from All
</Directory>

В случае, если вы просто поместили свой проект на F3 в поддомен(субдомен) существующего корня документа, некоторые конфигурации Apache, возможно, также потребуют определения RewriteBase в вашем .htaccess файле. Если приложение не работает или маршрут по умолчанию / работает, но, /test возможно, не работает, попробуйте добавить коневой путь:

RewriteEngine On
RewriteBase /fatfree-project/

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

NameVirtualHost *
<VirtualHost *>
    ServerName site1.com
    DocumentRoot "/var/www/site1"
    <Directory "/var/www/site1">
        Options -Indexes +FollowSymLinks +Includes
        AllowOverride All
        Order allow,deny
        Allow from All
    </Directory>
</VirtualHost>
<VirtualHost *>
    ServerName site2.com
    DocumentRoot "/var/www/site2"
    <Directory "/var/www/site2">
        Options -Indexes +FollowSymLinks +Includes
        AllowOverride All
        Order allow,deny
        Allow from All
    </Directory>
</VirtualHost>

Каждый ServerName( site1.com и site2.com в нашем примере) должен быть указан в вашем /etc/hosts файле. В Windows вам следует отредактировать C:/WINDOWS/system32/drivers/etc/hosts. Чтобы изменения вступили в силу, может потребоваться перезагрузка. Затем вы можете указать в своем веб-браузере адрес http://site1.com или http://site2.com. Виртуальные хосты значительно упрощают развертывание ваших приложений.

Альтернативная конфигурация Apache

Если mod_rewrite недоступен на вашем сервере или если вы хотите немного повысить производительность, вы можете воспользоваться директивой FallbackResource, доступной в Apache 2.4 и выше.

В этом случае просто добавьте следующую строку в свой .htaccess файл или в конфигурацию VirtualHost:

FallbackResource /index.php

Если ваше веб-приложение работает в подпапке сервера (или на субдомене), не забудьте соответствующим образом изменить директиву:

FallbackResource /fatfree-project/index.php

Пример конфигурации Nginx

Рекомендуемая конфигурация для серверов Nginx (замените ip_address: port на соответсвующие значения FastCGI PHP вашей среды):

server {
    root /var/www/html;
    location / {
        index index.php index.html index.htm;
        try_files $uri /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass ip_address:port;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Пример конфигурации Lighttpd

Аналогичным образом настраиваются серверы Lighttpd:

$HTTP["host"] =~ "www\.example\.com$" {
    url.rewrite-once = ( "^/(.*?)(\?.+)?$"=>"/index.php/$1?$2" )
    server.error-handler-404 = "/index.php"
}

Пример конфигурации IIS

Установите модуль перезаписи URL. Затем создайте файл с именем web.config в корне вашего приложения со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Application" stopProcessing="true">
          <match url=".*" ignoreCase="false" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Rewrite" url="index.php" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Изменение маршрута

Итак, вернемся к кодированию. Вы можете объявить страницу устаревшей и перенаправить посетителей на другой сайт:

$f3->redirect('GET|HEAD /obsoletepage', '/newpage');

Эту задачу можно решить и таким способом:

$f3->route('GET|HEAD /obsoletepage',
    function($f3) {
        $f3->reroute('/newpage');
    }
);

Если кто-то пытается получить доступ к URL-адресу http://www.example.com/obsoletepage с помощью запроса HTTP GET или HEAD, платформа перенаправляет пользователя на URL-адрес: http://www.example.com/newpage как показано в приведенном выше примере. Вы также можете перенаправить пользователя на другой сайт, например $f3→reroute('http://www.anotherexample.org/');.

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

Перенаправления HTTP незаменимы, но они также могут быть дорогостоящими. Насколько это возможно, воздержитесь от использования $f3→reroute()для отправки пользователя на другую страницу того же самого веб-сайта, если вы можете управлять потоком своего приложения, вызывая функцию или метод, который обрабатывает целевой маршрут. Потому что это не изменит URL-адрес в адресной строке веб-браузера пользователя. Если же переадресация со сменой URL необходима, и вам действительно нужно отправить пользователя на другую страницу, в таких случаях, как успешная отправка формы или после аутентификации пользователя, Fat-Free отправит заголовокHTTP 302 Found. Для всех других попыток перенаправления на другую страницу или сайт F3 отправляет заголовок HTTP 301 Moved Permanently.

404

Во время выполнения Fat-Free автоматически генерирует ошибку HTTP 404 всякий раз, когда видит, что входящий HTTP-запрос не соответствует ни одному из маршрутов, определенных в вашем приложении. Однако бывают случаи, когда вам нужно запустить его самостоятельно.

Возьмем, к примеру, маршрут, определенный как GET /dogs/@breed. Логика вашего приложения может включать поиск в базе данных и попытку получить запись, соответствующую значению @breed входящего HTTP-запроса. Поскольку Fat-Free будет принимать любое значение после /dogs/ префикса из-за наличия токена@breed, отображение HTTP 404 Not Found сообщения программным способом становится необходимым, когда программа не находит совпадений в нашей базе данных. Для этого используйте следующую команду:

$f3->error(404);

ReST (Передача состояния представления)

Архитектура Fat-Free основана на концепции, согласно которой HTTP URI представляют абстрактные веб-ресурсы, и каждый ресурс может переходить из одного состояния в другое. По этой причине F3 не имеет ограничений на то, как вы структурируете свое приложение. Если вы предпочитаете использовать шаблон модель-представление-контроллер (MVC) , F3 может помочь вам разделить компоненты приложения, чтобы придерживаться этой парадигмы. С другой стороны, фреймворк также поддерживает шаблон «ресурс-метод-представление» (RMR), и его реализация более проста.

Вот пример интерфейса ReST:

class Item {
    function get() {}
    function post() {}
    function put() {}
    function delete() {}
}
 
$f3=require('lib/base.php');
$f3->map('/cart/@item','Item');
$f3->run();

Метод Fat-Free $f3→map()предоставляет интерфейс ReST, сопоставляя методы HTTP в маршрутах с эквивалентными методами объекта или класса PHP. Если ваше приложение получает входящий HTTP-запрос, например GET /cart/123, Fat-Free автоматически передает управление get()методу объекта или класса . Точно так же POST /cart/123 запрос будет перенаправлен на методpost() класса Item.

Сопоставленные методы могут иметь префикс с помощью переменной PREMAP .

Примечание. Браузеры не реализуют HTTP PUT и DELETE методы в обычных HTML-формах. Эти и другие методы ReST (HEAD, и CONNECT) доступны только через вызовы AJAX на сервер. Однако их можно туннелировать через POST запрос, задав для _method параметра желаемый HTTP-метод.

Если F3 получает метод HTTP, который не реализован классом, он генерирует ошибку HTTP 405 Method Not Allowed. F3 автоматически отвечает соответствующими заголовками на OPTIONS запросы метода HTTP. F3 не будет сопоставлять этот запрос классу.

Автозагрузчик F3

Fat-Free позволяет загружать классы только в то время, когда они вам нужны, поэтому они не занимают больше памяти, чем требуется конкретному сегменту кода вашего приложения. И вам не нужно писать длинный список операторов include или require только для загрузки классов PHP, сохраненных в разных файлах и в разных местах. Фреймворк может сделать это автоматически. Просто сохраните файлы классов (по одному классу на файл) в папке (например, «myclassfiles») и установите переменную автозагрузки так, чтобы она указывала на эту папку:

$f3->set('AUTOLOAD','myclassfiles/');

Важно: имя класса и имя файла должны быть идентичными, чтобы фреймворк мог автоматически загрузить ваш класс. Если ваш класс назван BarBaz, ваш файл должен быть назван BarBaz.php. Также подойдут строчные буквы barbaz.php.

Когда вы вызываете свой класс или метод с помощью $obj=new Barbaz;, Fat-Free Framework будет искать файл barbaz.php по пути, указанному в переменной автозагрузчика. Как только он найдет файл, он будет включен в require команду PHP . Так работает автозагрузка.

Путь ищется от расположения вашего файла index.php. Вы можете установить свою AUTOLOAD переменную, используя абсолютный путь, т.е. /var/www/mywebsite.com/myclassfiles/или используя относительный путь, если смотреть из местоположения вашего файла index.php ../myclassfiles/, если index.php находится в /var/www/mywebsite.com/.

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

$f3->set('AUTOLOAD','admin/autoload/; user/autoload/; default/');

Пространства имен

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

$f3->set('AUTOLOAD','autoload/');
$obj=new Gadgets\iPad;

Вы можете создать иерархию папок, которая будет следовать той же структуре. Предполагая, что /var/www/html/это ваш корень, тогда F3 будет искать класс в /var/www/html/autoload/gadgets/ipad.php. Файл ipad.php должен иметь следующий минимальный код:

namespace Gadgets;
class iPad {}

Помните: все имена каталогов в Fat-Free должны заканчиваться косой чертой (слешем). Вы можете назначить путь поиска автозагрузчику следующим образом:

$f3->set('AUTOLOAD','main/;aux/');

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

Маршрутизация к классу с пространством имен

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

$f3->set('AUTOLOAD','classes/');
$f3->route('GET|POST /','Main\Home::show');

Приведенный выше код вызовет статический show()метод класса Home в пространстве имен Main. Класс Home должен быть сохранен в папке classes/main/home.php для того , чтобы быть загруженным автоматически.

Если вы предпочитаете работать с объектами:

$f3->route('GET|POST /','Main\Home->show');

Этот код создаст экземпляр класса Home во время выполнения и вызовет метод show() после этого.

Регистры в автозагрузке

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

Если автоматически загружаемый класс Main\Home, возможные имена файлов: Main/Home.php или main/home.php.

main\Home.php, Main\hoME.php или MAIN\HOME.php не загрузится!

Если вам нужно определить пользовательский вариант регистра, вы можете установить AUTOLOAD переменную как массив пути и пользовательской функции. Допустим, все ваши имена файлов в верхнем регистре. Затем вместо определения $f3→set('AUTOLOAD','classes/'вы должны определить:

$f3->set('AUTOLOAD',array('classes/',function($class){
  return strtoupper($class);
}));

Обработчики событий

F3 имеет несколько механизмов прослушивания событий маршрутизации, которые могут помочь вам улучшить поток и структуру классов контроллеров. Допустим, у вас есть маршрут, определенный следующим образом:

$f3->route('GET /','Main->home');

Если приложение получает HTTP-запрос, соответствующий указанному выше маршруту, F3 сначала создает экземпляр Main, но перед выполнением home()метода F3 ищет метод в этом классе с именем beforeRoute(). Если присутствует, F3 запускает код, содержащийся в beforeRoute() обработчике событий, прежде чем передать управление методу, указанному в маршруте, в нашем примере это метод home(). После завершения метода платформа ищет обработчик событий afterRoute(), который вызывается, если он присутствует. Обработчики событий beforeroute() и afterroute() являются общими для данного класса. Это означает, что если вы определили разные маршруты, используя разные методы одного и того же класса, например, 'GET /login','User→login'и 'GET /logout','User→logout', оба маршрута будут использовать одни и те же обработчики событий beforeroute() afterroute().

Создайте функции beforeRoute() и afterRoute() в своем базовом классе контроллера и примените их к каждому запросу. Конечно, вы можете переопределить их в дочерних контроллерах, определив custom beforeRoute() и afterRoute() обработчики в дочерних классах. Можно также создать beforeRoute() и afterRoute() в дочернем классе, и наследовать обработчики фронт-контроллера, вызывая parent::beforeRoute() или parent::afterRoute() в дочерних классах .

Обработчики динамических маршрутов

Вот еще одно лакомство F3:

$f3->route('GET /products/@action','Products->@action');

Если ваше приложение получает запрос, например, /products/itemize F3 извлечет 'itemize' строку из URL-адреса и подставит ее в токен @action в обработчике маршрута. Затем F3 будет искать класс Products и выполнит его метод itemize().

Обработчики динамических маршрутов могут иметь разные формы:

// static method
$f3->route('GET /public/@genre','Main::@genre');
// object mode
$f3->route('GET /public/@controller/@action','@controller->@action');

F3 вызывает ошибку HTTP 404 Not Found во время выполнения, если не может передать управление классу или методу, связанному с текущим маршрутом, т.е. Не существует определенного класса и / или метода, соответствующего запрошенному маршруту.

AJAX и синхронные запросы

Шаблоны маршрутизации могут содержать модификаторы, которые говорят F3 о необходимости принятия решения о маршрутизации на основе типа HTTP-запроса:

$f3->route('GET /example [ajax]','Page->getFragment');
$f3->route('GET /example [sync]','Page->getFull');
 
; routes.ini style
POST /formsubmit [ajax] = Form->process_post_via_ajax

Первый оператор направит HTTP-запрос в Page→getFragment() только в том случае, если сервером получен заголовок X-Requested-With: XMLHttpRequest(объект AJAX). Если обнаружен обычный (синхронный) запрос, F3 просто перейдет к следующему подходящему шаблону, и в этом случае он выполнит Page→getFull().

Если в шаблоне маршрутизации модификаторы не определены, то запросы AJAX и синхронные запросы направляются указанному обработчику.

Модификаторы шаблона маршрута также распознаются в методе $f3→map().

Маршрутизация в режиме CLI

Веб-синтаксис

Если вы хотите запустить определенный маршрут из командной строки, сценария оболочки, консоли или как задание cron, вы можете эмулировать HTTP-запрос GET с помощью следующей команды:

cd /path/to/test/suite
php index.php /my-awesome-route

Также поддерживаются строки запроса:

php index.php /my-awesome-route?foo=bar

Синтаксис оболочки

Вместо запроса URI вы можете передавать аргументы и параметры оболочки. Они будут автоматически преобразованы в эмулируемый HTTP-запрос GET, что упрощает создание инструмента оболочки так же, как создание веб-приложения.

Для преобразования применяются следующие правила сопоставления:

  • отображение аргументов, разделенных пробелами, на компоненты пути
  • краткая форма (также известная как флаги) и полная карта параметров для строковых аргументов запроса
  • варианты краткой формы можно комбинировать
  • параметры могут быть переданы в любом порядке (до, между или после аргументов)

Вот некоторые примеры:

  • php index.php test сопоставляется с GET /test
  • php index.php log show –limit=50 –full сопоставляется с GET /log/show?limit=50&full=
  • php index.php cache clear -f -v -i -n=23 сопоставляется с GET /cache/clear?f=&v=&i=&n=23
  • все следующие варианты эквивалентны предыдущему запросу:
php index.php cache clear -fvi -n=23

php index.php cache clear -fvin=23

php index.php cache -fvin=23 clear

php index.php -fvin=23 cache clear

php index.php -fvi cache clear -n=23

Доступ к параметрам CLI осуществляется через глобальную переменную $_GET.

Вот два немного разных подхода к вариантам обработки:

// syntax #1 (validating data, mixing short and long forms)
$opts=[
    'force' => $f3->exists('GET.f'), // -f
    'limit' => abs((int)$f3->get('GET.limit')) ?: 20, // --limit=N (default: 20)
    'verbose' => $f3->exists('GET.v') || $f3->exists('GET.verbose'), // -v OR --verbose
];
 
// syntax #2 (not validating data, long-form only)
$opts=$_GET+[
     'force'=>0, // --force
     'limit'=>20, // --limit=N (default: 20)
     'verbose'=>0, // --verbose
];

Определение маршрутов

Маршруты CLI определяются так же, как и веб-маршруты, с той лишь разницей, что они могут быть ограничены режимом CLI с помощью [cli]модификатора. Например:

[routes]
GET /log/show       [cli] = CLI\Log->show
GET /log/clear      [cli] = CLI\Log->clear
GET /cache/clear    [cli] = CLI\Cache->clear
GET /help           [cli] = CLI\Help->index
GET /help/@command  [cli] = CLI\Help->@command

Переменная CLI сообщает, исходит ли запрос от CLI или нет.

Mock-объект

Маршруты CLI можно имитировать так же, как веб-маршруты с помощью фиктивной реализации интерфейса (mock). Помните, что здесь не допускается использование синтаксиса оболочки:

$f3->mock('GET /log/show?limit=50 [cli]');

← 1. Приступим3. Переменные →

Печать/экспорт