# |
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 |
# |
May 19th 2021, 10:50 |
khalil |
Hello support! A quick question related to best practices, is it ok to add a global function that needs to be accessed anywhere in the app (models, views and controllers) in config/bootstrap.php ? and is it ok if this function needs to access the authenticated user? I know I can create helpers and components for, but it gets easily messy since this needs to be accessed literally everywhere, and this function is required for the |
# |
May 19th 2021, 10:45 |
neon1024 |
I put a debug backtrace into the table initialize, and there isn’t a single controller there |
# |
May 19th 2021, 10:41 |
neon1024 |
Thanks for the lead there @ndm I think you’re right. As the Auth is kicking things off from the Middleware, no controllers are called! |
# |
May 19th 2021, 10:41 |
kevin.pfeifer |
i see |
# |
May 19th 2021, 10:41 |
steinkel |
yes |
# |
May 19th 2021, 10:41 |
kevin.pfeifer |
and you load/require that events.php in the bootstrap.php or somewhere else? |
# |
May 19th 2021, 10:40 |
steinkel |
^ I usually define a specific config/events.php and add docblock per event with links to the dispatch line in the code, the reason of this event, any data in/out expected, exceptions raised etc |
# |
May 19th 2021, 10:37 |
kevin.pfeifer |
Talking about Event Listeners: Wouldn’t it suffice to put all the Event Listeners in the `config/bootstrap.php` (or at least put some logic in there to load all of them in there)? In other words: Is there a distinct “recommended place” where to put Event Listeners in general? Or is the answer “it depends” ,:) |
# |
May 19th 2021, 10:24 |
me1367 |
I'll have a look at it, thanks |
# |
May 19th 2021, 10:24 |
ndm |
I think it was this plugin: https://github.com/liqueurdetoile/cakephp-orm-json |
# |
May 19th 2021, 10:23 |
ndm |
Yeah, no, it's going to be a bit work :) |
# |
May 19th 2021, 10:20 |
me1367 |
Yea, just wondered if the ORM was able to do this all for me or not. Would make it a lot easier since now I have a bunch of data in different tables to keep said tables smol (column wise). |
# |
May 19th 2021, 10:19 |
ndm |
I remember seeing a plugin that supports generating all sorts of JSON Path syntax, but IIRC everything that the path syntax can do, can be done with the equivalent function calls too. |
# |
May 19th 2021, 10:17 |
me1367 |
r.i.p |
# |
May 19th 2021, 10:17 |
neon1024 |
Good point, my `auth` finder does use some of these |
# |
May 19th 2021, 10:17 |
ndm |
@me1367 JSON functions can be generated like any other methods via the functions builder... aside from that, there's no specific JSON support. |
# |
May 19th 2021, 10:13 |
ndm |
@neon1024 Maybe whatever models are involved, are being constructed earlier, maybe in your policies, and/or for resolving identities... Put a debug or a breakpoint in their `initialize()` method to figure whether initialization happens before the listener is registered. |
# |
May 19th 2021, 10:11 |
me1367 |
Quick question... Does CakePHP's ORM have support for this feature in MariaDB? https://mariadb.com/database-topics/semi-structured-data/ |
# |
May 19th 2021, 10:11 |
neon1024 |
As we deployed the 4.0.10 upgrade to prod already and it’s fine |
# |
May 19th 2021, 10:10 |
neon1024 |
It worked fine until I added the Authorization plugin |