Phalcon - Phần 1: Cùng làm ví dụ đầu tiên

Phalcon không bắt buộc phải tạo cấu trúc theo quy định, nhưng để đơn giản ta hãy tạo theo cấu trúc sau.

tutorial/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/

Beautiful URLs
Nghĩa là các url đẹp. VD: https://www.thegioididong.com/, …Khi chúng ta chạy project thì chỉ cần chạy tên project là nó sẽ hiện ra trang web. Cụ thể trong ví dụ này là tutorial. Điều này rất có lợi trong việc SEO.

Chúng ta sẽ tạo file .htaccess theo thư mục /tutorial/.htaccess

#/tutorial/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ public/    [L]
    RewriteRule  (.*) public/$1 [L]
</IfModule>

/tutorial/public/.htaccess

#/tutorial/public/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

Để hiểu file .htaccess là gì thì tham khảo thêm tại: http://freetuts.net/file-htaccess-la-gi-76.html

Chú ý: Vì trong windows không cho phép ta tạo file mà không có tên phía trước. Vì thế có 1 cách đó là tạo 1 file .php, sau đó viết đoạn code:

<?php fopen(".htaccess", "w"); ?>

Cuối cùng chạy file này lên thì nó sẽ tạo ra file .htaccess, sau đó ta edit nó và gõ đoạn code như trên.

Bootstrap
Đây không phải là thư viện bootstrap để tạo giao diện, mà ở đây là file khi trang web chạy, nó sẽ chạy file này đầu tiên. Nó rất quan trọng. Tạo file theo đường dẫn tutorial/public/index.php

<?php
    use Phalcon\Loader;
    use Phalcon\Mvc\View;
    use Phalcon\Mvc\Application;
    use Phalcon\DI\FactoryDefault;
    use Phalcon\Mvc\Url as UrlProvider;
    use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
    
    try {
    
        // Register an autoloader
        $loader = new Loader();
        $loader->registerDirs(array(
            '../app/controllers/',
            '../app/models/'
        ))->register();
    
        // Create a DI
        $di = new FactoryDefault();
    
        // Setup the view component
        $di->set('view', function(){
            $view = new View();
            $view->setViewsDir('../app/views/');
            return $view;
        });
    
        // Setup a base URI so that all generated URIs include the "tutorial" folder
        $di->set('url', function(){
            $url = new UrlProvider();
            $url->setBaseUri('/tutorial/');
            return $url;
        });
    
        // Handle the request
        $application = new Application($di);
    
        echo $application->handle()->getContent();
    
    } catch (\Exception $e) {
         echo "PhalconException: ", $e->getMessage();
    }
?>

Chúng ta sẽ phân tích đoạn code này:

Autoloaders
Khi chạy đoạn code này, nó sẽ load class controllers và models trong project. Ngoài ra có thể đăng ký load nhiều hơn. Để dùng chúng ta dùng Phalcon\Loader

<?php

use Phalcon\Loader;

// ...

$loader = new Loader();
$loader->registerDirs(
    array(
        '../app/controllers/',
        '../app/models/'
    )
)->register();

Dependency Management
Đây là một khái niệm rất quan trọng khi sử dụng Phalcon. Nó giống như một cái túi lớn chứa những service khác mà chương trình sẽ sử dụng. Phalcon là một framework có tính phân chia cao, nhưng nó sẽ gộp chúng lại để sử dụng.

<?php

use Phalcon\DI\FactoryDefault;

// ...

// Create a DI
$di = new FactoryDefault();

Ở đây chúng ta đăng ký service View. View khác với Model và Controller, nó không phải là class nên không thể đăng ký autoloader. Vì thế ta đăng ký trong DI.

<?php

use Phalcon\Mvc\View;

// ...

// Setup the view component
$di->set('view', function() {
    $view = new View();
    $view->setViewsDir('../app/views/');
    return $view;
});

Tiếp theo là URI

<?php

use Phalcon\Mvc\Url as UrlProvider;

// ...

// Setup a base URI so that all generated URIs include the "tutorial" folder
$di->set('url', function(){
    $url = new UrlProvider();
    $url->setBaseUri('/tutorial/');
    return $url;
});

Cuối cùng là:

<?php

use Phalcon\Mvc\Application;

// ...

$application = new Application($di);

echo $application->handle()->getContent();

ta có thể hiểu đây là dòng để buid chạy chương trình.

Creating a Controller
Controller khi được đặt tên là Index thì nó sẽ là file đầu tiên khi không có controller hoặc action nào được yêu cầu. Tạo file controller theo app/controllers/IndexController.php

<?php

use Phalcon\Mvc\Controller;

class IndexController extends Controller
{

    public function indexAction()
    {
        echo "<h1>Hello!</h1>";
    }
}

Bây giờ bạn mở XAMPP lên và chạy thử project xem thế nào. Đường dẫn là http://localhost/tutorial/ .
Kết quả:

Vậy là bạn đã làm xong một ví dụ nhỏ bằng Phalcon.
(còn tiếp)

8 Likes

Wow, rất công phu. Cảm ơn @Hoa_Hoa nhé, @Hoa_Hoa thực sự khác với @Hoa_Hoa ngày lập topic đầu tiên trên DNH rồi :+1:

Keep it up!

Nghe nói cái Framework Falcon này được viết bằng ngôn ngữ C và có hiệu suất cao hơn hẳn các framework PHP khác.

Bài viết rất chi tiết cảm ơn bạn nhiều !!!

Phalcon chuyển PHP code sang C/C++ thôi (gần với binary code) nên nếu chạy kiểu thuần túy thì nó nhanh hơn là đúng rồi. Tuy nhiên, hiện nay mấy ai chạy PHP kiểu thuần túy (thông dịch).

  • Chạy kiểu Hiphop VM (sử dụng JIT compiler - biên dịch)
  • Chạy kiểu cache binary code, như opcode, APC (cũng runtime giống HHVM)

thì Phalcon có khi còn chẳng bằng luôn. Còn chưa thấy công nghệ chạy AOT compiler (Ahead of Time).

Giờ PHP cũng giả lập đa luồng (thực ra là đa process, và bắt chước event drivent programming như NodeJS), thậm chí không cần opcode mà vẫn cho tốc độ tốt gấp 15 lần.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?