Action'ы Часть I
Основы
Action'ы - логика на стороне сервера. В них Вы определяете те действия которые необходимо выполнить и возвращаете(не всегда) результат.
Action - класс описанный в маппинге.
Например такой URL: http://yourserver/helloAction.
SpotLight будет пытаться найти в маппинге action или flow с именем helloAction. Если ему это удастся то он будет запущен. (О flow'ах будет рассказано чуть позже)
Классический пример:
Создаем файл mySite/action/HelloAction.class.php с таким содержанием:
<?php
class HelloAction extends Action {
public function execute() {
return 'Hello world!!!';
}
}
?>
<action name="hello" class="HelloAction" file="mySite/actions/HelloAction.class.php" />
http://yourserver/helloЕсли Вы все сделали верно то увидите Hello world!!!
Имена классов и файлов остаются на вашей совести,(в версиях ниже 0.5* это было невозможно, был строгий name-convention) я предоставил Вам как можно больше прав для успешного и приятного программирования. Хотя я предпочитаю использовать java name-convention и Вам того же желаю.
Классическим вариантом action'а является такой: один класс(читай - один файл!) на один action. Правда это не всегда удобно, потому сейчас мы немного расширим пример используя дополнительные возможности.
Добавим еще один action который будет принимать один параметр с именем name. Action этот мы опишем в это же файле ибо он логически туда подходит. Он будет возвращать текст: Hello ${name}, где ${name} - переданный параметр. Класс уже будет выглядеть таким образом:
<?php
class HelloAction extends Action {
protected $name;
public function execute() {
return 'Hello world!!!';
}
public function helloForName() {
return 'Hello '.$this->name;
}
}
?>
<action name="helloFor" method="helloForName" class="HelloAction" file="mySite/actions/HelloAction.class.php" />
http://yourserver/hello/name/TeslaИ вивдим результат:Hello Tesla.
Как вы уже заметили то данные попали в переменную без нашей участи. Наша задача всего лишь описать ее как protected или public (первый вариант куда более предпочтительней с архитектурной точки зрения). Никаких сеттеров/геттеров (кстати такое было в версиях ниже 0.5.0.3)
Описывать атрибути в маппинге думаю нету смысла, Dы их уже поняли. Их есть всего 4 для тега <action .. />. И только один - обязателен - name. Но тут есть тонкость, атрибуты class и file впаре тоже обязательны. Один не может быть без другого. Ежели у Вас нет бизнес-логики то и смысла описывать класс для действия тоже нет. Тогда эти два атрибута можно не писать.
Резонно спросите Вы, а какой смысл с такого действия:
<action name="loginForm" />
<action name="loginForm" >
<result>views/pages/loginForm.html</result>
</action>
<action name="page_(d+)" >
<result>views/pages/{1}.html</result>
</action>
http://yourserver/page_1 можно получить содержимое страницы views/pages/1.html. А по http://yourserver/page_2 получим содержимое views/pages/2.html.
У тега <result> есть два атрибута - type и name. Рассмотрим type.
Он может принимать 2 значения - redirect и любое другое! По умолчанию он принимает значение отличное от redirect таким образом в браузере URL остается таким как вы его замаппили. Иначе Вы получите, например первого примера, вот такое: http://yourserver/views/pages/1.html
В действиях без логики не имеет смысла использовать больше одного результата, все равно выберется первый, а так же атрибут name не берется во внимание.
Но другое дело если есть, например такое действие:
<action name="login" class="LoginAction" file="mySite/actions/LoginAction.class.php">
<result name="success">views/pages/auth/insystem.html</result>
<result name="fail">views/pages/auth/fail.html</result>
</action>
В таком случае результат будет выбираться из двух представленных, посредством сравнивания возвращенного результата из действия и значений атрибутов name. Все просто.
Описываем класс действия:
<?php
class LoginAction extends Action {
protected $login;
protected $passwd;
public function execute() {
return $this->login=='Tesla' && $this->passwd=='123' ? 'success' : 'fail';
}
}
?>
Теперь вводим URL:
http://yourserver/login/login/Tesla/passwd/123 при таких параметрах SpotLight вернет нам по-name'у successстраницу views/pages/auth/insystem.html. В идеале бы это все отсылать через форму. Но не в этом суть. Суть в том, что бы показать общие принципы работы и логики исполнения веб-приложений на базе SpotLight.
Выше мы уже использовали регулярные выражения для имени действия и использовали их в результатах. Их также можно использовать и в атрибутах file, class и method
Теперь мы даже немного умеем создавать действия (action'ы) и соответственно корректно маппить их. Но это не все есть еще масса вещей связанных с ними, например валидаторы и интерсепторы, магические методы, и еще и еще...
