11/08/2018, 22:34

MVC trong phalcon

MVC trong phalcon Phalcon cung cấp các class theo hướng đối đối tượng (object-oriented), cần thiết cho việc thực thi kiến trúc MVC trong ứng dụng. Design pattent này không những được sử dụng trong phalcon mà còn được sử dụng bởi nhiều web framework khác nhau. Mô hình MVC có các ưu điểm: Tách ...

MVC trong phalcon

Phalcon cung cấp các class theo hướng đối đối tượng (object-oriented), cần thiết cho việc thực thi kiến trúc MVC trong ứng dụng. Design pattent này không những được sử dụng trong phalcon mà còn được sử dụng bởi nhiều web framework khác nhau. Mô hình MVC có các ưu điểm:

  • Tách biệt xử lý logic giữa tầng giao diện người dùng và tầng database.
  • Code nhìn sẽ rõ ràng và dễ bảo trì.

I. Models

  • PhalconMvcModel Là cơ sở cho tất cả các các model trong một ứng dụng Phalcon (các model sẽ extend từ đây). Nó cung cấp các chức năng CRUD cơ bản, tìm kiếm nâng cao và mối quan hệ gữa các model, cùng với các service khác. PhalconMvcModel Tránh được việc sử dụng câu lệnh SQL bởi nó được biên dịch bởi những method một các tự động tương ứng với các toán tử trong database engine.
I.1. Tạo model trong Phalcon
  • Model trong Phalcon là một class extend từ PhalconMvcModel . Nó phải được đặt trong thư mục models. Một file model phải chứa một class, tên của class nên có trong ký hiệu của camel case (Naming convension camel case CamelCase Notation)

ví dụ như sau:

<? php
class Users extends PhalconMvcModel
{
//code.....
}

Chú ý là nó phải được kế thừa từ PhalconMvcModel. Mặc định thì model “Users” sẽ được map tương ứng với bảng “users”. Nếu muốn sử dụng theo ý muốn thì có thể map bằng cách sử dụng phương thức getSource():

<? php
class Users extends PhalconMvcModel
{
public function getSources()
{
return “user_tables”
}
}

Lúc nãy model Users sẽ được map tương ứng với bảng “user_tables” trong CSDL

I.2. Tìm kiếm

PhalconMvcModel cung cấp một số phương thức cho việc truy vấn tới bản ghi. Ví dụ: -users = User::find(); Lấy tất cả các bản ghi. users = User::find(“name = 'your name'”); hay order $$sers = User::find(array( “type = 'private'”, “order” => “name” )); hay với hàm findFirst() tìm bản ghi tương ứng đầu tiên:

$users = User::findFirst();
$users = User::find(“name = 'your name');

Cả hai hàm find() và findFirst() đều chấp nhận tìm kiếm kết hợp với tiêu chí

$user = User::find(array(
“conditions” => “name=?1”,
“bind” = array(1 => “your name”)
));

$$ser = User::findFirst(array( “name = 'your name”, “order”=> “name DESC” ));

Thay vì sử dụng array parameter ta có thể tạo câu truy vấn theo cách hướng đối tượng ví dụ:

$users = User::query()
->where(“age <20”)
->andWhere(“name = :name:”)
->bind(array(“name” => “your name”))
->order(“name”)
->execute();

Tìm kiếm với phương thức findFirstBy<property-name>(): Phương thức này được mở rộng từ phương thức findFirst() ví dụ:

$user = Users::findFirstByName(“your name”);
$user = Users::findFirstByAge(22);
I.3. Model resultsets
  • Trong khi findFirst() trả một thể hiện của class thì find() sẽ trả về một PhalconMvcModelResultsetSimple. Nó là một đối tượng được đóng gói có tất cả các tính năng của một resultset như tìm kiếm một số bản ghi trong đó, đếm số bản ghi … Tính năng mạnh nhất của PhalconMvcModelResultset là tại bất cứ thời điểm nào cũng chỉ có một bản ghi trong bộ nhớ, Điều này rất hữu ích trong quản lý bộ nhớ khi làm việc với dữ liệu lớn. ví dụ :
  • Traversing với foreach
foreach ($users as $user){
echo $user->name,n;
}
  • Traversing với while
while($robots->valid()){
$user = $users->current();
echo $user->name,n;
$users->next();
}
  • Đếm số bản ghi trong resultset count(users);hayusers); hay users);hayusers->count();

  • Di chuyển con trỏ tới vị trí trong resultset users-&gtseek(4); lúc này con trỏ sẽ chỉ tới user 5 và khi sử dụng phương thức current() nó sẽ trả về user thứ 5. `user = users-&gtcurrent();` hoặc ta có thể sử dụng vị trí trong resultset user = $$sers[4] kết quả tương tự như trên

1. Mối quan hệ giữa các Model

Có 4 kiểu quan hệ:

  • one-on-one
  • one-to-many
  • many-to-one
  • many-to-many
1.1 Quan hệ một chiều
  • Là những quan hệ được tạo ra quan hệ khác nhưng không có chiều ngược lại 1.2. Quan hệ hai chiều
  • Mối quan hệ được xây dựng trên cả 2 model và mỗi model sẽ định nghĩa mối quan hệ ngược lại với model còn lại.
1.3 Định nghĩa mối quan hệ mối quan hệ
  • Trong phalcon mối quan hệ phải được định nghĩa trong phương thức khởi tạo của model initialize(). Những phương thức belongsTo(), hasOne(), hasMany(), hasManyToMany() định nghĩa mối quan hệ giữa một hoặc nhiều trường của model hiện tại tới các trường của model khác. Mỗi một phương thức đều yêu cầu 3 tham số: Các trường của model hiện tại, model tham chiếu đến, các trường tham chiếu của model còn lại.
Phương thức Mô tả
hasMany 1-n relationship
hasOne 1-1 relationship
belongsTo n-1 relationship
hasManyToMany n-n relationship

Users có quan hệ một nhiều với Posts chẳng hạn

<?php

class Users extends PhalconMvcModel
{
public $id;
public $name;
public function initialize()
{
$this->hasMany("id", "Posts", "user_id");
}
public $id;
public $user_id;
public $description;
public function initialize()
{
$this->belongsTo("user_id", "Users", "id");
}
}
2. Storage 2.1 Create/update
<?php
$user = new Users();
$user->save($_POST, array('name', email'));
<?php
$user = new Users();
$user->name = “your name”
$user->create()
2.2 Storing ralated records

Ví dụ: để lưu dữ liệu của 2 bảng đồng thời như sau Với quan hệ Users hasMany Posts

$post = new Posts();
$post->descripton = “Some text”
$user = new Users();
$user->name = “your name”;
$user->posts = $post;
$user->save(); Lưu đồng thời cả user và post
2.3 Independent Column Mapping

ORM hỗ trợ việc map cột cho phép ta sử dụng tên cột trong model khác với trong table, Phalcon con sẽ tự nhận ra và ánh xạ vào database Ví dụ:

<?php
class Robots extends PhalconMvcModel
{
public function columnMap()
{
return array(
'id' => 'code',
'the_name' => 'theName',
'the_type' => 'theType',
'the_year' => 'theYear'
);
}
}
}

Posts sẽ có quan hệ belongsTo ngược lại với model Users

class Posts extends PhalconMvcModel
{
public $id;
public $user_id;
public $description;
public function initialize()
{
$this->belongsTo("user_id", "Users", "id");
}
}
2. Storage 2.1 Create/update
<?php
$user = new Users();
$user->save($_POST, array('name', email'));
<?php
$user = new Users();
$user->name = “your name”
$user->create()
2.2 Storing ralated records

Ví dụ: để lưu dữ liệu của 2 bảng đồng thời như sau Với quan hệ Users hasMany Posts

$post = new Posts();
$post->descripton = “Some text”
$user = new Users();
$user->name = “your name”;
$user->posts = $post;
$user->save(); Lưu đồng thời cả user và post
2.3 Independent Column Mapping

ORM hỗ trợ việc map cột cho phép ta sử dụng tên cột trong model khác với trong table, Phalcon con sẽ tự nhận ra và ánh xạ vào database Ví dụ:

<?php
class Robots extends PhalconMvcModel
{
public function columnMap()
{
return array(
'id' => 'code',
'the_name' => 'theName',
'the_type' => 'theType',
'the_year' => 'theYear'
);
}
}

II. view

PhalconMvcView và PhalconMvcViewSimple Chịu trách nhiệm cho việc quản lý view layer của ứng dụng MVC.

II.1 Sự kết hợp của view với controller
  • Phalcon sẽ tự động thực thi các thành phần của view ngay sau khi controller thực hiện xong. view component sẽ được đặt trong thư mục cùng tên với controller cuối cùng thực thi và thư mục đó nằm trong thư mục view. ví dụ controller Users => appviewsusers Để truyền biến từ controller ra view dùng method setVar()
<? php
$this->view->setVart(“users”, $users);
II.2 Control Rendering Levels
  • PhalconMvcView hỗ trợ view kiểu phân nhánh, bạn có thể điều khiển level render ở view. Sử dụng phương thức PhalconMvcView::setRenderLevel(). Phương thức này được dùng trong controller hoặc từ một tầng view layer cao hơn.
public function findAction()
{
// không render view
$this->view->setRenderLevel(View::LEVEL_NO_RENDER);
//...
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
}
II.3 sử dụng partial
  • sử dụng phương thức partial để render view
<?php $this->partial("shared/ad_banner", array('id' => $site->id, 'size' => 'big')) ?>

với parameter là biến sẽ được dùng trong partial view.

II.4 Chuyển biến từ controller xuống view
  • Có 2 cách:
  • dùng phương thức setVar(): $$his->view->setVar("posts", Posts::find());
  • $$his->view->posts = Posts::find();

III. Controller

  • Mặc định thì cá phương thức public trong controller sẽ được mặc định map tương tứng actions và được truy cập bởi url.
  • Tên class Controller phải kết thúc bằng “Controller” và các Tên Actions phải kết thúc bằng “Action”
  • Parameter được gán theo thứ thự mà chúng được truyền vào route. ví dụ :
public funtion showAction(){
$year = $this->dispatcher->getParam('year');
$postTitle = $this->dispatcher->getParam('postTitle');
}
III.1. Dispath loop
  • Được thực thi trong Dispatcher đến khi không còn action nào được thực hiện. forward có thể thực thi tới một controller or một actions khác.
public function showAction($year, $postTitle)
{
$this->flash->error("You don't have permission to access this area");
$this->dispatcher->forward(array(
"controller" => "users",
"action" => "signin"
));
}
III.2. Initializing Controllers
  • Phương thức khởi tạo của controller sẽ được chạy trước bất kỳ action nào trong controller
public function initialize()
{
$this->settings = array(
"mySetting" => "value" );
}
III.3 Request và Respons
  • request trong Phalcon là một thể hiện của PhalconHttpRequest và respone PhalconHttpResponse.
public function saveAction()
{
if ($this->request->isPost() == true) {
$customerName = $this->request->getPost("name");
$customerBorn = $this->request->getPost("born");
}
}

Demo https://github.com/khanhhd/learning_phalcon.git

0