Spec-Zone.ru › Phalcon 2

Использование контроллеров

Контроллеры предоставляют ряд методов, которые называются действиями. Действия — это методы контроллера, обрабатывающие запросы. По умолчанию все публичные методы контроллера сопоставляются с действиями и доступны по URL-адресу. Действия отвечают за интерпретацию запроса и создание ответа. Обычно ответы представляют собой отрисованный вид, но существуют и другие способы создания ответов.

Например, при обращении к URL-адресу такого вида: http://localhost/blog/posts/show/2012/the-post-title Phalcon по умолчанию разобьет каждый фрагмент следующим образом:

Директория Phalcon blog
Контроллер posts
Действие show
Параметр 2012
Параметр the-post-title

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

Контроллеры должны иметь суффикс «Controller», а действия — суффикс «Action». Пример контроллера приведен ниже:

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction($year, $postTitle)
    {

    }

}

Дополнительные параметры URI определяются как параметры действия, чтобы к ним можно было легко получить доступ с помощью локальных переменных. Контроллер может необязательно расширить Phalcon\Mvc\Controller. Сделав это, контроллер может легко получить доступ к службам приложения.

Параметры без значения по умолчанию обрабатываются как обязательные. Установка необязательных значений для параметров выполняется обычным образом в PHP:

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction($year=2012, $postTitle='some default title')
    {

    }

}

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

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction()
    {
        $year = $this->dispatcher->getParam('year');
        $postTitle = $this->dispatcher->getParam('postTitle');
    }

}

Цикл диспетчеризации

Цикл диспетчеризации будет выполняться в диспетчере, пока не останется действий для выполнения. В приведенном выше примере было выполнено только одно действие. Теперь мы увидим, как «перенаправление» может обеспечить более сложный процесс работы в цикле диспетчеризации, перенаправляя выполнение на другой контроллер/действие.

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction($year, $postTitle)
    {
        $this->flash->error("You don't have permission to access this area");

        // Forward flow to another action
        $this->dispatcher->forward(array(
            "controller" => "users",
            "action" => "signin"
        ));
    }

}

Если у пользователей нет разрешений на доступ к определенному действию, они будут перенаправлены на контроллер Users, действие signin.

class UsersController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function signinAction()
    {

    }

}

В приложении нет ограничений на количество «перенаправлений», пока они не приведут к циклическим ссылкам, в этом случае приложение остановится. Если в цикле диспетчеризации больше нет действий для диспетчеризации, диспетчер автоматически вызовет слой представления MVC, который управляется Phalcon\Mvc\View.

Инициализация контроллеров

Phalcon\Mvc\Controller предлагает метод initialize, который выполняется первым, прежде чем будет выполнено любое действие на контроллере. Использование метода «__construct» не рекомендуется.

class PostsController extends \Phalcon\Mvc\Controller
{

    public $settings;

    public function initialize()
    {
        $this->settings = array(
            "mySetting" => "value"
        );
    }

    public function saveAction()
    {
        if ($this->settings["mySetting"] == "value") {
            //...
        }
    }

}
Метод ‘initialize’ вызывается только в том случае, если событие ‘beforeExecuteRoute’ выполнено успешно. Это предотвращает выполнение логики приложения в инициализаторе без авторизации.

Если вы хотите выполнить некоторую логику инициализации сразу после создания объекта контроллера, вы можете реализовать метод ‘onConstruct’:

class PostsController extends \Phalcon\Mvc\Controller
{

    public function onConstruct()
    {
        //...
    }
}
Обратите внимание, что метод ‘onConstruct’ выполняется даже если действие, которое должно быть выполнено, не существует в контроллере или пользователь не имеет к нему доступа (в соответствии с пользовательским управлением доступом, предоставленным разработчиком).

Ввод сервисов

Если контроллер расширяет Phalcon\Mvc\Controller, он имеет простой доступ к контейнеру сервисов в приложении. Например, если мы зарегистрировали сервис так:

$di = new Phalcon\DI();

$di->set('storage', function() {
    return new Storage('/some/directory');
}, true);

Тогда мы можем получить доступ к этому сервису несколькими способами:

class FilesController extends \Phalcon\Mvc\Controller
{

    public function saveAction()
    {

        //Injecting the service by just accessing the property with the same name
        $this->storage->save('/some/file');

        //Accessing the service from the DI
        $this->di->get('storage')->save('/some/file');

        //Another way to access the service using the magic getter
        $this->di->getStorage()->save('/some/file');

        //Another way to access the service using the magic getter
        $this->getDi()->getStorage()->save('/some/file');

        //Using the array-syntax
        $this->di['storage']->save('/some/file');
    }

}

Если вы используете Phalcon как полнофункциональный фреймворк, вы можете прочитать предоставляемые по умолчанию сервисы в фреймворке.

Запрос и ответ

Предполагая, что фреймворк предоставляет набор предварительно зарегистрированных сервисов. Мы объясняем, как взаимодействовать со средой HTTP. Сервис «запрос» содержит экземпляр Phalcon\Http\Request, а сервис «ответ» содержит Phalcon\Http\Response, представляющий то, что будет отправлено обратно клиенту.

class PostsController extends Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function saveAction()
    {
        // Check if request has made with POST
        if ($this->request->isPost() == true) {
            // Access POST data
            $customerName = $this->request->getPost("name");
            $customerBorn = $this->request->getPost("born");
        }
    }

}

Объект ответа обычно не используется напрямую, но строится до выполнения действия, иногда — например, в событии afterDispatch — может быть полезно получить прямой доступ к ответу:

class PostsController extends Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function notFoundAction()
    {
        // Send a HTTP 404 response header
        $this->response->setStatusCode(404, "Not Found");
    }

}

Узнайте больше о среде HTTP в посвященных статьях запрос и ответ.

Данные сессии

Сессии помогают нам сохранять данные между запросами. Вы можете получить доступ к Phalcon\Session\Bag из любого контроллера, чтобы упаковать данные, которые должны сохраняться.

class UserController extends Phalcon\Mvc\Controller
{

    public function indexAction()
    {
        $this->persistent->name = "Michael";
    }

    public function welcomeAction()
    {
        echo "Welcome, ", $this->persistent->name;
    }

}

Использование сервисов в качестве контроллеров

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

//Register a controller as a service
$di->set('IndexController', function() {
    $component = new Component();
    return $component;
});

        //Register a namespaced controller as a service
        $di->set('Backend\Controllers\IndexController', function() {
            $component = new Component();
            return $component;
        });

Создание базового контроллера

Некоторые функции приложения, такие как списки управления доступом, перевод, кэш и движки шаблонов, часто являются общими для многих контроллеров. В таких случаях рекомендуется создавать «базовый контроллер», чтобы код оставался DRY. Базовый контроллер — это просто класс, который расширяет Phalcon\Mvc\Controller и содержит общие функции, которые должны присутствовать во всех контроллерах. В свою очередь, ваши контроллеры расширяют «базовый контроллер» и имеют доступ к общим функциям.

Этот класс может быть расположен где угодно, но для организации мы рекомендуем разместить его в папке controllers, например, apps/controllers/ControllerBase.php. Этот файл можно потребовать напрямую в файле загрузки или вызвать с помощью любого автозагрузчика:

require "../app/controllers/ControllerBase.php";

Реализация общих компонентов (действий, методов, свойств и т. д.) находится в этом файле:

class ControllerBase extends \Phalcon\Mvc\Controller
{

  /**
   * This action is available for multiple controllers
   */
  public function someAction()
  {

  }

}

Любой другой контроллер теперь наследуется от ControllerBase, автоматически получая доступ к общим компонентам (описанным выше):

class UsersController extends ControllerBase
{

}

События в контроллерах

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

class PostsController extends \Phalcon\Mvc\Controller
{

    public function beforeExecuteRoute($dispatcher)
    {
        // This is executed before every found action
        if ($dispatcher->getActionName() == 'save') {

            $this->flash->error("You don't have permission to save posts");

            $this->dispatcher->forward(array(
                'controller' => 'home',
                'action' => 'index'
            ));

            return false;
        }
    }

    public function afterExecuteRoute($dispatcher)
    {
        // Executed after every found action
    }

}

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/controllers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API