教程 1: 让我们先æ¥å¦ä¹ 一个例å ================================== 在本节教程ä¸ï¼Œæˆ‘们将带您创建一个简å•的注册表å•的应用程åºã€‚ 我们还将解释框架的行为的基本方é¢ã€‚å¦‚æžœä½ æœ‰å¯¹è‡ªåŠ¨ç”Ÿæˆéƒ¨åˆ†ä»£ç 感兴趣, 您å¯ä»¥æŸ¥çœ‹ :doc:`developer tools <tools>`. 检查您的安装 -------------------------- 我们å‡è®¾ä½ å·²ç»å®‰è£…了Phalcon,您å¯ä»¥åˆ©ç”¨Phpinfo()函数æ¥è¿›è¡Œè¾“å‡ºæŸ¥çœ‹æ˜¯å¦æœ‰phalcon出现? .. code-block:: php <?php print_r(get_loaded_extensions()); ?> 如果在下é¢å‡ºçŽ°äº†phalconæ‰©å±•çš„å—æ ·ï¼Œé‚£ä¹ˆè¯´æ˜Žä½ 安装æˆåŠŸäº†: .. code-block:: php Array ( [0] => Core [1] => libxml [2] => filter [3] => SPL [4] => standard [5] => phalcon [6] => pdo_mysql ) 创建一个项目 ------------------ å¦ä¹ 的最好方法是,您按照本教程的指引一æ¥ä¸€æ¥çš„进行. 您å¯ä»¥ä»Žæ¤å¤„获得完整的代ç `here <https://github.com/phalcon/tutorial>`_. 目录结构 ^^^^^^^^^^^^^^ Phalcon 是æ¾è€¦åˆçš„ï¼Œå› æ¤å¹¶æ²¡æœ‰å¯¹æ–‡ä»¶çš„目录作固定,您å¯ä»¥æ ¹æ®æ‚¨çš„éœ€è¦æˆ–喜好,自定义文件目录结构 本教程的目的和出å‘点, 我们建议您使用以下类似的文件目录结构: .. code-block:: php tutorial/ app/ controllers/ models/ views/ public/ css/ img/ js/ éœ€è¦æ³¨æ„的是,您ä¸éœ€è¦åŒ…å«ä»»ä½•类库到æ¤é¡¹ç›®ä¸å°±å¯ä»¥å·¥ä½œäº†ï¼Œå› 为Phalconå·²ç»å½“作一个php模å—åŠ è½½è¿›æ¥äº†. (译者备注)比如您使用ZFæˆ–è€…å…¶ä»–æ¡†æž¶çš„æ—¶å€™ï¼Œä½ è¦ä¹ˆincludeè¿›æ¥ï¼Œè¦ä¹ˆåœ¨include_pathä¸åŠ å…¥æ¡†æž¶çš„è·¯å¾„ã€‚ä½†Phalconå´ä¸å¿…è¿™æ ·ã€‚ 完美漂亮的URL ^^^^^^^^^^^^^^ 在本教程ä¸ï¼Œæˆ‘ä»¬å°†æ•™ä½ å¦‚ä½•åšå‡ºæ¼‚亮的(å‹å¥½çš„)网å€ã€‚å‹å¥½çš„URLéžå¸¸æœ‰åˆ©äºŽæœç´¢å¼•æ“Žä¼˜åŒ–ï¼Œå› ä¸ºå®ƒä»¬å¾ˆå®¹æ˜“è®©ç”¨æˆ·è®°ä½ã€‚Phalconæ”¯æŒæœ€æµè¡Œçš„WebæœåŠ¡å™¨çš„é‡å†™ã€‚使您的应用程åºçš„URLä¸å®Œå…¨ä¾èµ–web serverå°±å¯ä»¥å†™å‡ºå¾ˆå‹å¥½çš„æ ¼å¼ã€‚ 在这个例åä¸ï¼Œæˆ‘们将使用为Apacheé‡å†™æ¨¡å—。我们使用.htaccess文件的é‡å†™è§„则: .. code-block:: apacheconf #/.htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule> All requests to the project will be rewritten to the public/ directory making it the document root. This step ensures that the internal project folders remain hidden from public viewing and thus posing security threats. The second set of rules will check if the requested file exists, and if it does it doesn't have to be rewritten by the web server module: .. code-block:: apacheconf #/public/.htaccess <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] </IfModule> Bootstrap ^^^^^^^^^ 第一æ¥ï¼Œä½ 需è¦åˆ›å»ºä¸€ä¸ªç¨‹åºçš„引导文件,这个文件是éžå¸¸é‡è¦çš„ï¼Œå› ä¸ºå®ƒä½œä¸ºæ‚¨çš„åº”ç”¨ç¨‹åºçš„åŸºç¡€ï¼Œè®©ä½ æŽ§åˆ¶å®ƒçš„å„个方é¢ï¼Œåœ¨è¿™ä¸ªæ–‡ä»¶ä¸ï¼Œä½ å¯ä»¥å®žçްåˆå§‹åŒ–组件以åŠåº”用程åºçš„行为 一般我们会以index.php为引导程åºçš„å…¥å£ç¨‹åºï¼Œpublic/index.php 内容大致如下: .. code-block:: php <?php try { //Register an autoloader $loader = new \Phalcon\Loader(); $loader->registerDirs(array( '../app/controllers/', '../app/models/' ))->register(); //Create a DI $di = new Phalcon\DI\FactoryDefault(); //Setting up the view component $di->set('view', function(){ $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../app/views/'); return $view; }); //Handle the request $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(\Phalcon\Exception $e) { echo "PhalconException: ", $e->getMessage(); } ç±»çš„è‡ªåŠ¨åŠ è½½ ^^^^^^^^^^^^^^^^^^ 在第一部分,我们å‘现注册了首先定义了一个autoloader,它的作用是用æ¥è‡ªåŠ¨åŠ è½½åº”ç”¨ä¸çš„æŽ§åˆ¶ç±»åŠæ¨¡åž‹ç±»ç‰ã€‚我们用它å¯ä»¥çµæ´»çš„åŠ è½½ä¸€ä¸ªç›®å½•æˆ–è€…å¤šä¸ªç›®å½•ä¸çš„类。在下é¢çš„例åä¸ï¼Œæˆ‘们将介ç»å¦‚何使用Phalcon\Loader 有了它,我们å¯ä»¥ä½¿ç”¨ä¸åŒçš„ç–ç•¥æ¥åŠ è½½ç±»åº“ã€‚ä¸‹é¢çš„ä¾‹åæ˜¯è‡ªåŠ¨æ³¨å†ŒæŽ§åˆ¶å™¨ç±»ç›®å½•åŠæ¨¡åž‹ç±»ç›®å½•: .. code-block:: php <?php $loader = new \Phalcon\Loader(); $loader->registerDirs( array( '../app/controllers/', '../app/models/' ) )->register(); ä¾èµ–ç®¡ç† ^^^^^^^^^^^^^^^^^^^^^ 使用Phalconï¼Œä½ å¿…é¡»äº†è§£å®ƒçš„ä¸€ä¸ªéžå¸¸é‡è¦çš„æ¦‚念,那就是他的ä¾èµ–注入容器。å¬èµ·æ¥å¾ˆå¤æ‚,但实际使用上它是éžå¸¸ç®€å•和实用的。 译者注:å¦è¿‡æˆ–者对JAVA有些了解的人都应该å分熟悉ä¾èµ–注入的概念,在早期这个概念被称作IOC(控制å转)ï¼ŒåŽæœŸæ‰è¢«ç§°ä½œDI。它们分别是inversion of control,Dependency Injectionçš„è‹±æ–‡ç¼©å†™ã€‚åªæ˜¯DIæ›´èƒ½è¡¨è¾¾å…¶å«æ„ï¼Œå› æ¤åŽæ¥åŸºæœ¬éƒ½å«åšDI。对这个概念ä¸å¤ªæ‡‚的人,å¯ä»¥æœç´¢ä¸€ä¸ªè¿™ä¸¤ä¸ªè‹±æ–‡å•è¯ï¼Œç›¸ä¿¡ä½ 会有ä¸å°‘收获。 一个æœåŠ¡å®¹å™¨å°±ç›¸å½“äºŽä¸€ä¸ªè¢‹å,用于å˜å‚¨æˆ‘们应用将è¦ç”¨åˆ°çš„一些æœåŠ¡ï¼Œæ¯å½“框架需è¦ä¸€ä¸ªç»„ä»¶ï¼Œå°†è¦æ±‚æœåŠ¡å®¹å™¨é¦–å…ˆæ³¨å†Œè¿™ä¸ªæœåŠ¡ç»„ä»¶ã€‚Phalcon是一个高度æ¾è€¦åˆçš„æ¡†æž¶ï¼ŒPhalcon\DI 将使这些è¦ç”¨åˆ°çš„æœåŠ¡ç»„ä»¶é€æ˜Žçš„结åˆåœ¨ä¸€èµ·ã€‚ .. code-block:: php <?php //Create a DI $di = new Phalcon\DI\FactoryDefault(); :doc:`Phalcon\\DI\\FactoryDefault <../api/Phalcon\_DI_FactoryDefault>` 是Phalcon\DIçš„ä¸€ä¸ªé»˜è®¤å®žçŽ°ï¼Œä¸ºäº†ä½¿å¼€å‘æ›´å®¹æ˜“,它注册了大é‡çš„æœåŠ¡ç»„ä»¶é›†æˆåˆ°Phalconã€‚å› æ¤ï¼Œæˆ‘们ä¸éœ€è¦å†ä¸€ä¸ªä¸€ä¸ªçš„æ³¨å†Œè¿™äº›ç»„件,以åŽç›´æŽ¥ä½¿ç”¨ä¹Ÿæ²¡æœ‰é—®é¢˜ã€‚ 在接下æ¥çš„部分,我们将注册一个“viewâ€è§†å›¾ç»„件,并指定视图文件所在目录,由于视图ä¸åŒäºŽç±»æ–‡ä»¶ï¼Œå®ƒä»¬ä¸èƒ½è¢«autoloaderè‡ªåŠ¨åŠ è½½ã€‚ æœåŠ¡ç»„ä»¶å¯ä»¥é€šè¿‡å¤šç§æ–¹å¼è¿›è¡Œæ³¨å†Œï¼Œåœ¨æˆ‘们的教程ä¸ï¼Œæˆ‘们将使用lambda的匿å函数方å¼è¿›è¡Œæ³¨å†Œ .. code-block:: php <?php //Setting up the view component $di->set('view', function(){ $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../app/views/'); return $view; }); 在最åŽä¸€éƒ¨åˆ†ï¼Œæˆ‘们看到 :doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>`. 它的作用是åˆå§‹åŒ–请求,对请求进行URL路由,分å‘å“应,它收集所有的请求,执行并返回å“应。 .. code-block:: php <?php $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); æ£å¦‚ä½ æ‰€çœ‹åˆ°çš„ï¼Œç¨‹åºçš„引导文件是很çŸçš„,并且ä¸éœ€è¦åŠ è½½ä»»ä½•é¢å¤–的文件,我们定义的一个MVC应用代ç å¯ä»¥å°‘于30行代ç 。 创建一个控制器 ^^^^^^^^^^^^^^^^^^^^^ 默认情况下,Phalcon的控制器å默认为 "index",这么åšçš„åŽŸå› æ˜¯åœ¨è¯·æ±‚ä¸æ²¡æœ‰ä¼ 递控制器åŠåŠ¨ä½œæ—¶ï¼Œè¯¥æŽ§åˆ¶å™¨è¢«è‡ªåŠ¨è°ƒç”¨ï¼ˆè¯‘è€…æ³¨ï¼šZFç‰ä¸€äº›æ¡†æž¶éƒ½æ˜¯è¿™ä¹ˆåšçš„)默认的控制器(app/controllers/IndexController.php)å¤§æ¦‚æ˜¯è¿™ä¸ªæ ·å的: .. code-block:: php <?php class IndexController extends \Phalcon\Mvc\Controller { public function indexAction() { echo "<h1>Hello!</h1>"; } } 控制器的类å都必须以"Controller"结æŸï¼ŒæŽ§åˆ¶å™¨ç±»çš„æ–¹æ³•å必须以"Action"结æŸï¼Œå¦‚æžœä½ é€šè¿‡æµè§ˆå™¨è®¿é—®åº”ç”¨ï¼Œçœ‹åˆ°çš„æ˜¯è¿™ä¸ªæ ·å: .. figure:: ../_static/img/tutorial-1.png :align: center æå–œä½ ï¼Œä½ çš„åº”ç”¨å·²ç»æˆåŠŸè¿è¡Œï¼ 视图数æ®è¾“出 ^^^^^^^^^^^^^^^^^^^^^^^^ 通过控制器å‘è§†å›¾è¾“å‡ºæ•°æ®æœ‰æ—¶å€™æ˜¯å¿…è¦çš„,但大多数情况下被è¯å®žä¸å¤ªç†æƒ³ã€‚Phalconæ˜¯æ ¹æ®æŽ§åˆ¶å™¨å’ŒåŠ¨ä½œåœ¨è§†å›¾ç›®å½•ä¸æ‰¾åˆ°ç›¸åº”的视图文件的,看例å (app/views/index/index.phtml): .. code-block:: php <?php echo "<h1>Hello!</h1>"; 控制器 (app/controllers/IndexController.php) 定义了一个空的动作,å³(indexAction): .. code-block:: php <?php class IndexController extends \Phalcon\Mvc\Controller { public function indexAction() { } } ä¸å‡ºæ„外的è¯ï¼Œä¼šè¾“出 'hello world'.在执行action的时候,视图组件 :doc:`Phalcon\\Mvc\\View <../api/Phalcon_Mvc_View>` 被自动创建。 è®¾è®¡ä¸€ä¸ªæ³¨å†Œè¡¨å• ^^^^^^^^^^^^^^^^^^^^^^^^ 现在我们将修改 index.phtml è§†å›¾æ–‡ä»¶ï¼ŒåŒæ—¶æ·»åŠ ä¸€ä¸ªæ–°çš„æŽ§åˆ¶å™¨æ–‡ä»¶ï¼Œå¹¶å‘½å为"signup".它的作用是让用户å¯ä»¥æ³¨å†Œæˆ‘们的应用。 .. code-block:: php <?php echo "<h1>Hello!</h1>"; echo Phalcon\Tag::linkTo("signup", "Sign Up Here!"); 以上代ç 会生æˆä¸€ä¸ª html "A" æ ‡ç¾ï¼Œè¿žæŽ¥åˆ°æ–°çš„ signup 控制器上: .. code-block:: html <h1>Hello!</h1> <a href="/test/signup">Sign Up Here!</a> 生æˆhtmlæ ‡ç¾ï¼Œæˆ‘们使用 :doc:`\Phalcon\\Tag <../api/Phalcon_Tag>`. 更多的htmlç”Ÿæˆæ–¹å¼è¯·æŸ¥çœ‹ :doc:`found here <tags>` .. figure:: ../_static/img/tutorial-2.png :align: center 䏋颿˜¯Signup控制器文件内容 (app/controllers/SignupController.php): .. code-block:: php <?php class SignupController extends \Phalcon\Mvc\Controller { public function indexAction() { } } The empty index action gives the clean pass to a view with the form definition: 视图文件内容 (app/views/sigup/index.phtml) .. code-block:: html+php <?php use Phalcon\Tag; ?> <h2>Sign using this form</h2> <?php echo Tag::form("signup/register"); ?> <p> <label for="name">Name</label> <?php echo Tag::textField("name") ?> </p> <p> <label for="name">E-Mail</label> <?php echo Tag::textField("email") ?> </p> <p> <?php echo Tag::submitButton("Register") ?> </p> </form> 通过æµè§ˆå™¨è®¿é—®ï¼Œæ˜¾ç¤ºç»“果如下: .. figure:: ../_static/img/tutorial-3.png :align: center :doc:`Phalcon\\Tag <../api/Phalcon_Tag>` æä¾›äº†å¾ˆå¤šçš„æ–¹æ³•生æˆè¡¨ç« å…ƒç´ . The Phalcon\\Tag::form method receives only one parameter for instance, a relative uri to a controller/action in the application. 点击 "Send" æŒ‰é’®æ—¶ï¼Œä½ ä¼šå‘现Phalcon会抛出一个异常,表明我们在控制器ä¸ç¼ºå°‘"register" Action, public/index.php 抛出的异常内容如下: PhalconException: Action "register" was not found on controller "signup" 实现registerActionåŽï¼Œå¼‚常消除: .. code-block:: php <?php class SignupController extends \Phalcon\Mvc\Controller { public function indexAction() { } public function registerAction() { } } å¦‚æžœä½ ç‚¹å‡»"Send"按钮,将转到一个空白页é¢ï¼Œè¡¨å•ä¸æäº¤çš„nameå’Œemailå°†å˜å‚¨åˆ°æ•°æ®åº“,为了实现干净的é¢åƒå¯¹è±¡ï¼Œæˆ‘们将使用models Creating a Model ^^^^^^^^^^^^^^^^ Phalcon带æ¥äº†ç¬¬ä¸€ä¸ªç”¨Cè¯è¨€å†™çš„PHP ORM,它简化了开å‘çš„å¤æ‚性。 在创建我们的第一个Model之å‰ï¼Œæˆ‘ä»¬éœ€è¦æŠŠæ•°æ®è¡¨æ˜ 射到modelï¼Œå³æˆ‘们需è¦å…ˆåˆ›å»ºæ•°æ®åº“åŠæ•°æ®è¡¨ç»“构,一个简å•的用户表结构: .. code-block:: sql CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(70) NOT NULL, `email` varchar(70) NOT NULL, PRIMARY KEY (`id`) ); 一个modeléœ€è¦æ”¾åˆ° app/models目录下,下é¢å®šä¹‰çš„ Users modelå°†æ˜ å°„åˆ° "users"æ•°æ®è¡¨ä¸Š: .. code-block:: php <?php class Users extends \Phalcon\Mvc\Model { } 设置数æ®åº“连接 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 为了能够连接到数æ®åº“,并éšåŽè¿›è¡Œæ•°æ®è®¿é—®ï¼Œé€šè¿‡æˆ‘们创建的model,我们需è¦è®¾å®šæ•°æ®åº“连接。 æ•°æ®åº“连接是å¦ä¸€ç§æœåŠ¡ï¼Œæˆ‘ä»¬çš„åº”ç”¨ç¨‹åºï¼Œç”±å‡ 部分组æˆï¼š .. code-block:: php <?php try { //Register an autoloader $loader = new \Phalcon\Loader(); $loader->registerDirs(array( '../app/controllers/', '../app/models/' ))->register(); //Create a DI $di = new Phalcon\DI\FactoryDefault(); //Set the database service $di->set('db', function(){ return new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "test_db" )); }); //Setting up the view component $di->set('view', function(){ $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../app/views/'); return $view; }); //Handle the request $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(\Phalcon\Exception $e) { echo "PhalconException: ", $e->getMessage(); } 设置æ£ç¡®çš„æ•°æ®åº“è¿žæŽ¥å‚æ•°ï¼Œæˆ‘们创建的modelsæ‰èƒ½æ£å¸¸å·¥ä½œã€‚ 使用modelså˜å‚¨æ•°æ® ^^^^^^^^^^^^^^^^^^^^^^^^^ 接收由表å•ä¼ è¿‡æ¥çš„æ•°æ®ï¼Œå¹¶å°†ä»–们å˜å‚¨åˆ°ç›¸åº”的数æ®è¡¨ä¸ .. code-block:: php <?php class SignupController extends \Phalcon\Mvc\Controller { public function indexAction() { } public function registerAction() { //Request variables from html form $name = $this->request->getPost("name", "string"); $email = $this->request->getPost("email", "email"); $user = new Users(); $user->name = $name; $user->email = $email; //Store and check for errors if ($user->save() == true) { echo "Thanks for register!"; } else { echo "Sorry, the following problems were generated: "; foreach ($user->getMessages() as $message) { echo $message->getMessage(), "<br/>"; } } } } 用户æäº¤çš„任何数æ®éƒ½æ˜¯ä¸å¯ä¿¡çš„ï¼Œå› æ¤æˆ‘们需è¦å¯¹ç”¨æˆ·æäº¤çš„æ•°æ®è¿›è¡Œè¿‡æ»¤ï¼Œåªæœ‰é€šè¿‡éªŒè¯å’Œè¿‡æ»¤åŽçš„内容,æ‰è¿›è¡Œä¿å˜ã€‚è¿™ä½¿å¾—åº”ç”¨ç¨‹åºæ›´å®‰å…¨ï¼Œå› ä¸ºè¿™æ ·é¿å…了常è§çš„æ”»å‡»ï¼Œæ¯”如SQLæ³¨å…¥ç‰ åœ¨æœ¬èŠ‚æ•™ç¨‹ä¸ï¼Œæˆ‘们使用过滤器过滤一个å—符串类型的表å•å˜é‡ï¼Œä»¥ç¡®ä¿ç”¨æˆ·æäº¤çš„内容ä¸åŒ…嫿¶æ„å—符, :doc:`Phalcon\\Filter <../api/Phalcon_Filter>` 使得过滤任务ä¸å†å¤æ‚ï¼Œå› ä¸ºæˆ‘ä»¬å¯ä»¥ç›´æŽ¥ä½¿ç”¨requestä¸çš„getPost调用 ç„¶åŽå®žé™…化Users类,它对应一个Userï¼Œç±»çš„å…¬å…±å±žæ€§ä¼šæ˜ å°„åˆ°usersæ•°æ®è¡¨ä¸çš„å—æ®µï¼Œé€šè¿‡è°ƒç”¨save()方法把该æ¡è®°å½•æ•°æ®å˜å‚¨åˆ°æ•°æ®è¡¨ã€‚save()方法返回一个 bool值,它告诉我们å˜å‚¨æ•°æ®æ˜¯å¦æˆåŠŸ 译者注:save()方法是通过继承得æ¥çš„ï¼Œå› ä¸ºæ‰€æœ‰çš„Model都必须继承自 :doc:`Phalcon\\Mvc\\Model <../api/Phalcon_Mvc_Model>`ã€‚å†æ³¨é‡Šä¸€ä¸‹ï¼Œåˆ«å¤ªæ‰£å—çœ¼ï¼Œä½ å½“ç„¶ä¹Ÿå¯ä»¥ä¸ç»§æ‰¿è‡ª Modelï¼Œé‚£ä¹ˆä½ å°±ç”¨ä¸æˆmodel的相关功能了:) 其他的验è¯ä¼šè‡ªåЍå‘生,比如数æ®å—段定义的not null,å³ç±»å±žæ€§åœ¨ä¿å˜æ—¶å¿…须有值。如果我们ä¸è¾“入任何数æ®ç›´æŽ¥è¿›è¡Œæäº¤ï¼Œå°†æ˜¾ç¤ºä»¥ä¸‹å†…容: .. figure:: ../_static/img/tutorial-4.png :align: center 结æŸè¯ ---------- 这是一个éžå¸¸ç®€å•çš„æ•™ç¨‹ï¼Œä½ å¯ä»¥çœ‹åˆ°ï¼Œä½ å¯ä»¥ä½¿ç”¨Phalcon很容易的创建一个应用程åºï¼Œå¸Œæœ›æ‚¨ç»§ç»é˜…è¯»æœ¬æ‰‹å†Œï¼Œè¿™æ ·ä½ å°±å¯ä»¥å‘现Phalconæä¾›çš„æ›´å¤šçš„é™„åŠ åŠŸèƒ½ï¼ å…¶ä»–çš„ç¤ºä¾‹ ------------------- 以下的示例也是使用Phalconå¼€å‘的,å¯ä»¥ä¸‹è½½è¿›è¡Œå¦ä¹ ã€‚åŒæ—¶æ¬¢è¿Žæä¾›æ›´å¤šçš„完整的示例程åºï¼š * `INVO application`_: Invoice generation application. Allows for management of products, companies, product types. etc. * `PHP Alternative website`_: Multilingual and advanced routing application. .. _INVO application: http://blog.phalconphp.com/post/20928554661/invo-a-sample-application .. _PHP Alternative website: http://blog.phalconphp.com/post/24622423072/sample-application-php-alternative-site