2016-01-31 34 views
8

Tôi đang viết lại một ứng dụng được viết trước đây trong khuôn khổ CodeIgniter, khách hàng của tôi muốn có một ứng dụng độc lập và một mã php thuần túy. Dù sao không cho tôi biết không phải để phát minh lại bánh xe vì tôi đã biết rằng khách hàng của tôi sai. Chúng tôi gặp vấn đề.
Tôi đang tìm một lớp Tuyến đường đơn giản cho phép tôi gọi bất kỳ tệp nào từ bất kỳ vị trí nào. Tôi đã tìm thấy lớp đơn giản và mạnh mẽ này, this is the repository.
Tôi đã triển khai nó trong dự án của mình, sao chép tệp route.php bên trong vị trí chỉ mục và thay đổi .htaccess của mình như tài liệu nói. Thay vì tất cả, đây là cấu trúc của dự án của tôi:Lớp tuyến đường không hoạt động đúng cách

/ PUBLIC_HTML 
/application 
     /controllers 
       /backend.php 
       /user.php 
     /helpers 
     /models 
     /views 
       /backend 
        /backend.php 
        /calendar.php 
       /user 
        /users.php 
        /panel.php 
/assets 
     /files used by frontend... 
/system 
     /configuration 
     /constant 
/.htaccess 
/index.php 
/route.php 

khi applicationi được bắt đầu từ index.php tập tin cấu hình được bao gồm cho thiết lập kết nối với cơ sở dữ liệu. Trong cùng một tệp configuration tôi đã nhập route.php. Bây giờ trang index.php của tôi rất đơn giản, như thế này:

// Check if the session is set 

if(isset($_SESSION['user_info']['id_roles'])) 
{ 
    switch($_SESSION['user_info']['id_roles']) 
    { 
     case 1:   //Admin 
      $route->add('/application/controllers/backend', 'index'); 
      $route->submit(); 
      break; 
     case 2:   //Provider 
      $route->add('/application/controllers/backend'); 
      $route->submit(); 
      break; 
     case 3:   //Customer 
      $route->add('/application/controllers/appointments'); 
      $route->submit(); 
      break; 
    } 
} 
else 
{ 
    // Session isn't set, so I redirect user to login page 

    header('Location: application/views/user/login.php'); 
    exit; // stop 
} 

vì vậy nếu session được thiết lập tôi chuyển hướng kiểu người dùng đến đúng vị trí, chống lại, nếu không được thiết lập tôi hiển thị trang đăng nhập. Trang login chỉ đơn giản là valorize biến phiên, nếu phản hồi thành công thì người dùng sẽ được chuyển hướng trở lại trang chỉ mục.
Vấn đề bây giờ là, ví dụ như khi admin đang đăng nhập (do đó case 1), lớp route không bình ổn các $uri, một ví dụ bit:

public function submit() 
{ 
    $uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/'; 
    $uri = trim($uri, $this->_trim); 

    $replacementValues = array(); 

    // Iterate on the list of URI 

    foreach($this->_listUri as $listKey => $listUri) 
    { 
     // Looking for a match.. 

     if(preg_match("#^$listUri$#", $uri)) 
     { 
      // Replace the values 

      $realUri = explode('/', $uri); 
      $fakeUri = explode('/', $listUri); 

      // Get value with .+ with real URI value 

      foreach($fakeUri as $key => $value) 
      { 
       if ($value == '.+') 
       { 
        $replacementValues[] = $realUri[$key]; 
       } 
      } 

      // Pass array arguments.. 

      call_user_func_array($this->_listCall[$listKey], $replacementValues); 
     } 
    } 
} 

check the full class here.

biến số $uri phải được xác định giá trị với số uri hiện tại của máy chủ nhưng tôi đã thử với var_dump và tôi nhận được giá trị trống. Sau đó, điều kiện đối sánh không bao giờ được gọi và tệp chính xác không được hiển thị. Tôi không biết tại sao, tôi chỉ muốn hiểu tại sao nó không hoạt động, tôi có thể làm điều gì đó sai, ai đó có thể giúp tôi hiểu?
Hoàn thành ví dụ về chuyển hướng quản trị viên, tôi muốn chỉ hiển thị những gì được chứa trong số backend.php, sẽ được tải từ số route.

<?php 

    session_start(); 

    class Backend 
    { 
    // Construct of class 

    public function __construct() 
    { 

    } 

    // Display the main backend page 

    public function index($appointment_hash = '') 
    { 
     $_SESSION['user_info']['hash'] = $appointment_hash; 
     $_SESSION['user_info']['dest_url'] = SystemConfiguration::$base_url . "backend"; 
     // some content.. 
    } 

    ... 

Vậy làm thế nào bạn có thể thấy, tôi chỉ muốn gọi index chức năng của bộ điều khiển backend khi tôi gọi ->add() cho thêm url của bộ điều khiển để gọi, và ->submit() để thực hiện các hoạt động.
Tôi đang làm gì sai?

CẬP NHẬT - Router yêu cầu nhiệm vụ

Trước tiên tôi cập nhật các đống ứng dụng của tôi. Tôi nghĩ rằng vào thời điểm này cách tốt nhất là hỏi ý kiến ​​chuyên môn của bạn trên đó OpenSource Router cho phép tôi để thực hiện nhiệm vụ này:

1. khiển nhập

nhập tất cả các bộ điều khiển được chứa trong thư mục của tôi gọi controllers.Một khi bạn đã nhập khẩu, tôi sẽ chỉ gọi cho thể hiện của bộ định tuyến, và gọi một hàm cụ thể của bộ điều khiển được nạp. Ví dụ:

$router->backend->index(); 

nơi index(); Nó đại diện cho chức năng của bộ điều khiển được gọi là backend. Việc này phải được thực hiện trong toàn bộ đơn đăng ký của tôi. Ngoài ra, tôi cũng sẽ đảm bảo rằng chúng tôi có thể hiển thị chức năng này thông qua URL, cụ thể là nếu tôi chèn url này:

localhost/application/controllers/backend/index 

Tôi có thể gọi cùng chức năng chỉ tham chiếu url.

2. Các yêu cầu ajax Delivery My Router phải có khả năng chạy các yêu cầu ajax từ javascript, đặc biệt là nếu tôi sử dụng mã này:

$('#login-form').submit(function(event) 
    { 

     var postUrl = GlobalVariables.baseUrl + 'user/ajax_check_login'; 
     var postData = 
     { 
      'username': $('#username').val(), 
      'password': $('#password').val() 
     }; 

     $('.alert').addClass('hidden'); 

     $.post(postUrl, postData, function(response) 
     { 

Tôi muốn gọi hàm dùng ajax_check_login. chứa trong bộ điều khiển user, hãy tưởng tượng GlobalVariables.baseUrl, điều gì là ... Làm thế nào chúng ta có thể nghĩ là url của ứng dụng cơ bản có thể thay đổi rõ ràng. Lưu ý rằng chức năng Bộ điều khiển của tôi trả về định dạng json.

3. Tải xem

trong ứng dụng của tôi ở đó là quan điểm, mà được lưu trong .php, nhưng chứa tập tin html, một ví dụ về quan điểm (trước đây viết bằng CodeIgniter) pul bạn tìm here. Tôi muốn có thể gọi một chế độ xem và hiển thị đánh dấu html người dùng mới. Tôi cũng cần phải gọi quan điểm cũng nữa tại cửa ngay lập tức cùng, ví dụ vào những thời điểm tôi chia cơ thể thành:

header, body, footer 

Để đơn giản hóa sự hiểu biết về những gì $this đề cập đến trong một lần xem, vì một cái nhìn là "nạp" bởi một phương thức điều khiển, khung nhìn vẫn chạy trong cùng phạm vi với phương thức đó, nghĩa là $this có thể có ngữ cảnh khác nhau tùy thuộc vào lớp nào đã nạp nó.

Ví dụ:

class Controller1 extends CI_Controller {} 

Trong bất kỳ tập tin view nạp trong bộ điều khiển ví dụ này, $this đề cập cụ thể đến lớp Controller1, có thể truy cập vào CI_Controller tài sản công cộng và bảo vệ/phương pháp cũng như (như Loader hoặc các lớp đầu vào, được gán cho các thuộc tính tải và đầu vào của CI_Controller) vì nó mở rộng lớp đó.

Bộ điều khiển vẫn chỉ là các lớp PHP cũ đơn giản. Nếu tôi được làm điều này:

class Controller1 extends CI_Controller { 
    $this->foobar = 'Hello'; 
} 
class Controller2 extends CI_Controller { 
    $this->foobar = 'World'; 
} 

... nếu chúng ta nạp các tập tin xem như nhau trong bất kỳ phương pháp của một trong những bộ điều khiển, sử dụng $this->foobar trong đó tập tin xem sẽ trả về một giá trị khác nhau. Nhưng bây giờ điều này không quan trọng, tôi chỉ muốn rõ ràng nhất có thể. Tôi bắt đầu một số tiền và mất tất cả đại diện của mình, nhưng tôi thực sự muốn được giúp đỡ về điều này và học hỏi.

+1

Tôi không hạnh phúc với kết quả cuối cùng của phiên của chúng tôi. Tôi quyết định có một cái nhìn xung quanh cho một số router sẽ gọi phương thức trên bộ điều khiển trực tiếp. Tôi tìm thấy một cặp vợ chồng: [Routing cho phép bạn tạo đường dẫn url của riêng bạn, dựa trên đường dẫn bạn có thể tải một đóng cửa hoặc một bộ điều khiển] (http://simplemvcframework.com/documentation/v2/routes). Ngoài ra: [PHP Router class - gọi phương thức trên bộ điều khiển] (https://github.com/dannyvankooten/PHP-Router). Tôi hy vọng bạn sẽ thấy chúng hữu ích? –

+0

@Gavriel Có một số điểm mà tôi cần phải làm rõ trên các lớp học của router, tôi hy vọng rằng chúng ta có thể thảo luận với nhau để giúp các thành viên khác của StackOverflow. Tôi đang trò chuyện ngay bây giờ. – Dillinger

+0

Vì khi nào các khung công tác không phải là 'mã php thuần túy'? – Luke

Trả lời

3

Bạn cần xem xét index.php được cung cấp với Bộ định tuyến làm ví dụ.Bạn sẽ thấy làm thế nào để thiết lập các tuyến đường:

  • bạn luôn phải có 2 đối số: 1. uri, 2. Chức năng
  • theo ví dụ hàm có được không phải là tên hàm 'index', nhưng một cơ quan chức năng function(){...}. Có lẽ tham chiếu cũng sẽ hoạt động.
  • IMHO định tuyến sẽ không phụ thuộc vào phiên (mặc dù có thể, nhưng đó không phải là cách thông thường)
  • thay vì $router->backend->index();, tôi sẽ có một khối mã chung ở cuối tệp để bạn không không phải sao chép & dán mã nhiều lần.

Tôi sẽ hiển thị cho bạn phụ trợ theo cách của bạn và sau đó với các cuộc hẹn, bạn có thể làm cho nó chung như thế nào. Vì vậy, bạn nên thực hiện các tuyến đường một cái gì đó của bạn như:

<?php 
session_start(); 
include 'route.php'; 
$phpClass = false; 
$view = false; 
$func = false; 
$route = new Route(); 
if(isset($_SESSION['user_info']) && isset($_SESSION['user_info']['id_roles'])) { 
    $route->add('/application/controllers/backend', function(){ 
    echo 'You are now at backend page, and the role is '; 
    switch($_SESSION['user_info']['id_roles']) { 
     case 1: echo 'Admin'; break; 
     case 2: echo 'Provider'; break; 
     case 3: echo 'Customer'; break; 
    } 
    include 'backend.php'; 
    $backend = new Backend(); 
    $backend->index(/* I don't know what 'hash' could be */); 
    }); 

    // more general case: 
    $route->add('/application/controllers/appointments', function(){ 
    // we only set the global $phpClass variable, and the rest is common, see below 
    global $phpClass, $func; 
    $phpClass = 'Appointements'; 
    $func = 'index'; // default is index, if it wasn't given on the url 
    }); 
    $route->add('/application/controllers/appointments/add', function(){ 
    // we only set the global $phpClass variable, and the rest is common, see below 
    global $phpClass, $func; 
    $phpClass = 'Appointements'; 
    $func = 'add'; 
    }); 
    $route->add('/application/controllers/appointments/delete', function(){ 
    // we only set the global $phpClass variable, and the rest is common, see below 
    global $phpClass, $func; 
    $phpClass = 'Appointements'; 
    $func = 'delete'; 
    }); 
    $route->add('/application/controllers/foo', function(){ 
    global $phpClass; 
    $phpClass = 'Foo'; 
    }); 
    $route->add('/application/controllers/bar', function(){ 
    global $phpClass; 
    $phpClass = 'Bar'; 
    }); 

    $route->add('/application/views/bar', function(){ 
    global $phpClass, $view; 
    $phpClass = 'View'; 
    $func = 'show'; 
    $view = 'bar.php'; 
    }); 

    $route->submit(); 
} else { 
    // Session isn't set, so I redirect user to login page 
    header('Location: /application/views/user/login.php'); 
    exit; // stop 
} 

if ($phpClass === false || $func === false) { 
    die("You have to have both controller and function un the url"); 
} 

// if we got here it means we're in the common case 

// include the necessary controller. If you want you can 
// include all of them at the top of the php and remove this line 
include 'application/controllers/' . strtolower($phpClass) . '.php'; 

$controller = new $phpClass(); 

// this is instead of `$router->backend->index();`: 
$controller->$func(/*$hash*/); 
// I don't know what '$hash' could be, maybe javascript could send it via ajax 

?> 

controllers/view.php:

class View { 
    public function show() { 
     global $view; 
     include 'application/views/' . $view; 
    } 

    // here you'll need to have all the things that any of 
    // your views access as $this->bar : 
    $config = new stdClass(...); 
    $array = array(); 
    function get_lang() {global $lang; return $lang;} 
    //... 
} 

Ví dụ về phản ứng json trong controllers/user.php:

class User { 
    public function logged_in() { 
     $username = isset($_SESSION) && isset($_SESSION['username']) ? $_SESSION['username'] : false; 
     $response = array(
      'success' => $username !== false ? 'OK' : 'ERROR', 
      'username' => $username 
     ); 
     echo json_encode($response); 
    } 
} 
Các vấn đề liên quan