Log message #4263625

# At Username Text
# May 19th 2021, 14:14 ndm no problem
# May 19th 2021, 14:13 neon1024 Signs are good, thanks again @ndm really appreciate the help and guidance with all this new Cake 4 stuff :thumbsup:
# May 19th 2021, 14:03 neon1024 I’ll try a middleware and see how I get on
# May 19th 2021, 14:03 neon1024 Attaching the behaviour using Model.initialize inside the Application.php works great, but again, I have no session there
# May 19th 2021, 14:02 ndm Well, that sounds all very theoretical to me right now, not sure what depends on what and when and.... :upside_down_face:
# May 19th 2021, 14:02 neon1024 Then, post Authorize, four tables stopped being filtered, and you nailed it. They’re all part of the auth finder :)
# May 19th 2021, 14:02 neon1024 Hence the global bind using Model.initialize :)
# May 19th 2021, 14:01 neon1024 Then the behaviour just amends the queries
# May 19th 2021, 14:01 neon1024 As if the user has the multi organisation permission, they can change to another organisation and I’ll update the session to track the data they can see
# May 19th 2021, 14:00 neon1024 I write the organisation to the session on login
# May 19th 2021, 13:59 ndm All events will bubble to the global event manager instance.
# May 19th 2021, 13:59 ndm Oh wait, you'd need to put it before authentication... but I guess you don't need to access to the identity for this?
# May 19th 2021, 13:58 neon1024 Although I am using the static EventManager::instance so should be global right?
# May 19th 2021, 13:58 neon1024 I’ll give it a go :thumbsup:
# May 19th 2021, 13:58 neon1024 Can the middleware observe a Model.initialize? :thinking_face:
# May 19th 2021, 13:57 ndm You might want to consider a custom middleware, you have access to the authentication result and the request object, thus the session.
# May 19th 2021, 13:56 neon1024 Now the Auth middleware is creating the instances without even calling the controller
# May 19th 2021, 13:56 neon1024 Binding on the Model.initialize worked great, as I had the session in the AppController, so could bind the behaviour and give it the config it needed
# May 19th 2021, 13:56 neon1024 This all stems from the fact the behaviour, which appends to the query, takes an organisation id from the session
# May 19th 2021, 13:55 neon1024 Or if I should re-bind the Behaivour to the existing instance in the 4 tables used in the Auth
# May 19th 2021, 13:55 neon1024 Now I’m wondering how I can either clear those instances after the Auth checks, so the AppController can pickup the Model.initialize
# May 19th 2021, 13:54 neon1024 You were right in the execution order, but I do not know how the TableRegistry is persisting instances
# May 19th 2021, 13:52 ndm Behaviors are not singleton-ish like tables, if that is what you are referring to, a new behavior instance is created for each table instance.
# May 19th 2021, 13:47 neon1024 `$table->behaviors()->get('FilterByOrganisation')->setConfig('organisation', $organisation->toArray());`
# May 19th 2021, 13:47 neon1024 I assumed i could update a behaviour on an instance in the registry, but doesn’t seem to work
# May 19th 2021, 13:46 neon1024 Is it more efficient to unload and reload a behaviour or flush the alias from the table registry?
# May 19th 2021, 13:32 me1367 Don't save it to a database like that. Instead, just grab the latest conversions and cache them for a while. Doing is while you save something (eg. a product) will likely cause inaccurate conversions in a market that always shifts. It could be that 1USD == 1EUR today. But maybe, tomorrow, 1USD == 1,05EUR (and that 5 cents does add up the higher the prices go).
# May 19th 2021, 13:24 khalil Yes i understand, but i need it in the table class at least, cause i need to modify the price before saving it, the main currency in the db is USD, everything else is basically converted
# May 19th 2021, 13:23 khalil :rolling_on_the_floor_laughing::rolling_on_the_floor_laughing::rolling_on_the_floor_laughing: it was a stupid question haha
# May 19th 2021, 13:12 me1367 Correct. You can just add a little method to the utility class that checks for a cached version and if not, pulls the latest one from online (just use the built-in cache expiry for checking when to update). Though, I'd use a cron + command for that instead... Doing it "on-demand" is gonna kill TTFB for the poor bloke that first hits the expired cache :anguished:
# May 19th 2021, 13:08 me1367 Yes, it's just basic OOP :P I wouldn't use it in table and entity classes though. Primarily controllers and such when it'll actually be needed. Don't bloat your tables and entities.
# May 19th 2021, 12:03 khalil Thanks
# May 19th 2021, 12:03 khalil I can!
# May 19th 2021, 12:00 khalil But can i access this in Table and Entity classes?
# May 19th 2021, 11:59 khalil Thank you so much!!
# May 19th 2021, 11:07 neon1024 Especially as currency conversion rates change regularly, the class would probably have some feature to keep those rates updated
# May 19th 2021, 10:59 slackebot hierarchy.
# May 19th 2021, 10:59 slackebot // ... Do your thing here } }``` Then just call it where needed like this: ```namespace MyApp\Controller; use MyApp\Controller\AppController; use MyApp\Utility\CurrencyConverter; class WhateverController extends AppController { public function myAction() { $converter = new CurrencyConverter(); $converted = $converter->convert(12.99); } }``` The class can be called basically anywhere outside the regular CakePHP
# May 19th 2021, 10:59 me1367 I wouldn't do that in the bootstrap.php because it indeed, can get messy real quick. Instead, I'd create a utility class for that and call that. Something like this: ```namespace MyApp\Utility; use Cake\Routing\Router; class CurrencyConverter { private $user = null; __construct() { // Get the authenticated user $this->user = Router::getRequest()->getSession()->read('Auth.User'); } convert(int $amount) {
# May 19th 2021, 10:55 ndm Instinctively I'd say no, as it sounds like you're introducing lots of global state and hard dependencies.
# May 19th 2021, 10:50 slackebot site to run (it handles currency conversion based on each logged in or not logged in user) - so I thought bootstrap can be a good place for that, but I'm not sure if it's ok in terms of best practices