CakePHP models don’t allow you to access the session object. It is argued that this isn’t the MVC way. I tend to agree. Your controller should really pass any needed session data to the model…somehow.
My use case is that my model needs to validate that when a new user is created, it is given a “group” with equal or lesser privileges than the creator’s group.
Whilst they wouldn’t be able to use the create user form to do this (as the form only lists groups they can assign), we still need to guard against it on the server as it would be trivial to submit a specially crafted POST request with a group ID of a group with higher privileges.
My model needed to access the logged in user’s group ID from the Auth component (which stores its data in the session). So that when my model data was validated, I could check for a valid group ID, based on the group ID of the current user.
I knew I needed to make use of custom validation methods, but how could I get hold of the current user’s group ID? The Auth component isn’t available in the Model, so, what could I do?
Luckily, CakePHP’s AppModel defines a function called “validates”. Which allows you to check whether a model’s data is valid, but crucially it allows you to pass custom options to be made available in the “beforeValidate” callback.
So instead of simply saving my model data to the database, I call this function, passing my current user’s group ID and THEN call save (passing it a parameter to tell it not to bother validating the data again).
In my model, I overrode the “beforeValidate” callback function, which defines (on the fly) a new validation rule: a custom validation method, that takes the current user’s group ID as a parameter. My custom validation method can then check the model data against the current user’s group ID to see if it is valid. WIN.
Below I’ve included some example code to illustrate how this works. In this example I pass the whole Session object to the custom validation function. Which is slightly overkill. I think you should really just pass the data you need. Create a model that looks something like:
class MyModel extends AppModel {
var $validate = array(
// Your usual validation rules for all fields
);
function beforeValidate($options) {
if(!empty($options) && isset($options['Session'])) {
$this->validate['fieldName'] = array(
'ruleName' = array(
'rule' => array('validationFunction', $options['Session'])
)
// + your default validation rule(s) for this field
);
} else {
// Either...
unset($this->validate['fieldName']);
// If you have no normal rules for this field
// Or...
//$this->validate['fieldName'] = array(
// Your default validation rule(s) for this field
//);
}
}
function validationFunction($check, $session) {
// Do your checks with session data
return true; // or false
}
}
You use this in your controller like so:
class MyController extends AppController {
var $uses = array('MyModel');
var $components = array('Session');
function action() {
if(!empty($this->data)) {
$this->MyModel->create($this->data['MyModel']);
// Validate, passing custom options to be made available in the beforeValidate callback
if($this->MyModel->validates(array('Session' => $this->Session)) === true) {
// Save, without validation
$this->MyModel->save(null, false);
}
}
}
}
Treasures of Aztec opened the day with an accelerated session and an early bonus.
the group is more analytical and less emotional.
Solo focus on Wild Wild Riches works only when the rhythm allows it.
Best result of the off-peak hours came from rhythm reading, not impulsive bet hikes.
Vale a pena comprar bônus no Fortune Gods ou espera natural compensa mais?
Semana bombando no Lucky Neko.
O grupo do telegram fixou o tópico de regras de banca. Finalmente.
A streamer com 80 viewers parou de jogar Three Monkeys depois do patch do Q1. Voltou semana passada. Outro jogo agora, ele diz.
Mahjong Ways acordou.
Galera, Fortune Dragon tá imperdível depois do almoço. Já fiz minha forra diária.
Achei que ia dar ruim, de repente a tela trava e vem o Forra Monstra. R$ 8.000 fácil!
Tava quase zerando a banca, aí o Dragon Hatch me solta um Multiplicador 100x. Subiu pra um carro zero!
Treasures of Aztec tá distribuindo Max Win ontem à noite. Peguei 30k no PIX e já parei de jogar. Pulei da cadeira!
Plataforma pagando liso. Saquei o triplo do depósito do Fortune Dragon em 2 minutos via PIX.
Coisa linda. O Caishen Wins não para de soltar carta boa. O mercado premia a consistência.
Hoje o Roleta tava uma mãe. Forrei sem passar calor. Sem ganância o resultado vem.
Quem diria, entrei com pouco e peguei a Tela Forrada no Fortune Tiger. lucro de 5 meses direto pra conta.
Piggy Gold tá distribuindo Multiplicador 100x hoje de manhã. Peguei um carro zero e já parei de jogar. O coração quase parou.
Não existe milagre, mas o Buffalo Win facilitou muito na virada do dia. A disciplina é o segredo do sucesso.