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);
}
}
}
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.
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? –
@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
Vì khi nào các khung công tác không phải là 'mã php thuần túy'? – Luke