Cap a una lliure distribució de converses

M'agradaria poder fer una crítica constructiva als que com planet.communia.org, tenen un espai d'enunciació, de conversa i de confecció de discurs i coneixement. Un dels motius és poder presentar alternatives al paisatge gris que dibuixa la concentració i la capitalització dels vectors per on flueix la informació. Parlaré de infraestructures comunes, i de sils una analogia que crec que és més que encertada quan parlem d'estructures en sistemes d'informació que estan relacionades deficientment amb altres estructures, en les qual s'impedeix l'intercanvi lliure de dades.

Qualsevol xarxa està formada per nodes i enllaços entre ells. Tant si s'eliminen els creadors de continguts(nodes), com la infraestructura i les tecnologies de comunicació (enllaços) la xarxa deixa d'existir. En aquesta entrada no entraré a discutir com s'han de regular o no els enllaços entre creadors de continguts i consumidors partint del conflicte, d'això ja hi ha molt escrit...

Quan crees continguts arriba un cert punt en el qual cal traçar una estratègia per poder generar xarxa i evitar que certes topologies impedeixin manifestar-te per tu mateix i expressar-te amb el màxim d'autonomia i personalitat. Hem escoltat per activa i per passiva que hem d'intentar caminar cap a la distribució lliure de continguts, els gràfics de Paul Baran sobre la distribució i no la descentralització de les xarxes per fer-les resilients són habituals en ponències i estudis. Però per fer-ho, a més a més de generar continguts (esdevenir nodes actius), hem de pensar en la relació i com cuidar l'enllaç entre nosaltres i les nostres converses, més quan la tendència a maltractar-lo està a l'ordre del dia per consecutives reformes de la propietat intelectual.

Analitzant les possibilitats que tenim actualment a l'hora de crear continguts, per tal d'esdevenir nodes actius i productius, podem posar-los en una escala segons el grau de restricció, intermediació, i control (vigilància). Dins d'aquesta divisió si a un cantó hi han els silos, webs que ofereixen publicació de continguts sovint propietat de grans companyies(twitter, facebook, gplus... ), a l'altra hi ha la blogosfera . Segons les característiques proposades per https://indiewebcamp.com/silos, podem contraposar-les:

  • Requeriment de crear una identitat in-situ Vs. Identitat flexible i determinada per l'usuari.
  • Comunicació isolada: únicament en el lloc amb usuaris del lloc Vs. Comunicació amb qualsevol contacte o xarxa.
  • Creació de contingut d'un tipus determinat. Vs. Creació de qualsevol contingut (text, hypertext, imatges, video, àudio).
  • Restricció a l'hora d'indexar el contingut en tota la totalitat Vs. Possibilitat d'indexació
  • Acatar uns termes de servei i ús Vs. Crear els teus propis termes.
  • Obligació a cedir part de l'autoria o llicència a qualsevol contingut creat Vs. Autoria i llicència flexible( tu la decideixes ).
  • Restricció a l'hora d'importar/exportar el teu contingut o continguts sobre els teus continguts ( comentaris,tags... ) Vs. Possibilitat de exportar segons les possiblitats i habilitats tècniques
  • Generació de context temporal transformant converses en rànquing al cap de poc temps (per exemple, si vols utilitzar twitter com a canal de comentaris, et trobaràs que les converses duren una setmana) Vs. Generació de context permanent (limitat a l'existència del blog).
  • Escalabilitat per part de la corporació Vs. Escalabilitat segons habilitats tècniques i framework.

Si bé per exprimir algunes de les característiques es depèn de les habilitats tècniques i de la infraestructura( sovint requereix el pagament d'un hosting ), també pots gaudir de bona part de l'autonomia si obres un blog a un proveïdor com wordpress.com, i el grau d'autonomia segueix sent significatiu respecte a serveis tot-en-un com facebook.

Així, crec que podem acceptar que el sistema més autònom de creació de continguts ara per ara continua sent el blog. Tot i això hi ha alguns components de l'experiència dels usuaris en les quals el blog no ha seguit innovant i en les quals els sils si que ho han fet: Likes, shares, retweet... Accions que han permès nous fluxes de contingut i noves relacions. Malgrat que se'ls pugui criticar que tendeixen a fenòmens d'agregació i que minven la interacció, hem d'admetre que hi ha hagut innovació i que en molts casos han sigut els propis usuaris (sense estratègia prèvia del proveïdor) els que han implementat millores importants, un exemple és la semantització de temes de debat al twitter via hashtag.  Curiosament en espais autònoms com la blogsfera, aquest grau de millora per part dels creadors de continguts, no sol ser freqüent, si més no es visualitza i valoritza molt menys.

Pel que fa a la interacció social dels blogs se situa en 1) els comentaris i 2) les mencions. Els comentaris són el flux de reaccions sobre una entrada de blog( el mur ). Les mencions crec que són una de les peces fonamentals; és l'avís quan algú enllaça una entrada de blog teva, i ara per ara el més estès és fer-ho a través dels pingbacks(obvio el fiasco dels trackbacks, per la seves debilitats contra l'spam ): Quan algú menciona un text meu, ja sigui per reconèixer, per rebatre, o pel que sigui, jo puc acceptar o no la conversa i plasmar-ho publicant que el text ha estat mencionat per tal blog remot a la mateixa entrada de blog meva. És la part social dels blogs que permet la federació de continguts i l'articulació de lliures acords d'igual a igual (Jo com a blogger em manifesto des del meu espai autogestionat i qui em menciona està en la mateixa condició). Situa una conversa en igualtat de condicions. Però sorprenentment, sovint s'obvia aquesta petita joia i fins i tot es desactiva aquesta interacció,  es té com a una tecnologia vella que visualment no s'entén i que no aporta res. Per exemple, als tallers de Radical Community Manager, vaig veure com en la formació sobre eines de creació de contingut per entitats, els pingbacks eren desactivats sense cap explicació. Crec que és un error estratègic, ja que no donar possibilitat de interacció en la conversa i segueix la lògica de crear nous parlaments, on qui parla no escolta a qui l'escolta.

El que si és cert és que és una tecnologia vella,  que ha evolucionat poc  ja que aquesta tecnologia no ha variat gaire des del 2002 . Això esdevé crític perquè en el cas dels blogs l'enllaç entre nodes és suficient però poc eficient i podria complementar-se molt més. I no estic parlant de posar icones de social media ni de campanyes de SEO. Em refereixo a com aprofundir en l'essència del blog, permetre que la xarxa segueixi parlant i que poguem millorar el context i les dades de la conversa. Com deia abans, si no cuidem els enllaços entre nosaltres tots els nodes se'n ressenten. En aquest sentit un nou mecanisme eficient i senzill apareix per solucionar algunes mancances: les webmentions. Aquest protocol intenta fer simple i més estàndard la comunicació a la blogsfera, ja que utilitza protocol estàndar HTTP, enlloc de xmlrpc com els pingbacks . A més proposa la implementació d'accions "socials", categoritzant la menció segons Like, Repost, Reply, accions que tot i que crec que no són suficients, dibuixen un blogging més interactiu i obren la porta a una conversa més enriquida.

Anant més enllà, crec que davant la idiosincràsia i especificitat de cada sil o "xarxa social" restrictiva pel que fa a indexar contingut, és necessari dotar-nos de millores en la federació de continguts i converses, això significaria un valor afegit substancial. I quin millor camí que seguir la via distribuïda que permet el protocol http ? Anant encara més enllà podem apostar per la semantització via RDF, o JSON-LD per fer front a les apis a les que ens han acostumat els grans concentradors de contingut i que sovint són artefactes per la gestió d'una escassetat artificial. Per què la semàntica? perquè quan consulta la menció que m'has fet, hauria de ser fàcil poder descobrir l'autor, el contingut de l'entrada, la data, els comentaris...

Per poder fer això, significaria que és important que els blogs obrin un apartat bàsic explicant quines possibilitat d'interacció s'ofereixen. Un apartat tipus:

  • Aquest blog publica els continguts de manera enriquida a través de protocols RSS a :
  • Aquest blog publica els recursos descrits via RDFa 1.1 en cada node.
  • Aquest blog permet webmentions, pingbacks i comentaris.

Ens encantaria poder articular les converses de manera còmode i per això la idea és poder implementar correctament pingbacks i webmentions.

La manera com funciona és que quan jo publico alguna entrada de blog i algú em referencii el sistema de referències va al lloc on m'han mencionat i fa una cerca del context de la menció. Amb els pingbacks és simplement un extracte del tipus:

... sobre la manera que descriu el mètode hi ha una fòrmula de la ...

Que ens aporta ben poc.

El problema és la manera com es descriuen els recursos: necessitem un context més acurat. Això és per exemple saber l'autor, la data, el blog , les etiquetes, imatges... Però sobretot definir clarament la descripció i el cos de l'article per tal de poder destinar recursos d'scrapping a buscar negretes enlloc de fer front als widgets dels sils i els llibres de cares. El grau de permeabilitat del teu espai web no depèn només del fet que tingui un disseny agradable a la vista i optimitzat per la llegibilitat, requereix enriquir l'enllaç i fer-lo fort, més ara que es tendeix a criminalitzar-lo. Necessitem que cada blog s'entengui amb els altres, de la mateixa manera com un link ens porta a un altre lloc, estem a un pas de saber si el link es clica per dur a terme una acció (és una resposta, és del tipus favorit, t'agrada, vols compartir el contingut, vols citar-lo...).

Si el 2010 la proposta era descrita a http://www.w3.org/2010/02/rdfa/sources/rdfa-primer/alice-example.html , ara sembla que schema.org  porta la veu cantant quan parlem de descripció de recursos, però al marge d'aquest, encara tenim foaf, sioc...  i amb ells ja ens podem entendre. I si no sempre pots crear ontologies específiques a la teva comunitat, estenent-ne alguna d'existent. Pot semblar complicat però per continguts simples com les entrades de blog no hauria de ser-ho, més quan ja tenim exemples com http://www.w3.org/TR/html-rdfa/#bib-XHTML-RDFA. I més quan ja tenim plugins tant de webmentions com de rdf pels serveis de blog (per drupal hi ha una versió a github, a la qual jo mateix intento aportar-hi hores), també serveis de captura de mencions cap als nostres blogs que eviten i trenquen l'encerclament de comuns.

Però hi han més perills. El que resulta paradoxal, és que més que posar valor a la lliure distribució de continguts, la utlització d'artilugis com l'RDF es distorsiona quan entra la paraula SEO, llavors passa de ser una eina útil per la federació, a ser un mecanisme d'indexació i de estatus als cercadors i sovint es relega al màrqueting. Hem de posar en valor les eines i veure-les més enllà de poder fer el passadís a Google per tal d'arreglar l'aparador que tots els blogs hi tenim. Així el SEO és un a més a més, no una finalitat en si, i hem de vigilar a no cedir recursos ni atorgar llicències. Per posar un exemple: Google et posarà una foto teva a l'índex de cerca al costat de la teva entrada de blog però com a contrapartida hauràs de cedir la teva identitat traslladant-la a Google Plus. Hem d'aprofitar els avenços com a comunitat i entre comunitats, no destinar-los únicament a enriquir els intermediaris i atorgar-los així el benefici de ser propietaris de recursos propis. Com sempre pensar el web i els seus estàndards per la distribució, per l'intercanvi entre iguals, no per la centralització.

Així fins ara planet.communia.org tenia incorporat un sistema dual de pingbacks i trackbacks. A partir d'ara incorporem el sistema de webmentions, seguim amb els pingbacks, i cancelem els trackbacks, ja que amb tot el temps que els hem tingut actius només hem rebut  4 de bons (del mateix planet), i uns 2500 de spam. 

La semàntica a drupal per defecte es fa a través de rdfa 1.0 a tots els continguts, alguns microformats i el propi html5 que ens ajuda a definir bé els tipus de continguts. Els mecanismes de interacció quedaran reflectits a l'entrada (un)API del menú de peu de pàgina . A part hem afegit microformats, algunes especificacions de schema.org, i RDFa 1.1. Així els continguts tindran especificacions de foaf, sioc, og, i schema.org. Intentant implementar en la mesura del possible els estàndards.

Comments

Molt interessant el tema, me guarde el post per rellegir-lo i provar alguns plugins en wordpress.

Jo he fet algunes proves amb FoaF i OpenID per l'enregistrament, açò últim sense molt d'èxit. També tinc una guerra oberta amb els pingbacks/trackbacks (no entenc molt bé la diferència entre els dos) en RSS, no aporten molt en xarxes espesses i no se filtrar-los, si estigueren un un feed distint seria molt millor.

Aniré fent proves i les relataré en el blog, espere que continuem investigant.

Un plaer i salut!


In reply to by Litox

El plaer és meu! Pel que tinc entès, el trackback és un avís en un sentit:  Té l'extracte de la menció en l'avís d'aquesta(per tant no té validació intrínsica). Mentre que el pingback és un avís de menció en dos sentits: Ja que l'avís va sense informació extra, i es compta que hi haurà validació quan el mencionat busqui l'enllaç al cos del text que el menciona. Així a nivell de spam s'entén que el pingback serà més segur. 

Sobre separar mencions i comentaris. En drupal, comentaris i mencions són entitats diferents i es poden indexar de manera molt flexible i separada, en wordpress ni idea ... crec que t'hauràs d'endinsar en el codi o posar camps extres als comentaris ( https://wordpress.org/plugins/wp-comment-fields/ ).

A veure què tal els webmentions amb wordpress...


Add new comment

The content of this field is kept private and will not be shown publicly.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.

Semantic linkbacks

This site uses semantic webmentions to interact between sites and build federated conversations.
Twig context array(16)
'items' => array(0)
'information' => Drupal\Core\StringTranslation\TranslatableMarkup(5)
  • contents
  • Available methods (14)
  • protected string -> string(96) "This site uses semantic webmentions to interact between sites and build federate…"
    This site uses semantic webmentions to interact between sites and build federated conversations.
    protected translatedMarkup -> string(96) "This site uses semantic webmentions to interact between sites and build federate…"
    This site uses semantic webmentions to interact between sites and build federated conversations.
    protected options -> array(0)
    protected stringTranslation -> Drupal\Core\StringTranslation\TranslationManager(4)
    • contents
    • Available methods (10)
    • protected translators -> array(1)
      '30' => array(1)
      Drupal\Core\StringTranslation\Translator\CustomStrings(4)
      • contents
      • Available methods (6)
      • protected settings -> Drupal\Core\Site\Settings(2)
        *DEPTH TOO GREAT*
        protected translations -> array(1)
        *DEPTH TOO GREAT*
        protected _serviceIds -> array(0)
        public _serviceId -> string(32) "string_translator.custom_strings"
      • public __construct(Drupal\Core\Site\Settings $settings)
        Constructs a CustomStrings object.
        
        @param \Drupal\Core\Site\Settings $settings
        The settings read only object.
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:31
        public __sleep()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:22
        public __wakeup()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:46
        public getStringTranslation($langcode, $string, $context)
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:33
        public reset()
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:48
        protected getLanguage($langcode)
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:39
      protected sortedTranslators -> array(1)
      Drupal\Core\StringTranslation\Translator\CustomStrings(4)
      • contents
      • Available methods (6)
      • protected settings -> Drupal\Core\Site\Settings(2)
        • contents
        • Available methods (9)
        • Static class properties (1)
        • private storage -> array(9)
          *DEPTH TOO GREAT*
          public _serviceId -> string(8) "settings"
        • public static get($name, $default = NULL) -> mixed
          Returns a setting.
          
          Settings can be set in settings.php in the $settings array and requested
          by this function. Settings should be used over configuration for read-only,
          possibly low bootstrap configuration that is environment specific.
          
          @param string $name
          The name of the setting to return.
          @param mixed $default
          (optional) The default value to use if this setting is not set.
          
          @return mixed
          The value of the setting, the provided default if not set.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:86
          public static getAll() -> array
          Returns all the settings. This is only used for testing purposes.
          
          @return array
          All the settings.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:96
          public static getApcuPrefix($identifier, $root, $site_path = "") -> string
          Generates a prefix for APCu user cache keys.
          
          A standardized prefix is useful to allow visual inspection of an APCu user
          cache. By default, this method will produce a unique prefix per site using
          the hash salt. If the setting 'apcu_ensure_unique_prefix' is set to FALSE
          then if the caller does not provide a $site_path only the Drupal root will
          be used. This allows WebTestBase to use the same prefix ensuring that the
          number of APCu items created during a full test run is kept to a minimum.
          Additionally, if a multi site implementation does not use site specific
          module directories setting apcu_ensure_unique_prefix would allow the sites
          to share APCu cache items.
          
          @param $identifier
          An identifier for the prefix. For example, 'class_loader' or
          'cache_backend'.
          
          @return string
          The prefix for APCu user cache keys.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:172
          public static getHashSalt() -> string
          Gets a salt useful for hardening against SQL injection.
          
          @return string
          A salt based on information in settings.php, not in the database.
          
          @throws \RuntimeException
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:140
          public static getInstance() -> \Drupal\Core\Site\Settings
          Returns the settings instance.
          
          A singleton is used because this class is used before the container is
          available.
          
          @return \Drupal\Core\Site\Settings
          
          @throws \BadMethodCallException
          Thrown when the settings instance has not been initialized yet.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:51
          public static initialize($app_root, $site_path, &$class_loader)
          Bootstraps settings.php and the Settings singleton.
          
          @param string $app_root
          The app root.
          @param string $site_path
          The current site path.
          @param \Composer\Autoload\ClassLoader $class_loader
          The class loader that is used for this request. Passed by reference and
          exposed to the local scope of settings.php, so as to allow it to be
          decorated with Symfony's ApcClassLoader, for example.
          
          @see default.settings.php
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:114
          public __construct(array $settings)
          Constructor.
          
          @param array $settings
          Array with the settings.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:35
          public __sleep()
          Prevents settings from being serialized.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:67
          private __clone()
          Protects creating with clone.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:61
        • private $instance :: Drupal\Core\Site\Settings(2) *RECURSION*
        protected translations -> array(1)
        'ca' => array(0)
        protected _serviceIds -> array(0)
        public _serviceId -> string(32) "string_translator.custom_strings"
      • public __construct(Drupal\Core\Site\Settings $settings)
        Constructs a CustomStrings object.
        
        @param \Drupal\Core\Site\Settings $settings
        The settings read only object.
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:31
        public __sleep()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:22
        public __wakeup()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:46
        public getStringTranslation($langcode, $string, $context)
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:33
        public reset()
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:48
        protected getLanguage($langcode)
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:39
      protected defaultLangcode -> string(2) "ca"
      public _serviceId -> string(18) "string_translation"
    • public __construct(Drupal\Core\Language\LanguageDefault $default_language)
      Constructs a TranslationManager object.
      
      @param \Drupal\Core\Language\LanguageDefault $default_language
      The default language.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:52
      public addTranslator(Drupal\Core\StringTranslation\Translator\TranslatorInterface $translator, $priority = 0) -> $this
      Appends a translation system to the translation chain.
      
      @param \Drupal\Core\StringTranslation\Translator\TranslatorInterface $translator
      The translation interface to be appended to the translation chain.
      @param int $priority
      The priority of the logger being added.
      
      @return $this
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:66
      public formatPlural($count, $singular, $plural, array $args = array(), array $options = array())
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:152
      public getStringTranslation($langcode, $string, $context)
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:92
      public reset()
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:169
      public setDefaultLangcode($langcode)
      Sets the default langcode.
      
      @param string $langcode
      A language code.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:162
      public translate($string, array $args = array(), array $options = array())
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:109
      public translateString(Drupal\Core\StringTranslation\TranslatableMarkup $translated_string)
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:116
      protected doTranslate($string, array $options = array()) -> string
      Translates a string to the current language or to a given language.
      
      @param string $string
      A string containing the English text to translate.
      @param array $options
      An associative array of additional options, with the following elements:
      - 'langcode': The language code to translate to a language other than
      what is used to display the page.
      - 'context': The context the source string belongs to.
      
      @return string
      The translated string.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:134
      protected sortTranslators() -> \Drupal\Core\StringTranslation\Translator\TranslatorInterface[]
      Sorts translators according to priority.
      
      @return \Drupal\Core\StringTranslation\Translator\TranslatorInterface[]
      A sorted array of translator objects.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:79
    protected arguments -> array(0)
  • public __construct($string, array $arguments = array(), array $options = array(), Drupal\Core\StringTranslation\TranslationInterface $string_translation = NULL)
    Constructs a new class instance.
    
    When possible, use the
    \Drupal\Core\StringTranslation\StringTranslationTrait $this->t(). Otherwise
    create a new \Drupal\Core\StringTranslation\TranslatableMarkup object
    directly.
    
    Calling the trait's t() method or instantiating a new TranslatableMarkup
    object serves two purposes:
    - At run-time it translates user-visible text into the appropriate
    language.
    - Static analyzers detect calls to t() and new TranslatableMarkup, and add
    the first argument (the string to be translated) to the database of
    strings that need translation. These strings are expected to be in
    English, so the first argument should always be in English.
    To allow the site to be localized, it is important that all human-readable
    text that will be displayed on the site or sent to a user is made available
    in one of the ways supported by the
    @link https://www.drupal.org/node/322729 Localization API @endlink.
    See the @link https://www.drupal.org/node/322729 Localization API @endlink
    pages for more information, including recommendations on how to break up or
    not break up strings for translation.
    
    @section sec_translating_vars Translating Variables
    $string should always be an English literal string.
    
    $string should never contain a variable, such as:
    @code
    new TranslatableMarkup($text)
    @endcode
    There are several reasons for this:
    - Using a variable for $string that is user input is a security risk.
    - Using a variable for $string that has even guaranteed safe text (for
    example, user interface text provided literally in code), will not be
    picked up by the localization static text processor. (The parameter could
    be a variable if the entire string in $text has been passed into t() or
    new TranslatableMarkup() elsewhere as the first argument, but that
    strategy is not recommended.)
    
    It is especially important never to call new TranslatableMarkup($user_text)
    or t($user_text) where $user_text is some text that a user entered -- doing
    that can lead to cross-site scripting and other security problems. However,
    you can use variable substitution in your string, to put variable text such
    as user names or link URLs into translated text. Variable substitution
    looks like this:
    @code
    new TranslatableMarkup("@name's blog", array('@name' => $account->getDisplayName()));
    @endcode
    Basically, you can put placeholders like @name into your string, and the
    method will substitute the sanitized values at translation time. (See the
    Localization API pages referenced above and the documentation of
    \Drupal\Component\Render\FormattableMarkup::placeholderFormat()
    for details about how to safely and correctly define variables in your
    string.) Translators can then rearrange the string as necessary for the
    language (e.g., in Spanish, it might be "blog de @name").
    
    @param string $string
    A string containing the English text to translate.
    @param array $arguments
    (optional) An associative array of replacements to make after
    translation. Based on the first character of the key, the value is
    escaped and/or themed. See
    \Drupal\Component\Render\FormattableMarkup::placeholderFormat() for
    details.
    @param array $options
    (optional) An associative array of additional options, with the following
    elements:
    - 'langcode' (defaults to the current language): A language code, to
    translate to a language other than what is used to display the page.
    - 'context' (defaults to the empty context): The context the source
    string belongs to.
    @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    (optional) The string translation service.
    
    @throws \InvalidArgumentException
    Exception thrown when $string is not a string.
    
    @see \Drupal\Component\Render\FormattableMarkup::placeholderFormat()
    @see \Drupal\Core\StringTranslation\StringTranslationTrait::t()
    
    @ingroup sanitization
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:137
    public __sleep()
    Magic __sleep() method to avoid serializing the string translator.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:212
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Component/Utility/ToStringTrait.php:13
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:236
    public getArguments() -> mixed[]
    Gets all arguments from this translated string.
    
    @return mixed[]
    The array of arguments.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:187
    public getOption($name) -> mixed
    Gets a specific option from this translated string.
    
    @param string $name
    Option name.
    
    @return mixed
    The value of this option or empty string of option is not set.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:167
    public getOptions() -> mixed[]
    Gets all options from this translated string.
    
    @return mixed[]
    The array of options.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:177
    public getUntranslatedString() -> string
    Gets the untranslated string value stored in this translated string.
    
    @return string
    The string stored in this wrapper.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:154
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Inherited from Drupal\Component\Render\FormattableMarkup
    Defined in .../core/lib/Drupal/Component/Render/FormattableMarkup.php:112
    public render() -> string
    Renders the object as a string.
    
    @return string
    The translated string.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:197
    protected static placeholderEscape($value) -> string
    Escapes a placeholder replacement value if needed.
    
    @param string|\Drupal\Component\Render\MarkupInterface $value
    A placeholder replacement value.
    
    @return string
    The properly escaped replacement value.
    
    Inherited from Drupal\Component\Render\FormattableMarkup
    Defined in .../core/lib/Drupal/Component/Render/FormattableMarkup.php:258
    protected static placeholderFormat($string, array $args) -> string
    Replaces placeholders in a string with values.
    
    @param string $string
    A string containing placeholders. The string itself is expected to be
    safe and correct HTML. Any unsafe content must be in $args and
    inserted via placeholders.
    @param array $args
    An associative array of replacements. Each array key should be the same
    as a placeholder in $string. The corresponding value should be a string
    or an object that implements
    \Drupal\Component\Render\MarkupInterface. The value replaces the
    placeholder in $string. Sanitization and formatting will be done before
    replacement. The type of sanitization and formatting depends on the first
    character of the key:
    - @variable: When the placeholder replacement value is:
    - A string, the replaced value in the returned string will be sanitized
    using \Drupal\Component\Utility\Html::escape().
    - A MarkupInterface object, the replaced value in the returned string
    will not be sanitized.
    - A MarkupInterface object cast to a string, the replaced value in the
    returned string be forcibly sanitized using
    \Drupal\Component\Utility\Html::escape().
    @code
    $this->placeholderFormat('This will force HTML-escaping of the replacement value: @text', ['@text' => (string) $safe_string_interface_object));
    @endcode
    Use this placeholder as the default choice for anything displayed on
    the site, but not within HTML attributes, JavaScript, or CSS. Doing so
    is a security risk.
    - %variable: Use when the replacement value is to be wrapped in <em>
    tags.
    A call like:
    @code
    $string = "%output_text";
    $arguments = ['%output_text' => 'text output here.'];
    $this->placeholderFormat($string, $arguments);
    @endcode
    makes the following HTML code:
    @code
    <em class="placeholder">text output here.</em>
    @endcode
    As with @variable, do not use this within HTML attributes, JavaScript,
    or CSS. Doing so is a security risk.
    - :variable: Return value is escaped with
    \Drupal\Component\Utility\Html::escape() and filtered for dangerous
    protocols using UrlHelper::stripDangerousProtocols(). Use this when
    using the "href" attribute, ensuring the attribute value is always
    wrapped in quotes:
    @code
    // Secure (with quotes):
    $this->placeholderFormat('<a href=":url">@variable</a>', [':url' => $url, '@variable' => $variable]);
    // Insecure (without quotes):
    $this->placeholderFormat('<a href=:url>@variable</a>', [':url' => $url, '@variable' => $variable]);
    @endcode
    When ":variable" comes from arbitrary user input, the result is secure,
    but not guaranteed to be a valid URL (which means the resulting output
    could fail HTML validation). To guarantee a valid URL, use
    Url::fromUri($user_input)->toString() (which either throws an exception
    or returns a well-formed URL) before passing the result into a
    ":variable" placeholder.
    
    @return string
    A formatted HTML string with the placeholders replaced.
    
    @ingroup sanitization
    
    @see \Drupal\Core\StringTranslation\TranslatableMarkup
    @see \Drupal\Core\StringTranslation\PluralTranslatableMarkup
    @see \Drupal\Component\Utility\Html::escape()
    @see \Drupal\Component\Utility\UrlHelper::stripDangerousProtocols()
    @see \Drupal\Core\Url::fromUri()
    
    Inherited from Drupal\Component\Render\FormattableMarkup
    Defined in .../core/lib/Drupal/Component/Render/FormattableMarkup.php:188
    protected _die()
    For test purposes, wrap die() in an overridable method.
    
    Defined in .../core/lib/Drupal/Component/Utility/ToStringTrait.php:31
    protected getStringTranslation() -> \Drupal\Core\StringTranslation\TranslationInterface
    Gets the string translation service.
    
    @return \Drupal\Core\StringTranslation\TranslationInterface
    The string translation service.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:222
'linkbacks' => NULL
'theme_hook_original' => string(26) "semantic_linkbacks_counter"
'attributes' => Drupal\Core\Template\Attribute(1)
  • contents
  • Available methods (17)
  • Iterator contents (0)
  • protected storage -> array(0)
  • public __clone()
    Implements the magic __clone() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:315
    public __construct($attributes = array())
    Constructs a \Drupal\Core\Template\Attribute object.
    
    @param array $attributes
    An associative array of key-value pairs to be converted to attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:80
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:285
    public addClass() -> $this
    Adds classes or merges them on to array of existing CSS classes.
    
    @param string|array ...
    CSS classes to add to the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:170
    public getIterator()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:324
    public hasClass($class) -> bool
    Checks if the class array has the given CSS class.
    
    @param string $class
    The CSS class to check for.
    
    @return bool
    Returns TRUE if the class exists, or FALSE otherwise.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:273
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:341
    public offsetExists($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:158
    public offsetGet($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:89
    public offsetSet($name, $value)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:98
    public offsetUnset($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:151
    public removeAttribute() -> $this
    Removes an attribute from an Attribute object.
    
    @param string|array ...
    Attributes to remove from the attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:219
    public removeClass() -> $this
    Removes argument values from array of existing CSS classes.
    
    @param string|array ...
    CSS classes to remove from the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:244
    public setAttribute($attribute, $value) -> $this
    Sets values for an attribute key.
    
    @param string $attribute
    Name of the attribute.
    @param string|array $value
    Value(s) to set for the given attribute key.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:205
    public storage()
    Returns the whole array.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:331
    public toArray() -> array
    Returns all storage elements as an array.
    
    @return array
    An associative array of attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:303
    protected createAttributeValue($name, $value) -> \Drupal\Core\Template\AttributeValueBase
    Creates the different types of attribute values.
    
    @param string $name
    The attribute name.
    @param mixed $value
    The attribute value.
    
    @return \Drupal\Core\Template\AttributeValueBase
    An AttributeValueBase representation of the attribute's value.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:113
'title_attributes' => Drupal\Core\Template\Attribute(1)
  • contents
  • Available methods (17)
  • Iterator contents (0)
  • protected storage -> array(0)
  • public __clone()
    Implements the magic __clone() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:315
    public __construct($attributes = array())
    Constructs a \Drupal\Core\Template\Attribute object.
    
    @param array $attributes
    An associative array of key-value pairs to be converted to attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:80
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:285
    public addClass() -> $this
    Adds classes or merges them on to array of existing CSS classes.
    
    @param string|array ...
    CSS classes to add to the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:170
    public getIterator()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:324
    public hasClass($class) -> bool
    Checks if the class array has the given CSS class.
    
    @param string $class
    The CSS class to check for.
    
    @return bool
    Returns TRUE if the class exists, or FALSE otherwise.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:273
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:341
    public offsetExists($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:158
    public offsetGet($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:89
    public offsetSet($name, $value)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:98
    public offsetUnset($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:151
    public removeAttribute() -> $this
    Removes an attribute from an Attribute object.
    
    @param string|array ...
    Attributes to remove from the attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:219
    public removeClass() -> $this
    Removes argument values from array of existing CSS classes.
    
    @param string|array ...
    CSS classes to remove from the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:244
    public setAttribute($attribute, $value) -> $this
    Sets values for an attribute key.
    
    @param string $attribute
    Name of the attribute.
    @param string|array $value
    Value(s) to set for the given attribute key.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:205
    public storage()
    Returns the whole array.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:331
    public toArray() -> array
    Returns all storage elements as an array.
    
    @return array
    An associative array of attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:303
    protected createAttributeValue($name, $value) -> \Drupal\Core\Template\AttributeValueBase
    Creates the different types of attribute values.
    
    @param string $name
    The attribute name.
    @param mixed $value
    The attribute value.
    
    @return \Drupal\Core\Template\AttributeValueBase
    An AttributeValueBase representation of the attribute's value.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:113
'content_attributes' => Drupal\Core\Template\Attribute(1)
  • contents
  • Available methods (17)
  • Iterator contents (0)
  • protected storage -> array(0)
  • public __clone()
    Implements the magic __clone() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:315
    public __construct($attributes = array())
    Constructs a \Drupal\Core\Template\Attribute object.
    
    @param array $attributes
    An associative array of key-value pairs to be converted to attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:80
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:285
    public addClass() -> $this
    Adds classes or merges them on to array of existing CSS classes.
    
    @param string|array ...
    CSS classes to add to the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:170
    public getIterator()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:324
    public hasClass($class) -> bool
    Checks if the class array has the given CSS class.
    
    @param string $class
    The CSS class to check for.
    
    @return bool
    Returns TRUE if the class exists, or FALSE otherwise.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:273
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:341
    public offsetExists($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:158
    public offsetGet($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:89
    public offsetSet($name, $value)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:98
    public offsetUnset($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:151
    public removeAttribute() -> $this
    Removes an attribute from an Attribute object.
    
    @param string|array ...
    Attributes to remove from the attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:219
    public removeClass() -> $this
    Removes argument values from array of existing CSS classes.
    
    @param string|array ...
    CSS classes to remove from the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:244
    public setAttribute($attribute, $value) -> $this
    Sets values for an attribute key.
    
    @param string $attribute
    Name of the attribute.
    @param string|array $value
    Value(s) to set for the given attribute key.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:205
    public storage()
    Returns the whole array.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:331
    public toArray() -> array
    Returns all storage elements as an array.
    
    @return array
    An associative array of attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:303
    protected createAttributeValue($name, $value) -> \Drupal\Core\Template\AttributeValueBase
    Creates the different types of attribute values.
    
    @param string $name
    The attribute name.
    @param mixed $value
    The attribute value.
    
    @return \Drupal\Core\Template\AttributeValueBase
    An AttributeValueBase representation of the attribute's value.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:113
'title_prefix' => array(0)
'title_suffix' => array(0)
'db_is_active' => boolTRUE
'is_admin' => boolFALSE
'logged_in' => boolFALSE
'user' => Drupal\Core\Session\AccountProxy(4)
  • contents
  • Available methods (17)
  • Static class properties (2)
  • protected account -> Drupal\Core\Session\AnonymousUserSession(8)
    • contents
    • Available methods (15)
    • Static class properties (2)
    • protected uid -> integer0
      protected roles -> array(1)
      string(9) "anonymous"
      protected access -> NULL
      public name -> string(0) ""
      protected preferred_langcode -> NULL
      protected preferred_admin_langcode -> NULL
      protected mail -> NULL
      protected timezone -> NULL
    • public __construct()
      Constructs a new anonymous user session.
      
      Intentionally don't allow parameters to be passed in like UserSession.
      
      Defined in .../core/lib/Drupal/Core/Session/AnonymousUserSession.php:15
      public getAccountName()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:164
      public getDisplayName()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:171
      public getEmail()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:180
      public getLastAccessedTime()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:194
      public getPreferredAdminLangcode($fallback_to_default = true)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:144
      public getPreferredLangcode($fallback_to_default = true)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:131
      public getRoles($exclude_locked_roles = false)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:92
      public getTimeZone()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:187
      public getUsername()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:157
      public hasPermission($permission)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:105
      public id()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:85
      public isAnonymous()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:124
      public isAuthenticated()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:117
      protected getRoleStorage() -> \Drupal\user\RoleStorageInterface
      Returns the role storage object.
      
      @return \Drupal\user\RoleStorageInterface
      The role storage object.
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:204
    • constant ANONYMOUS_ROLE :: string(9) "anonymous"
      constant AUTHENTICATED_ROLE :: string(13) "authenticated"
    protected id -> integer0
    protected initialAccountId -> NULL
    public _serviceId -> string(12) "current_user"
  • public getAccount()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:58
    public getAccountName()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:133
    public getDisplayName()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:140
    public getEmail()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:147
    public getLastAccessedTime()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:161
    public getPreferredAdminLangcode($fallback_to_default = true)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:119
    public getPreferredLangcode($fallback_to_default = true)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:112
    public getRoles($exclude_locked_roles = false)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:84
    public getTimeZone()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:154
    public getUsername()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:126
    public hasPermission($permission)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:91
    public id()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:77
    public isAnonymous()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:105
    public isAuthenticated()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:98
    public setAccount(Drupal\Core\Session\AccountInterface $account)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:44
    public setInitialAccountId($account_id)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:168
    protected loadUserEntity($account_id) -> \Drupal\Core\Session\AccountInterface|null
    Load a user entity.
    
    The entity manager requires additional initialization code and cache
    clearing after the list of modules is changed. Therefore it is necessary to
    retrieve it as late as possible.
    
    Because of serialization issues it is currently not possible to inject the
    container into the AccountProxy. Thus it is necessary to retrieve the
    entity manager statically.
    
    @see https://www.drupal.org/node/2430447
    
    @param int $account_id
    The id of an account to load.
    
    @return \Drupal\Core\Session\AccountInterface|null
    An account or NULL if none is found.
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:195
  • constant ANONYMOUS_ROLE :: string(9) "anonymous"
    constant AUTHENTICATED_ROLE :: string(13) "authenticated"
'directory' => string(22) "themes/planet_founding"
  • Directory (4.00K)
  • drwxr-x---
'#cache' => array(1)
'contexts' => array(1)
string(16) "user.permissions"
'theme_hook_suggestions' => array(0)