# |
May 19th 2021, 16:30 |
neon1024 |
Or is another instance where I need to actually instantiate a bunch of stuff for the test? |
# |
May 19th 2021, 16:29 |
neon1024 |
How do I set an attribute on a ServerRequest instance? From what I can see in the code it’s literally a class property, but my unit test is telling me it’s getting a NULL and expecting an instance of AuthorizationService |
# |
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) { |