Я написал короткий скрипт, который сканирует application/controllers
и вставляет имена контроллеров и методов в БД. Это часть модуля ACL, который позволяет мне предоставлять разрешения пользователям.
Я получаю методы со следующей функцией -
$classname = ucfirst(substr($filename, 0, strrpos($filename, '.')));
$methods = get_class_methods($classname);
После обработки я получаю следующий массив
Array
(
[0] => Array
(
[controller] => Inbox
[method] => index
)
[1] => Array
(
[controller] => Inbox
[method] => read
)
[2] => Array
(
[controller] => Inbox
[method] => write
)
)
Проблема, с которой я сталкиваюсь, заключается в том, что когда я добавляю новый метод к любому контроллеру, уникальные идентификаторы в БД больше не соответствуют моей другой таблице, где я предоставляю разрешение пользователю на основе этих идентификаторов. Другая проблема заключается в том, что имена некоторых методов не являются самоочевидными, что затрудняет понимание разрешений при их перечислении из БД.
Я думаю, что решение состоит в том, чтобы каким-то образом проанализировать часть контроллера, где имя метода есть, а затем прочитать некоторые дополнительные данные (возможно, из комментариев), поэтому я могу дать уникальные идентификаторы каждому методу, который обеспечит, что разрешения остаются связанными с независимо от структуры контроллеров.
пример
function read(){
//Desc:Reads a message.
//Unique method ID:2
...
}
и вставленный массив будет чем-то вроде
Array
(
[0] => Array
(
[id] => 1
[desc] => nothing to do here
[controller] => Inbox
[method] => index
)
[1] => Array
(
[id] => 2
[desc] => read a message
[controller] => Inbox
[method] => read
)
[2] => Array
(
[id] => 3
[desc] => send a message
[controller] => Inbox
[method] => write
)
)
Почему бы не сделать первичный ключ для таблицы ACL slug, сгенерированный из имени класса и метода, вместо целого?
Таким образом, это не изменит ситуацию, когда вы добавите новые контроллеры/методы.
Очень простой пример таблиц;
действия
-----------------------------------
| id | controller | method|
|---------------------------------|
| inbox_read | Inbox | read |
ACL
-----------------------
|user_id | acl_slug |
|--------|------------|
| 1 | inbox_read |
Пример небольшого кода того, как вы можете создать пул;
foreach ($method_array as $action) {
$slug = strtolower(implode('_', $action));
}