# Segment API

Segments enable you to profile the content displayed to specific users.

To manage segments, use the `SegmentationService`.

## Getting segment information

To load a segment group, use `SegmentationService::loadSegmentGroupByIdentifier()`. Get all segments assigned to the group with `SegmentationService::loadSegmentsAssignedToGroup()`:

```
        $segmentGroup = $this->segmentationService->loadSegmentGroupByIdentifier('custom_group');

        $segments = $this->segmentationService->loadSegmentsAssignedToGroup($segmentGroup);

        foreach ($segments as $segment) {
            $output->writeln('Segment identifier: ' . $segment->getIdentifier() . ', name: ' . $segment->getName());
        }
```

Similarly, you can load a segment by using `SegmentationService::loadSegmentByIdentifier()`:

```
        $segment = $this->segmentationService->loadSegmentByIdentifier('segment_1');
```

## Checking assignment

You can check whether a user is assigned to a segment with `SegmentationService::isUserAssignedToSegment()`:

```
        $output->writeln((
            $this->segmentationService->isUserAssignedToSegment($user, $segment)
            ? 'The user is assigned to the segment.'
            : 'The user is not assigned to the segment.'
        ));
```

## Assigning users

To assign a user to a segment, use `SegmentationService::assignUserToSegment()`:

```
        $this->segmentationService->assignUserToSegment($user, $segment);
```

## Creating segments

Each segment must be assigned to a segment group.

To create a segment group, use `SegmentationService::createSegmentGroup()` and provide it with a `SegmentGroupCreateStruct`:

```
        $segmentGroupCreateStruct = new SegmentGroupCreateStruct([
            'name' => 'Custom Group',
            'identifier' => 'custom_group',
            'createSegments' => [],
        ]);

        $newSegmentGroup = $this->segmentationService->createSegmentGroup($segmentGroupCreateStruct);
```

To add a segment, use `SegmentationService::createSegment()` and provide it with a `SegmentCreateStruct`, which takes an existing group as one of the parameters:

```
        $segmentCreateStruct = new SegmentCreateStruct([
            'name' => 'Segment 1',
            'identifier' => 'segment_1',
            'group' => $newSegmentGroup,
        ]);

        $newSegment = $this->segmentationService->createSegment($segmentCreateStruct);
```

## Updating segments

To update a segment or a segment group, use `SegmentationService::updateSegment()` or `SegmentationService::updateSegmentGroup()` and provide it with `SegmentUpdateStruct` or `SegmentGroupUpdateStruct`.

## Deleting segments

To delete a segment or a segment group, use `SegmentationService::removeSegment()` or `SegmentationService::removeSegmentGroup()`:

```
$this->segmentationService->removeSegmentGroup($group);
```
