Client Objects

These are used to store information that needs to be persisted between client requests or between Gadgets. If, for exmaple, a calendar object has to communicate the currently selected date to an event list, the client object could communicate this information. In general follow these guidelines:

  • Keep the number of public members stored in session small, Code only the minimum needed.
  • Keep operation code out of the object, you can create libraries to manipulate the client object
  • Do not render HTML or any other form of output from these components, they should maintain basic datatypes (int, string, … )

The example of this that exists is the LoginClient which is polluted with operational and rendering code. Use the session management code as an example of how to do persistance but please use these objects only to store data.

7.4.3PHP Version144msRequest Duration6MBMemory UsageGET content/{url}Route
    • Booting (13.92ms)
    • Application (130ms)
    • 1 x Application (90.33%)
      130ms
      1 x Booting (9.66%)
      13.92ms
      14 templates were rendered
      • legacy.views.container-view (resources/views/legacy/views/container-view.blade.php)6blade
        Params
        0
        components
        1
        controls
        2
        id
        3
        class
        4
        title
        5
        formRenderService
      • legacy.views.container-view (resources/views/legacy/views/container-view.blade.php)6blade
        Params
        0
        components
        1
        controls
        2
        id
        3
        class
        4
        title
        5
        formRenderService
      • app::layout.gadget (resources/views/layout/gadget.blade.php)2blade
        Params
        0
        contents
        1
        formRenderService
      • layout.columnstyle.one (resources/views/layout/columnstyle/one.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout.columnstyle.componentstack (resources/views/layout/columnstyle/componentstack.blade.php)9blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        stack
        8
        component
      • layout.main (resources/views/layout/main.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout._headers (resources/views/layout/_headers.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout.header (resources/views/layout/header.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout._scripts (resources/views/layout/_scripts.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout.navigation (resources/views/layout/navigation.blade.php)8blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
      • includes.alert.membership (resources/views/includes/alert/membership.blade.php)17blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
        8
        searchurl
        9
        loginurl
        10
        logouturl
        11
        __currentLoopData
        12
        child
        13
        loop
        14
        otherchild
        15
        shouldNotifyUser
        16
        user
      • navigation.menu.static (resources/views/navigation/menu/static.blade.php)15blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
        8
        searchurl
        9
        loginurl
        10
        logouturl
        11
        __currentLoopData
        12
        child
        13
        loop
        14
        otherchild
      • includes.footer (resources/views/includes/footer.blade.php)8blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
      • layout.pagemap (resources/views/layout/pagemap.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      uri
      GET content/{url}
      middleware
      web
      controller
      App\Http\Controllers\Wh2oController@content
      namespace
      App\Http\Controllers
      where
      as
      generated::Os9R4mqMKRF5ktoI
      file
      app/Http/Controllers/Wh2oController.php:34-68
      6 statements were executed, 4 of which were duplicated, 2 unique1.48ms
      • select * from "articles" where ("id" = '-SecurityGadget-explain' or "short_name" = '-SecurityGadget-explain') and "articles"."deleted_at" is null and "articles"."is_final" = 'true' limit 1
        410μs/app/Legacy/Repositories/NewsInfo.php:61wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        • 1. -SecurityGadget-explain
        • 2. true
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:61
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from "articles" where "short_name" = '-SecurityGadget-explain' limit 1
        300μs/app/Legacy/Repositories/NewsInfo.php:64wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:64
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from "articles" where ("id" = '-SecurityGadget-explain' or "short_name" = '-SecurityGadget-explain') and "articles"."deleted_at" is null and "articles"."is_final" = 'true' limit 1
        350μs/app/Legacy/Repositories/NewsInfo.php:61wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        • 1. -SecurityGadget-explain
        • 2. true
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:61
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from "articles" where "short_name" = '-SecurityGadget-explain' limit 1
        210μs/app/Legacy/Repositories/NewsInfo.php:64wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:64
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from security where domain in ('RiverGadget') and area is null;
        111μs/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:476legacy db
        Metadata
        Backtrace
        • 4. /vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:476
        • 6. /app/Legacy/Repositories/InfoADO.php:368
        • 7. /app/Legacy/Repositories/InfoADO.php:391
        • 8. /app/Legacy/Repositories/SecurityInfo.php:188
        • 9. /app/Legacy/Security/BaseSecurity.php:143
      • select * from security where domain in ('Wh2oController') and area is null;
        94μs/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:476legacy db
        Metadata
        Backtrace
        • 4. /vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:476
        • 6. /app/Legacy/Repositories/InfoADO.php:368
        • 7. /app/Legacy/Repositories/InfoADO.php:391
        • 8. /app/Legacy/Repositories/SecurityInfo.php:188
        • 9. /app/Legacy/Security/BaseSecurity.php:143
          _token
          QqL9ZzYXYvRlnJbkzvDRPFx9RvwPvlTVNJCM7YSa
          page
          array:1 [ "count" => 9 ]
          PHPDEBUGBAR_STACK_DATA
          []
          _previous
          array:1 [ "url" => "https://beta.americanwhitewater.org/wiki/lib/exe/js.php?edit=0&write=0" ]
          _flash
          array:2 [ "old" => [] "new" => [] ]
          path_info
          /content/Wiki/developer:client_objects
          status_code
          200
          
          status_text
          OK
          format
          html
          content_type
          text/html; charset=UTF-8
          request_query
          []
          
          request_request
          []
          
          request_headers
          0 of 0
          array:16 [ "cookie" => array:1 [ 0 => "PHPSESSID=idbhh7hpu21cmavqgic6prln06; XSRF-TOKEN=eyJpdiI6IkNydlFmVUN6NVVpa01ST3cxNDVoN3c9PSIsInZhbHVlIjoiY0FCTkUvSjk5eHRaYjYyaUV5U1J0RW5mbldBUkxQNEl2NmxOQnRFNnJWR2tjUnM4QU12Z2NrbFArWEtQMkZkM3pKUmlkTUxTckpKRG5KT001K2t4UmZWNlNEelRWdWJhSjFjSGJwOE1yNTAyb3dWRlNKeVVTNWM3bEJDa25leGsiLCJtYWMiOiIzOTI1MmUyNGY2MTdkOTNhMmU5MjI3OTYwMzEwZGEzZWUwNGQwNDdhNTM4MThlM2M0YzI1Nzk5YWRjMGFiN2M5In0%3D; americanwhitewater_session=GrdOj06mJ5FreO5M8RWYGdU4kE3oQJU3VrFLmHDgPHPSESSID=idbhh7hpu21cmavqgic6prln06; XSRF-TOKEN=eyJpdiI6IkNydlFmVUN6NVVpa01ST3cxNDVoN3c9PSIsInZhbHVlIjoiY0FCTkUvSjk5eHRaYjYyaUV5U1J0RW5mbldBUkxQNEl2NmxOQnRFNnJ" ] "priority" => array:1 [ 0 => "u=0, i" ] "accept-encoding" => array:1 [ 0 => "gzip, deflate, br, zstd" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "host" => array:1 [ 0 => "beta.americanwhitewater.org" ] ]
          request_server
          0 of 0
          array:43 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_COOKIE" => "PHPSESSID=idbhh7hpu21cmavqgic6prln06; XSRF-TOKEN=eyJpdiI6IkNydlFmVUN6NVVpa01ST3cxNDVoN3c9PSIsInZhbHVlIjoiY0FCTkUvSjk5eHRaYjYyaUV5U1J0RW5mbldBUkxQNEl2NmxOQnRFNnJWR2tjUnM4QU12Z2NrbFArWEtQMkZkM3pKUmlkTUxTckpKRG5KT001K2t4UmZWNlNEelRWdWJhSjFjSGJwOE1yNTAyb3dWRlNKeVVTNWM3bEJDa25leGsiLCJtYWMiOiIzOTI1MmUyNGY2MTdkOTNhMmU5MjI3OTYwMzEwZGEzZWUwNGQwNDdhNTM4MThlM2M0YzI1Nzk5YWRjMGFiN2M5In0%3D; americanwhitewater_session=GrdOj06mJ5FreO5M8RWYGdU4kE3oQJU3VrFLmHDgPHPSESSID=idbhh7hpu21cmavqgic6prln06; XSRF-TOKEN=eyJpdiI6IkNydlFmVUN6NVVpa01ST3cxNDVoN3c9PSIsInZhbHVlIjoiY0FCTkUvSjk5eHRaYjYyaUV5U1J0RW5mbldBUkxQNEl2NmxOQnRFNnJ" "HTTP_PRIORITY" => "u=0, i" "HTTP_ACCEPT_ENCODING" => "gzip, deflate, br, zstd" "HTTP_SEC_FETCH_DEST" => "document" "HTTP_SEC_FETCH_USER" => "?1" "HTTP_SEC_FETCH_MODE" => "navigate" "HTTP_SEC_FETCH_SITE" => "none" "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" "HTTP_UPGRADE_INSECURE_REQUESTS" => "1" "HTTP_SEC_CH_UA_PLATFORM" => ""Windows"" "HTTP_SEC_CH_UA_MOBILE" => "?0" "HTTP_SEC_CH_UA" => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" "HTTP_CACHE_CONTROL" => "no-cache" "HTTP_PRAGMA" => "no-cache" "HTTP_HOST" => "beta.americanwhitewater.org" "REDIRECT_STATUS" => "200" "SERVER_NAME" => "beta.americanwhitewater.org" "SERVER_PORT" => "443" "SERVER_ADDR" => "172.31.18.125" "REMOTE_PORT" => "55583" "REMOTE_ADDR" => "3.145.77.42" "SERVER_SOFTWARE" => "nginx/1.18.0" "GATEWAY_INTERFACE" => "CGI/1.1" "HTTPS" => true "REQUEST_SCHEME" => "https" "SERVER_PROTOCOL" => "HTTP/2.0" "DOCUMENT_ROOT" => "/opt/americanwhitewater.org/public" "DOCUMENT_URI" => "/index.php" "REQUEST_URI" => "/content/Wiki/developer:client_objects" "SCRIPT_NAME" => "/index.php" "CONTENT_LENGTH" => "" "CONTENT_TYPE" => "" "REQUEST_METHOD" => "GET" "QUERY_STRING" => "" "PHP_VALUE" => "post_max_size=20M" "SCRIPT_FILENAME" => "/opt/americanwhitewater.org/public/index.php" "FCGI_ROLE" => "RESPONDER" "PHP_SELF" => "/index.php" "REQUEST_TIME_FLOAT" => 1743749355.5931 "REQUEST_TIME" => 1743749355 ]
          request_cookies
          0 of 0
          array:3 [ "PHPSESSID" => null "XSRF-TOKEN" => "hbkNOWzsC8lwo6mhJZouylEIkCyjpC15dwvguPe7" "americanwhitewater_session" => null ]
          response_headers
          0 of 0
          array:5 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Fri, 04 Apr 2025 06:49:15 GMT" ] "set-cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6IlNVeWxJYjBpOTJuNzZ0VWZ4UFU5V2c9PSIsInZhbHVlIjoibktKOE11VlFmSU5ZcDhWcjhXdUNpa1B6VVJVWGVWUHU0NFJSK3pybFNWeUZidHJPTE1WZDVUWVVGQk9UMkhWUk1RSzlRck1oRENmMTJ4RkhnYlFLUitaVS9JUVBSNUs1clpjb0IwVUJGM1RBTTc4K0NKcWhjWDh3UzNwTDhRUkkiLCJtYWMiOiJhMTdkYWNkMzdjMWRkMTljNzdkZWNkM2Q2ZmJhMjcxODE4OWNkMmM5MDc5OWYxYzhjMzc5MzYxZTczYzVkZWZmIn0%3D; expires=Fri, 04-Apr-2025 08:49:15 GMT; Max-Age=7200; path=/XSRF-TOKEN=eyJpdiI6IlNVeWxJYjBpOTJuNzZ0VWZ4UFU5V2c9PSIsInZhbHVlIjoibktKOE11VlFmSU5ZcDhWcjhXdUNpa1B6VVJVWGVWUHU0NFJSK3pybFNWeUZidHJPTE1WZDVUWVVGQk9UMkhWUk1RSzlRc" 1 => "DWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6IjNFaWU2djNTOWNBTXp5eUxCcDdtbEE9PSIsInZhbHVlIjoiUXd2dnJJL2YyKzZPN2V5ajBoeW04eVpHUEIxVzEvUElRTHhFYWNvRWt3MlVBZU5UNWgwYmhZU2Z5QkVBa0ppcSIsIm1hYyI6IjU4ODY3MDI4OGM5ZWE2MzBkODY0Nzk4NWZlOThhYWIzYjdkMGY5MjBhOGNkZjUyNWQ5ZjIxZDQ4YzMxYmFjMDIifQ%3D%3D; expires=Fri, 04-Apr-2025 06:48:15 GMT; Max-Age=0; path=/; httponlyDWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6IjNFaWU2djNTOWNBTXp5eUxCcDdtbEE9PSIsInZhbHVlIjoiUXd2dnJJL2YyKzZPN2V5ajBoeW04eVpHUEIxVzEvUElRTHhFYWNvRWt3MlVBZU5UNWgwY" ] "Set-Cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6IlNVeWxJYjBpOTJuNzZ0VWZ4UFU5V2c9PSIsInZhbHVlIjoibktKOE11VlFmSU5ZcDhWcjhXdUNpa1B6VVJVWGVWUHU0NFJSK3pybFNWeUZidHJPTE1WZDVUWVVGQk9UMkhWUk1RSzlRck1oRENmMTJ4RkhnYlFLUitaVS9JUVBSNUs1clpjb0IwVUJGM1RBTTc4K0NKcWhjWDh3UzNwTDhRUkkiLCJtYWMiOiJhMTdkYWNkMzdjMWRkMTljNzdkZWNkM2Q2ZmJhMjcxODE4OWNkMmM5MDc5OWYxYzhjMzc5MzYxZTczYzVkZWZmIn0%3D; expires=Fri, 04-Apr-2025 08:49:15 GMT; path=/XSRF-TOKEN=eyJpdiI6IlNVeWxJYjBpOTJuNzZ0VWZ4UFU5V2c9PSIsInZhbHVlIjoibktKOE11VlFmSU5ZcDhWcjhXdUNpa1B6VVJVWGVWUHU0NFJSK3pybFNWeUZidHJPTE1WZDVUWVVGQk9UMkhWUk1RSzlRc" 1 => "DWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6IjNFaWU2djNTOWNBTXp5eUxCcDdtbEE9PSIsInZhbHVlIjoiUXd2dnJJL2YyKzZPN2V5ajBoeW04eVpHUEIxVzEvUElRTHhFYWNvRWt3MlVBZU5UNWgwYmhZU2Z5QkVBa0ppcSIsIm1hYyI6IjU4ODY3MDI4OGM5ZWE2MzBkODY0Nzk4NWZlOThhYWIzYjdkMGY5MjBhOGNkZjUyNWQ5ZjIxZDQ4YzMxYmFjMDIifQ%3D%3D; expires=Fri, 04-Apr-2025 06:48:15 GMT; path=/; httponlyDWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6IjNFaWU2djNTOWNBTXp5eUxCcDdtbEE9PSIsInZhbHVlIjoiUXd2dnJJL2YyKzZPN2V5ajBoeW04eVpHUEIxVzEvUElRTHhFYWNvRWt3MlVBZU5UNWgwY" ] ]
          session_attributes
          0 of 0
          array:5 [ "_token" => "QqL9ZzYXYvRlnJbkzvDRPFx9RvwPvlTVNJCM7YSa" "page" => array:1 [ "count" => 9 ] "PHPDEBUGBAR_STACK_DATA" => [] "_previous" => array:1 [ "url" => "https://beta.americanwhitewater.org/wiki/lib/exe/js.php?edit=0&write=0" ] "_flash" => array:2 [ "old" => [] "new" => [] ] ]