Класс маршрута не работает должным образом

Я переписываю приложение, ранее написанное в среде CodeIgniter, мой клиент хочет иметь независимое приложение и чистый php-код. Во всяком случае, не говори мне не изобретать велосипед потому что я уже знаю, что мой клиент не прав. Мы подошли к проблеме.
Я ищу простой класс Route, который позволяет мне вызывать любые файлы из любого места. Я нашел этот простой и мощный класс, это хранилище.

Я реализовал это в своем проекте, скопируйте route.php файл внутри местоположения индекса и изменить мой .htaccess как говорится в документации Вместо всего, это структура моего проекта:

/ 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

когда приложение запускается из index.php файл конфигурации включен для установления соединения с базой данных. В то же самое configuration файл, который я импортировал route.php, Теперь мой index.php страница очень проста, вот так:

// 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
}

так что если session установлен, я перенаправляю тип пользователя в правильное местоположение, против, если не установлен, я показываю страницу входа. login страница просто оценивает переменную сеанса, если ответ успешен, пользователь снова перенаправляется на страницу индекса.

Проблема в том, что, например, когда администратор вошел (так case 1), route класс не ценит $uriНемного примера:

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);
}
}
}

проверьте полный класс здесь.

$uri переменная должна быть оценена с текущим uri сервера, но я попытался с var_dump, и я получаю пустое значение. Тогда условие соответствия никогда не вызывается, и правильный файл не отображается. Я не знаю почему, я просто хочу понять, почему это не работает, я, вероятно, делаю что-то не так, кто-то может помочь мне понять?
Завершая пример перенаправления администратора, я хочу показать только то, что содержится в backend.php, который должен быть загружен из 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..
}

...

Итак, как вы можете видеть, я просто хочу позвонить index функция backend контроллер, когда я звоню ->add() для добавления URL контроллера, чтобы позвонить, и ->submit() выполнить операцию.

Что я делаю неправильно?

ОБНОВЛЕНИЕ — задача запроса маршрутизатора

Сначала я обновил стек своего приложения.
Я думаю, что на данный момент лучше спросить совета у своего специалиста, какой маршрутизатор OpenSource позволяет мне выполнять эти задачи:

1. Импорт контроллера

Импортируйте все контроллеры, которые содержатся в моей папке с именем controllers, После того, как вы импортировали, я просто вызову экземпляр маршрутизатора и вызову определенную функцию загруженного контроллера. Пример:

$router->backend->index();

где index(); Он представляет функцию контроллера, называемого backend,
Это должно быть сделано во всей моей заявке. Также я хотел бы убедиться, что мы можем вызвать функцию также через URL, в частности, если я вставлю этот URL:

localhost/application/controllers/backend/index

Я могу вызвать ту же функцию, просто ссылаясь на URL.

2. просит ajax

Доставка Мой маршрутизатор должен иметь возможность запускать ajax-запросы из javascript, особенно если я использую этот код:

$('#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)
{

Я хочу вызвать пользовательскую функцию ajax_check_login,
содержится в контроллере user, представить GlobalVariables.baseUrl, что … Как мы можем думать, это URL базового приложения, которое, очевидно, может варьироваться.
Обратите внимание, что моя функция Controller возвращает формат json.

3. Загрузить вид

в моем приложении есть вид, который сохраняется в .php, но содержащий HTML-файл, пример представления (ранее написанного в CodeIgniter) Pul вы найдете Вот.
Я хочу иметь возможность вызвать представление и показать новый пользователь HTML-разметки. Мне также нужно одновременно вызывать больше представлений, например, иногда я делю тело на:

header, body, footer

Чтобы упростить понимание того, что $this ссылается на представление, так как представление «загружается» методом контроллера, представление все еще выполняется в той же области, что и этот метод, что означает $this может иметь различный контекст в зависимости от того, какой класс его загрузил.

Например:

class Controller1 extends CI_Controller {}

В любом файле представления, загруженном в этот пример контроллера, $this относится конкретно к классу Controller1, который может получить доступ CI_Controller открытые и защищенные свойства / методы, а также (например, классы Loader или Input, которые назначены для свойств загрузки и ввода CI_Controller), так как он продолжается этот класс.

Контроллеры — это просто старые классы PHP. Если бы я должен был сделать это:

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

…если мы загружаем один и тот же файл представления в любой метод любого из этих контроллеров, используя $this->foobar в этом представлении файл вернет другое значение.
Но это пока не важно, я просто хочу быть максимально понятным.
Я начинаю ставку и теряю всех своих представителей, но я действительно хочу получить помощь в этом и научиться.

8

Решение

Вам нужно взглянуть на index.php, предоставляемый с маршрутизатором в качестве примера. Вы увидите, как установить маршруты:

  • у вас всегда должно быть 2 аргумента: 1. uri, 2. функция
  • в соответствии с примером функция должна быть не именем функции 'index', но тело функции function(){...}, Может быть, ссылка будет работать так же хорошо.
  • Маршрутизация ИМХО не должна зависеть от сессии (хотя это может быть, но это не обычный способ сделать это)
  • вместо $router->backend->index();У меня будет общий блок кода в конце файла, поэтому вам не нужно копировать&вставьте код много раз.

Я покажу вам с бэкэндом на вашем пути, а затем с назначениями, как вы могли бы сделать это вообще. Таким образом, вы должны сделать ваши маршруты что-то вроде:

<?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

?>

Контроллеры / 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;}
//...
}

Пример ответа json в 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);
}
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]