30/09/2018, 17:31

[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 PhalconLoader;
    use PhalconMvcView;
    use PhalconMvcApplication;
    use PhalconDIFactoryDefault;
    use PhalconMvcUrl as UrlProvider;
    use PhalconDbAdapterPdoMysql 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 PhalconLoader

<?php

use PhalconLoader;

// ...

$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 PhalconDIFactoryDefault;

// ...

// 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 PhalconMvcView;

// ...

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

Tiếp theo là URI

<?php

use PhalconMvcUrl 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 PhalconMvcApplication;

// ...

$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 PhalconMvcController;

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)

Mai Anh Dũng viết 19:36 ngày 30/09/2018

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 diễn đàn rồi

Keep it up!

Chi Ngo viết 19:31 ngày 30/09/2018

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.

Mr.tanphat viết 19:45 ngày 30/09/2018

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

Phan Hoàng viết 19:39 ngày 30/09/2018

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.

GitHub

php-pm/php-pm

PPM is a process manager, supercharger and load balancer for modern PHP applications. - php-pm/php-pm

Bài liên quan
0