Ok. Let's try this.
My app handles products which are made of scalar values (like price, name)
and of details, themselves made of other scalar values (size, weight etc)
in a one->many relationship
So
Step 1 : action showProduct
$product = $documentManager->find('Product', $id);
$this->view->product = $product;
$_SESSION['product'] = $product; // This is saving the product so I don't
have to fetch it again and to guarantee that I will use the same no matter
if the db changes from now until the end of the process
// Displays a form and the product information. The user decides if he
wants to use this product. If he decides to do so calls Step 2
Step 2 : action confirm
$this->view->product = $_SESSION['product'];
$context->save(session_id, $product); // This context serializes the
product object for future use and saves in a persistence medium (db, file,
redis, memcache). in real life this context would save other objects needed
as well
// Display a confirmation page with the details
Step 3: action postback // At some point we will get called with the
session_id saved on step 2.
$id = $_GET['id'];
$product = $context->restore($id);
$myClass->process($product);
class myClass {
public function process(Product $product) {
// inspect the product values and do something like send email,
update inventory etc
}
}
class Detail {
}
class Product {
$id;
$name;
/**
* @var Detail
*/
$details = array();
}
On Sun, May 3, 2015 at 10:20 PM, Marco Pivetta <[email protected]> wrote:
> Hi Mario,
>
> I don't have an overview of what you are doing, or better I didn't
> understand what you are doing it (and why the serialization is required).
>
> Could you make a pseudo-code example (under 30-ish LOC)? Just to
> understand the concept of what you are trying to do.
>
> Marco Pivetta
>
> http://twitter.com/Ocramius
>
> http://ocramius.github.com/
>
> On 4 May 2015 at 03:09, mbneto <[email protected]> wrote:
>
>> Hi Marco,
>>
>> Thank you for your reply.
>>
>> I understand what you are proposing but I have a hard time to try to
>> solve is the duplication of code.
>>
>> In one application that I have to maintain I have to deal, for example,
>> with a process where the user selects a list of Products, retrieved from
>> the DB, and depending on the operation he demands, I have to process right
>> away or wait for an external system to notify me of the result (via
>> postback to a different URL). The user will either see the OK your request
>> has been processed or you request is in our queue and you will be
>> notified...
>>
>> When an external system postbacks to me I have to take this list, stored
>> in the db, process it - feeding the Product entities.
>>
>> In my idea I would have the same method that takes the list of Products,
>> either they came fresh from the DB or unserialized from the initial
>> request. That is what I do using an internal db layer that pretty much
>> does the mysqli query and returns entities using a map from the column name
>> to the property name.
>>
>> But I want to remove this in favor for Doctrine ORM/ODM.
>>
>> In the approach suggested I would define and use Doctrine to retrieve the
>> products from the DB but upon saving for further processing I'd have to
>> create something to store it as the ValueObjects that can be safely
>> serialized/deserialized. And my method to process would have to accept
>> both types of lists (the Products from the DB and the Products Value
>> Objects).
>>
>> I hope there is something that can be done without having to do such.
>>
>> On Sat, Apr 4, 2015 at 10:58 PM, Marco Pivetta <[email protected]>
>> wrote:
>>
>>> Hi Mario
>>>
>>> On 5 April 2015 at 03:51, mbneto <[email protected]> wrote:
>>>
>>>> Hi Marco,
>>>>
>>>> Thank you for the reply. As part of some applications I see the
>>>> following happening:
>>>>
>>>> 1st - Request
>>>> a) fetch data from persistence layer
>>>> b) map them to Objects
>>>> c) use some in the request itself
>>>> d) save some in a session layer
>>>>
>>>> 2nd - Request (part of the same application process - perhaps the
>>>> submit of the form)
>>>> a) restore the session data
>>>> b) update the Objects based on the form data
>>>> c) persist some of the objects back - updating the content
>>>>
>>>> While not all objects would have the Doctrine annotation, some may
>>>> have, even if I use them for read only purposes.
>>>>
>>>> Right now I can do it fine because they are POPO and I map them
>>>> manually when I first do the search. After this I can
>>>> serialize/deserialize at will.
>>>>
>>>> Of course the idea is to use Doctrine to prevent me from having to do
>>>> such mapping manually - and to have all the extra features Doctrine
>>>> provides.
>>>>
>>>> In this scenario what would be me course of action?
>>>>
>>>
>>> This is what most of us ended up with, but it's actually a mess to deal
>>> with, and that with or without ORM.
>>>
>>> The best approach, in my opinion, and especially with multi-step forms,
>>> is to have form-specific DTOs/ValueObjects that you can actually safely
>>> store in session data or in a transient storage location that you can
>>> reference somehow.
>>>
>>> This greatly simplifies the entire process, and is also much safer and
>>> reliable than just making complex forms interact with your persistence
>>> layer (which, honestly, is quite problematic in first place).
>>>
>>> Greets,
>>>
>>> Marco Pivetta
>>>
>>> http://twitter.com/Ocramius
>>>
>>> http://ocramius.github.com/
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "doctrine-user" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/doctrine-user.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "doctrine-user" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/doctrine-user.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "doctrine-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/doctrine-user.
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.