Endişeleri Ayırma - nerede (floş) bir MVC yapısında (servicelayer vs kontrolör)

0 Cevap php

Ben Zend framework ve ORM Doctrine2 ile PHP kullanmak bir uygulama var. Benim soru kontrolörü tercihen yatan modeli ve sebat katman hakkında bilmeniz gereken ne kadar ilgilidir. İdeal Ben bu 'şey' kendim olduğunu söyleyebilirim - denetleyici kişiler kalıcı zaman / nasıl hakkında hiçbir şey bilmiyor gerekir. Ancak bu her zaman en iyi çözüm değildir hissediyorum (?).

Ben tasarım kılavuz 'endişeleri ayrılığı' takip etmeye çalıştım. Benim modellerde CRUD işlemleri gerçekleştiren bir servis tabaka oluşturarak yaptık. Aşağıdaki örneğe bakın:

public function testbuildAction()
{        
    // create section
    $sectionService = new \MyAPP\Model\Service\Acl\SectionService();        
    $sectionA       = $sectionService->createSection('SectionA-NAME');

    // create privilege with the above section
    $privilegeService   = new \MyAPP\Model\Service\Acl\PrivilegeService();
    $privilegeA = $privilegeService->createPrivilege(
                            $sectionA, 
                            \MyAPPFrameWork\Model\Acl\Privilege::PERMISSION_EDIT
                        );

    // create a role with the privilege above. A role must have at least one priv.
    $roleService = new \MyAPP\Model\Service\Acl\RoleService();
    $role        = $roleService->createRole('Role-NAME', $privilegeA); 

    // this loads a managed User object (managed by EntityManager)
    $user = $this->_helper->IdentityLoader(); 
    $user->addRole($role); // add the role to this user
    $userService = new \MyAPP\Model\Service\Core\UserService();        
    $userService->updateUser($user); // persist the updates.
}

Eğer Kontrolör kalıcılığı hakkında hiçbir şey bilmiyor görebilirsiniz, ancak bu sonucu elde etmek gibi gerçekleştirmeniz gereken iki devam () ve floş () createXXX () veya updateXXX hizmet katman () yöntemleri her çağrısı içinde. Doğrusu böyle bir şey yapardım:

public function testbuildAction()
{        
    // create section
    $sectionService = new \MyAPP\Model\Service\Acl\SectionService();        
    $sectionA       = $sectionService->createSection('SectionA-NAME');

    // create privilege with the above section
    $privilegeService   = new \MyAPP\Model\Service\Acl\PrivilegeService();
    $privilegeA = $privilegeService->createPrivilege(
                            $sectionA, 
                            \MyAPPFrameWork\Model\Acl\Privilege::PERMISSION_EDIT
                        );

    // create a role with the privilege above. A role must have at least one priv.
    $roleService = new \MyAPP\Model\Service\Acl\RoleService();
    $role        = $roleService->createRole('Role-NAME', $privilegeA); 

    // this loads a managed User object (managed by EntityManager)
    $user = $this->_helper->IdentityLoader(); 
    $user->addRole($role); // add the role to this user

    // persist it all (all service-classes access the same entitymanager).
    $roleService->flush(); // everything is persisted
}

Ama bu yanlış sırayla veritabanına nesneleri kalıcı yok gibi Doctrine2 başarısız olmasına neden olur - ayrıcalıkları bölümlerde önce kalıcı olan (I Doktrin sıralı bir şekilde bu gerçekleştirmek için talimat eğer bilmem?). Ayrıcalıklar henüz kalıcı olmaz bölümleri, yanlış kimliğini alır.

Her neyse, burada büyük bir sorun tüm nesneleri oluşturulmuş ve ilişkiler kurulmuştur kadar kızarma ertelemek denemeyeceğini olup olmadığıdır. (Nesne ve ilişki kurma yapılır ZAMAN bilmenin tek beri) bilgisi ile controller 'kirlenmesine' böylece, dolayısıyla kontrolörü tarafından tetiklenen gerekir - hedefi tüm veritabanına yazma gelmez ONE işlem sahip olma sebat katman?

0 Cevap