First, let me say, that I find the sfFormPropel form's interface inconsistent.
There is bind()
, which returns nothing, but triggers validation, save()
which returns the saved object, and bindAndSave()
, which returns boolean, actually the return value of isValid()
. Now, I have a working application, but I don't feel the code is right, and I'm quite new to symfony
, so perhaps I'm missing something.
The object I need to create needs some external properties, that are not presented in the form, are external to the model, and are handled by the application (for example, the userId of the user, that created the entity, an external-generated guid, etc.).
Right now the flow is as follows:
- get values from request and bind them to form
- check if form is valid
- if it's valid, add additional values and bind them to form one more time
- save the form and return the object
The obvious answer would to add application-specific values to the values, retrieved from request, but It does not make sense to bind the application-specific values if the form is not valid, since they can be potentially expensive operations, may create database records, etc. Additionally, it should not be possible to pass those values with the post request, they should come from application only.
Now, I though that I have to let the model do these things, but since the data is external to the model, action still need to pass it to the model. The problem is, if I call $form->getObject()
after bind()
, it still has the old data, and not the data submitted.
What is the correct way to implement this kind of post-processing?
Second bounty is started to award the other valuable answer