Я переписываю приложение, ранее написанное в среде 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
в этом представлении файл вернет другое значение.
Но это пока не важно, я просто хочу быть максимально понятным.
Я начинаю ставку и теряю всех своих представителей, но я действительно хочу получить помощь в этом и научиться.
Вам нужно взглянуть на index.php, предоставляемый с маршрутизатором в качестве примера. Вы увидите, как установить маршруты:
'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);
}
}
Других решений пока нет …