Обработка неверных параметров метода (контроллера) в Codeiginiter или другом MVC - PullRequest
0 голосов
/ 18 февраля 2012

Я кодирую в codeigintier, но этот вопрос в равной степени относится к любой среде MVC.

Как абстрагировать логику для определения, является ли параметр для метода контроллера допустимым для нескольких методов, которые принимают одни и те же параметры?

РЕДАКТИРОВАТЬ: Подробнее

Например, в приложении, которое я создаю на данный момент, есть несколько «сайтов», и почти все данные в разных таблицах принадлежат сайту, и пользователь может просматривать только подмножество сайтов. Так что многие мои методы запускаются method($site_id,...), поэтому было бы очень хорошо, если бы у меня была возможность использовать ловушку pre_controller, которая могла бы просматривать параметры для методов и определять, есть ли в параметрах $ site_id, и была ли проверка разрешения.

Проблема в том, что не все методы в этих контроллерах будут иметь параметр $ site_id, поэтому я не могу выполнить проверку автоматически в конструкторе моего расширения CI_Controller

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Для CodeIgniter одним из способов абстрагирования логики является создание суперкласса как такового:

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        //...do stuff...
    }
    //...do stuff...
}


/* End of file MY_Controller.php */
/* Location: ./application/core/MY_Controller.php */

Все ваши контроллеры, для которых вы хотите использовать одну и ту же логику, должны затем расширить MY_Controller вместо CI_Controller

Теперь в вашем MY_Controller вы можете создавать функции для «обработки неверных параметров в нескольких методах».

UPDATE

Параметры вашего контроллера поступают с вашего маршрута. например mydomain.com/mycontroller/myfunction/param1/param2/ будет идти к mycontroller public function myfunction($param1, $param2)

$site_id - это просто имя переменной. Вы не можете сказать, как он назван, и даже если бы вы могли, я сомневаюсь, что это хорошая идея - основывать любую логику на том, как вы называете свои переменные.

Простой способ - просто явно вызвать функцию проверки (хранимую один раз в вашем базовом контроллере, библиотеке или помощнике) в каждой функции контроллера, которая требует этого, что дает вам точный контроль зерна.

UPDATE

Extending the controller would only work if my parameters were the same for each method. I'd like to detect automatically the parameters and perform checks. I suppose a call to a helper might be the best I can do, but Id just like to be able to completely abstract it away from the method. I suppose one option would be to have an array of which controllers and methods have $site_id as their first parameter and have a pre_controller hook to do the checking. But this would mean keeping the array up-to-date which kind of defeats the object of my question which is to make things as DRY as possible!

Как правило, чтобы получить автоматизацию, вы должны гибко сдаться и следовать соглашениям. чтобы не идти по пути «использовать помощника» и идти по пути автоматического обнаружения ... создайте свое собственное соглашение.

в вашем базовом контроллере используйте $ this-> uri-> сегмента (n), чтобы проверить, существует ли определенный шаблон URL, если вы знаете, что параметр site_id поступает и вы можете запустить автоматическую проверку на нем.

0 голосов
/ 18 февраля 2012

Расширить тот же контроллер и выполнить некоторую проверку в методе preDispatch или init.

Или абстрагируйте валидацию в контроллер-помощник и используйте ее в обоих контроллерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...