Packages
This works just like any Laravel package, read their documentation to get started and have a look at the existing packages to see how things are handled. You could use our Package Template as a starting point.
Eventy Filters
Eventy is used to have WordPress style filters which can be used within packages. Have a look at their docs to see how these filters can be used. Examples can also be found within existing Rapidez packages, for example within the AmastyLabelServiceProvider.php
from the Rapidez Amasty Label package.
Filter | Explanation |
---|---|
*.scopes | Add additional global scopes to every model available e.g. product.scopes or category.scopes |
product.casts | Add additional global product casts |
product.children.select | Manipulate the children select query |
product.grouped.select | Manipulate the grouped products select query |
productpage.scopes | Add product scopes only for the product page |
productpage.frontend.attributes | Add product attributes to the frontend |
quote.items.select | Manipulate the quote items select query |
index.product.scopes | Add product scopes to the product query when indexing |
index.product.data | Manipulate the product data before it's getting indexed |
index.product.attributes | Index additional product attributes |
index.product.mapping | Manipulate the index mapping |
routes | (deprecated) Register additional routes (example) |
Every model extends the base model which uses the HasEventyGlobalScopeFilter
trait so it's possible to add scopes to every model, for example: category.scopes
Vue Events
Rapidez emits some custom Vue events you can hook into with $on
. This is used for example within the Rapidez Mollie package, have a look at the mollie.js
file.
Event | Explanation |
---|---|
logged-in | After the user has logged in |
logout | After the user attempts to log out, listen to this to clear any sensitive information about the user |
cart-refreshed | After the cart is refreshed |
checkout-credentials-saved | After the checkout credentials are saved |
checkout-payment-selected | After the payment method has been selected |
before-checkout-payment-saved | Before the payment method is saved (setting checkout.preventOrder to true prevents saving and creating the order altogether) |
checkout-payment-saved | After the payment method is saved |
product-super-attribute-change | After a swatch change, when calling this the product image updates based on the choice |
There is also a doNotGoToTheNextStep
variable on the root Vue instance which can be used to prevent the checkout from going to the next step. That's also used within the Rapidez Mollie package to prevent the checkout from going to the success page because you have to pay first and we'd like to redirect the user to the payment page.
Fallback routing
If your package cannot define its own predefined routes you will want to start using fallback routes to check if it matches a route in e.g. your database.
Rapidez::addFallbackRoute()
Why?
If you use the Route::fallback()
you'll prevent other packages from implementing fallback routes, this is what we've created Rapidez::addFallbackRoute()
for.
You can pass controllers, functions, etc. in the same way like you would with Route::fallback()
however it will check each fallback route until it finds one that does not return void or a 404. You can use this function anywhere so long as it's before the fallback route is triggered, we suggest in your ServiceProvider or Routes file (example).
The first argument to this function will be your Callable or action, the second argument will be the position or priority it has. Lower means higher priority, but it is optional.
TIP
If your check to see if it matches has a high performance impact (for example when it's an API request), consider putting the position higher than 9999
and caching the results.
Examples:
use Rapidez\Core\Facades\Rapidez;
Rapidez::addFallbackRoute(UrlRewriteController::class);
Rapidez::addFallbackRoute('UrlRewriteController@index');
Rapidez::addFallbackRoute([UrlRewriteController::class, 'index'], 5);
Rapidez::addFallbackRoute(function (Request $request) {return redirect('/');}, 5);
Hooking into commands
You can hook into commands by using the events that Rapidez fires. See all available events. For example, if you want to fire a command that runs before the indexer, you can put the following into your AppServiceProvider.php
:
Event::listen(IndexBeforeEvent::class, fn($event) => $event->context->call('another:command'));
Extending Models
All Rapidez models extend the base model. This means it implements Macroable, making it possible to add your own functions without overwriting the model itself!
Adding a single function
Say you want to add a single function to the Product model, then you can add the following in your ServiceProvider boot method:
Product::macro('myTestFunction', function () {
return 'completed!';
});
Adding multiple functions
If you want to add multiple functions, this might get cluttered. In that case, you can use a mixin. All functions defined in there will be made available from your model:
Product::mixin(ProductMixin::class);
Adding Relationships
Your package might add a new model that should be accessible from a Rapidez model. Relationships can be added with:
Product::resolveRelationUsing(
'testRelation',
fn (Product $product) => $product->hasMany(MyTestModel::class, 'product_id');
);
Notifications
If you'd like to show a notification after a redirect from a custom controller you can use:
return redirect('/')->with(['notification' => [
'message' => 'Lorem ipsum dolor sit amet',
'type' => 'success',
]]);
By default, there are 4 types: info
, success
, warning
, and error
. The style differences are defined in the frontend config, everything else is in the Blade template.