Codeiginter нет прямого доступа к функциям - PullRequest
1 голос
/ 30 мая 2011

У меня проблема с прямым доступом к функциям: например, у меня есть такой код:

пользователей контроллера

function index(){
//this is my users index view, user can add,edit,delete cars 
}

function details($id){
//a function where 1 car can be viewed in detail..

function add(){
//function to add car
}

Теперь, если я перейду кадресная строка и тип.localhost / myapp / users / detail он переходит на URL и выдает ошибку, так как $ id равен нулю.Я хочу, чтобы только индекс был доступен напрямую, если бы пользователь вводил в адресной строке.Я не хочу, чтобы пользователи переходили непосредственно к myapp / users / add и т. Д.

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

Функции контроллера CI всегда должны иметь возможность обрабатывать пользовательский ввод (т. Е. Сегменты URL), что означает, что любой может набрать все, что пожелает, и сделать запрос.Ты не можешь это остановить.Рекомендуется либо:

  • Всегда указывать аргументы по умолчанию
  • Использовать класс URI для получения параметров, либо func_get_args()
  • Всегда проверять наличие и целостность аргументов, передаваемых контроллеру, как вы это делаете с любым другим пользовательским вводом

Так как он гораздо более распространен, принят и проще для чтения - просто убедитесь, что всегдаукажите значения по умолчанию и подтвердите их.

Пример с вашим контроллером:

function index() {
    //this is my users index view
    //user can add,edit,delete cars
}

function details($id = NULL) {
    if ( ! $id) {
        // No ID present, maybe redirect without message
        redirect('users');
    }
    $user = $this->user_model->get($id);
    if ( ! $user) {
        // ID present but no user found, redirect with error message
        $this->session->set_flashdata('error_message', 'User not found');
        redirect('users');
    }
    // We found a user, load view here etc.
}

function add() {
    // Check for the presence of a $_POST value
    // You could also use the Form_validation lib here
    if ( ! $this->input->post('add_car')
    {
        $this->session->set_flashdata('error_message', 'Invalid request');
        redirect('users');
    }
    // Try to add the car here and always redirect from here
}

Единственный другой способ - сделать метод частным или использовать именование CI _underscore()как предложено (делая его недоступным из URL).Вы по-прежнему можете вызывать функцию в других методах, если хотите, например:

function index() {
    if ($this->input->post('add_car')
    {
        // Call the private "_add" method 
        $this->_add();
    }
    // Load index view
}

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

0 голосов
/ 30 мая 2011

Добавьте подчеркивание перед именами функций, которые вы хотите скрыть:

function _details($id){
//a function where 1 car can be viewed in detail..
}
function add(){
//function to add car
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...