Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6605519
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T19:17:36+00:00 2026-05-25T19:17:36+00:00

I have a tree of Zone objects: class Zone { protected Zone $parent; public

  • 0

I have a tree of Zone objects:

class Zone {
    protected Zone $parent;

    public function __construct(Zone $parent) {
        $this->parent = $parent;
    }
}

There are no children nor descendants property in the Zone, because I want to avoid the pain of managing these relationships in the domain model.

Instead, a domain service maintains a closure table in the database, to map a zone to all its descendants, at any level.

Now, I have a User which can be assigned one or more Zones:

class User {
    protected array $zones;

    public function assignZone(Zone $zone) {
        $this->zones[] = $zone;
    }
}

My problem is that, prior to assigning a new Zone to the User, I’d like to check that this Zone is not already assigned, either explicitly or implicitly via one of its descendants.

Therefore I’d like my controller to transiently inject the Service into this method, to perform the necessary checks:

class User {
    protected array $zones;

    public function assignZone(Zone $newZone, ZoneService $zoneService) {
        foreach ($this->zones as $zone) {
            if ($service->zoneHasDescendant($zone, $newZone)) {
                throw new Exception('The user is already assigned this zone');
            }
        }

        $this->zones[] = $zone;
    }
}

Is that a good practice, or if not, what’s the correct alternative?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T19:17:37+00:00Added an answer on May 25, 2026 at 7:17 pm

    There are no children nor descendants property in the Zone, because I
    want to avoid the pain of managing these relationships in the domain
    model.

    Instead, a domain service maintains a closure table in the database,
    to map a zone to all its descendants, at any level.

    I added some emphasis because it seems a bit contradictory. You don’t want the ‘pain’ in domain, yet you manage closure table in domain service. The fact that you need to inject service into entity sometimes indicates that design can be improved.

    It looks like you have a hierarchy of Zones. This seem to be an important part of your domain. Zones have parent and descendants so maybe you should model it accordingly. Pain of managing the relationship is a ‘justified’ pain because you doing it for the sake of model expressiveness. The domain drives the design in this case. So zone itself will have something like:

    zone->hasDescendant($newZone)
    

    And you would not need to inject a service. In fact you would not need a service at all. Because the only reason for this service is maintaining closure table. Which is not a domain concern and is just a persistence issue.

    If for some reasons you still need service it might be better to inject it into Zone class. This way the problem is solved closer to its source.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

No related questions found

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.