2010-08-24 49 views
5

Tôi đang nghiên cứu tạo MVC rất đơn giản của riêng mình và tôi đang phân tích các cách để chuyển từ bộ điều khiển sang chế độ xem. Trong đó bao gồm việc gửi các biến từ một lớp đến một trang PHP cũ đơn giản.Đi từ Bộ điều khiển đến Chế độ xem

Tôi chắc chắn rằng điều này đã được đề cập trước đây, nhưng tôi muốn xem những loại ý tưởng mọi người có thể đưa ra.

//this file would be /controller/my_controller.php 

class My_Controller{ 

    function someFunction(){ 

    $var = 'Hello World'; 
    //how do we get var to our view file in the document root? 
    //cool_view.php 

    } 

} 

Trả lời

1

Một số loại hashtable là một cách hay để làm điều đó. Trả về các biến của bạn dưới dạng mảng kết hợp sẽ lấp đầy tất cả các khoảng trống trong chế độ xem của bạn.

+0

Vì vậy, bạn nên chỉ trả về các biến trong bộ điều khiển. Và sau đó trong khung nhìn nói $ vars = new my_controller(); và sau đó sử dụng chức năng thích hợp. Đó thực sự là một giải pháp dễ dàng. – Mike

1

Lưu trữ các biến của bạn như một thuộc tính trong đối tượng điều khiển của bạn, sau đó trích xuất chúng khi vẽ

class My_Controller { 

    protected $locals = array(); 

    function index() { 
     $this->locals['var'] = 'Hello World'; 
    } 

    protected function render() { 
     ob_start(); 
     extract($this->locals); 
     include 'YOUR_VIEW_FILE.php'; 
     return ob_get_clean(); 
    } 
} 

Bạn có thể xác định những __get và __set phương pháp kỳ diệu để làm cho nó đẹp hơn

$this->var = 'test'; 
+0

Hãy thực sự cẩn thận với 'trích xuất', đọc kỹ trước khi sử dụng http://ru2.php.net/manual/en/function.extract.php – Kirzilla

1

Tôi cũng phát triển MVC đơn giản của riêng tôi và most simple way để làm điều đó là ...

class My_Controller 
{ 

    function someFunction() { 
     $view_vars['name'] = 'John'; 
     $view = new View('template_filename.php', $view_vars); 
    } 

} 

Xem lớp

class View 
{ 
    public function __construct($template, $vars) { 
     include($template); 
    } 
} 

template_filename.php

Hello, <?php echo $vars['name'];?> 

tôi khuyên bạn hãy nhìn vào PHP Savant http://phpsavant.com/docs/

0

tôi đã tạo MVC của riêng mình cho quá trình PHP miễn phí Tôi đang tiến hành cho một số ít người muốn cải thiện PHP.

Đến nay cách tốt nhất để làm điều này là sử dụng mẫu Command + Factory.

Ví dụ:

interface ControllerCommand 
{ 
    public function execute($action); 
} 

Trong mỗi bộ điều khiển:

class UserController implements ControllerCommand 
{ 
    public function execute($action) 
    { 
     if ($action == 'login') 
     { 
      $data['view_file'] = 'views/home.tpl.php'; 
     } 
     else if ($action == 'edit_profile') 
     { 
      $data['view_file'] = 'views/profile.tpl.php'; 
      $data['registration_status'] = $this->editProfile(); 
     } 

     return $data; 
    } 
} 

Từ front controller chính của bạn:

$data = ControllerCommandFactory::execute($action); 
if (!is_null($data)) { extract($data); } 
/* We know the view_file is safe, since we explicitly set it above. */ 
require $view_file; 

Vấn đề là mỗi lớp Controllercommand có chức năng thực hiện và trả về quan điểm của mình và bất kỳ dữ liệu cho chế độ xem đó.

Đối với toàn bộ MVC, bạn có thể truy cập ứng dụng nguồn mở bằng cách gửi email cho tôi theo địa chỉ theodore [at] phpexperts.pro.

1

Tôi muốn thanh toán Zend_View và cách thức hiển thị chế độ xem hiển thị.

Bạn có thể lấy nguồn của ViewAbstractView trên github - không may Tôi không tìm thấy kho lưu trữ hiện tại (trong svn) dễ duyệt.

Về cơ bản các biến chế độ xem được chứa trong đối tượng View (mà trình điều khiển của bạn có quyền truy cập), sau đó mẫu (tài liệu php cũ thuần túy) được hiển thị bên trong đối tượng đó.Phương thức đó cho phép truy cập mẫu tới $this.

Nó sẽ là một cái gì đó như:

<?php 
class View 
{ 
    public function render() 
    { 
    ob_start(); 
    include($this->_viewTemplate); //the included file can now access $this 
    return ob_get_clean(); 
    } 
} 
?> 

Vì vậy, trong điều khiển của bạn:

<?php 
class Controller 
{ 
    public function someAction() 
    { 
    $this->view->something = 'somevalue'; 
    } 
} 
?> 

Và mẫu của bạn:

<p><?php echo $this->something;?></p> 

Theo tôi mô hình này cho phép bạn nhiều sự linh hoạt với chế độ xem.

Các vấn đề liên quan