Understanding How Phalcon Applications Work

如果你已经看过了 tutorial 或者已经通过 Phalcon Devtools 生成了代码, 你将很容易识别以下的启动文件:

  1. <?php
  2. use Phalcon\Mvc\Application;
  3. // 注册自动加载器
  4. // ...
  5. // 注册服务
  6. // ...
  7. // 处理请求
  8. $application = new Application($di);
  9. try {
  10. $response = $application->handle();
  11. $response->send();
  12. } catch (\Exception $e) {
  13. echo "Exception: ", $e->getMessage();
  14. }

控制器中全部核心的工作都会在handle()被回调时触发执行。

  1. <?php
  2. $response = $application->handle();

手动启动(Manual bootstrapping)

如果你不想使用 Phalcon\Mvc\Application ,以上的代码可以改成这样:

  1. <?php
  2. // 获取 'router' 服务
  3. $router = $di["router"];
  4. $router->handle();
  5. $view = $di["view"];
  6. $dispatcher = $di["dispatcher"];
  7. // 传递路由的相关数据传递给调度器
  8. $dispatcher->setControllerName(
  9. $router->getControllerName()
  10. );
  11. $dispatcher->setActionName(
  12. $router->getActionName()
  13. );
  14. $dispatcher->setParams(
  15. $router->getParams()
  16. );
  17. // 启动视图
  18. $view->start();
  19. // 请求调度
  20. $dispatcher->dispatch();
  21. // 渲染相关视图
  22. $view->render(
  23. $dispatcher->getControllerName(),
  24. $dispatcher->getActionName(),
  25. $dispatcher->getParams()
  26. );
  27. // 完成视图
  28. $view->finish();
  29. $response = $di["response"];
  30. // 传递视图内容给响应对象
  31. $response->setContent(
  32. $view->getContent()
  33. );
  34. // Send the response
  35. $response->send();

以下代码替换了 Phalcon\Mvc\Application ,虽然缺少了视图组件, 但却更适合Rest风格的API接口:

  1. <?php
  2. use Phalcon\Http\ResponseInterface;
  3. // 获取 'router' 服务
  4. $router = $di["router"];
  5. $router->handle();
  6. $dispatcher = $di["dispatcher"];
  7. // 传递路由的相关数据传递给调度器
  8. $dispatcher->setControllerName(
  9. $router->getControllerName()
  10. );
  11. $dispatcher->setActionName(
  12. $router->getActionName()
  13. );
  14. $dispatcher->setParams(
  15. $router->getParams()
  16. );
  17. // 请求调度
  18. $dispatcher->dispatch();
  19. // 获取最后的返回结果
  20. $response = $dispatcher->getReturnedValue();
  21. // 判断结果是否是 'response' 对象
  22. if ($response instanceof ResponseInterface) {
  23. // 发送响应
  24. $response->send();
  25. }

另外一个修改就是在分发器中对抛出异常的捕捉可以将请求转发到其他的操作:

  1. <?php
  2. use Phalcon\Http\ResponseInterface;
  3. // 获取 'router' 服务
  4. $router = $di["router"];
  5. $router->handle();
  6. $dispatcher = $di["dispatcher"];
  7. // 传递路由的相关数据传递给调度器
  8. $dispatcher->setControllerName(
  9. $router->getControllerName()
  10. );
  11. $dispatcher->setActionName(
  12. $router->getActionName()
  13. );
  14. $dispatcher->setParams(
  15. $router->getParams()
  16. );
  17. try {
  18. // 请求调度
  19. $dispatcher->dispatch();
  20. } catch (Exception $e) {
  21. // An exception has occurred, dispatch some controller/action aimed for that
  22. // Pass the processed router parameters to the dispatcher
  23. $dispatcher->setControllerName("errors");
  24. $dispatcher->setActionName("action503");
  25. // Dispatch the request
  26. $dispatcher->dispatch();
  27. }
  28. // 获取最后的返回结果
  29. $response = $dispatcher->getReturnedValue();
  30. // 判断结果是否是 'response' 对象
  31. if ($response instanceof ResponseInterface) {
  32. // 发送响应
  33. $response->send();
  34. }

尽管上面的代码比使用 Phalcon\Mvc\Application 而需要的代码远远要累赘得很, 但它为启动你的应用提供了一个可修改、可定制化的途径。 因为根据你的项目需要,你可以想对实例什么和不实例化什么进行完全的控制,或者想用你自己的组件来替代那些确定和必须的组件从而扩展默认的功能。