Menu Link Attributes is a great Drupal 8 and 9 module that allows you to add attributes to your menu links. For example, you can use it to add a class or target attributes to your menu links. Let's see how you can set these attributes programmatically.
First, let's add a menu link programmatically to the main menu:
use Drupal\menu_link_content\Entity\MenuLinkContent;
$menu_link = MenuLinkContent::create([
'title' => 'New menu item',
'link' => ['uri' => 'entity:node/1'],
'menu_name' => 'main',
]);
$menu_link->save();
Now that we have a menu link, let's add a class to the menu item:
$menu_link->link->first()->options = [
'attributes' => [
'class' => 'some-class',
],
];
$menu_link->save();
In the same way, you can set the target attribute for the menu item:
$menu_link->link->first()->options = [
'attributes' => [
'target' => '_self',
],
];
$menu_link->save();
As you can see, the module is using the existing options property to store the attributes. The link__options column of a link field type is a blob, which stores a serialized array of options for the link. You can find more about Link field properties here.
This is how all this looks in the database:
And this is how it looks on the frontend side:
I'm a backend developer so I like talking about changing things programmatically, but you can also set attributes via the user interface. Just edit your menu item and you'll see the ATTRIBUTES fieldset: