posttype | title | description | icon | github | order |
---|---|---|---|---|---|
doc |
Admin |
Documentation of admin UI and authorization. |
/icons/admin.svg |
2 |
Bazar provides a simple and extendable admin UI that comes with lots of built-in functionality. The UI is built on Bootstrap
, Vue 3
, and Inertia.js
.
After running the php artisan bazar:install
and the php artisan bazar:publish
commands.
To publish only the assets (compiled as well), run the php artisan bazar:publish --tag=bazar-assets
command. This will place all the views, JS, CSS, and other assets that the project uses. At this point, all you need to do is to customize what you want and recompile the assets.
Note, Bazar automatically publishes the assets registered with the
Asset::script()
andAsset::style()
methods. These assets are compiled, so you can use them instantly. To customize them, make sure the package publishes the pre-compiled scripts and styles to the application'sresources
directory.
Also, you may use the --packages
option to update your packages.json
file with the required devDependencies
automatically and the --mix
option to update your webpack.mix.js
file with the proper compiling tasks.
By default, the
app.blade.php
uses the/vendor/bazar/
prefix in the asset URLs.
To ensure Bazar's assets are always up-to-date, you may add a Composer hook inside your project's composer.json
file to automatically publish the latest assets:
"scripts": {
"post-update-cmd": [
"@php artisan bazar:publish"
]
}
Bazar provides a simple asset manager out of the box. You may register your custom scripts, styles and icons using the Bazar\Support\Facades\Asset
facade.
Important: only the compiled assets should be registered with the
Asset
facade. The raw/pre-compiled assets should be publishable using the app's/package's service provider.
use Bazar\Support\Facades\Asset;
// Register a script
Asset::script('bazar-package', __DIR__.'/path/to/compiled.js');
// Register a style
Asset::style('bazar-package', __DIR__.'/path/to/compiled.css');
// Register an icon
Asset::icon('bazar-package', 'bazar-package::path.to.blade');
Note, the icons must be simple SVG files wrapped into a blade template. Also, make sure that the views are loaded from the package.
Bazar uses Inertia on the whole admin surface. This means unlike using traditional blade templates, you can't load these Singe File Components (SFC) from your service provider, only from a registered script.
After you registered a script with the asset manager, by using the proper events, you can bind your custom Inertia pages easily:
import Index from './Pages/Index';
import CustomPlugin from './Plugins/Custom';
document.addEventListener('bazar:booting', (event) => {
// Adding the page to the stack, that Inertia could load
window.Bazar.pages['Addons/Index'] = Index;
// Adding any component, plugin, mixin, directive, etc.
// event.detail is the pre-mounted Vue instance
const app = event.detail;
app.use(CustomPlugin);
});
Bazar provides a very simple menu builder by default. Managing the menu items via the Bazar\Support\Facades\Menu
facade, makes possible to extend the menu items in the Admin UI, without touching any front-end code.
use Bazar\Support\Facades\Menu;
// Registering a resource item with submenus
Menu::resource(URL::to('bazar/users'), __('Users'), [
'icon' => 'customer',
]);
// Regsitering a single item
Menu::register(URL::to('bazar/support'), __('Support'), [
'icon' => 'support',
'group' => __('Tools'),
]);
Bazar is fully translatable. It uses Laravel's JSON translations on both back- and front-end. To translate strings, you have to create a new JSON language file in the resources/lang
directory with the code of the language. For example, the Hungarian translation would be named hu.json
.
{
"Dashboard": "Vezérlőpult",
"Logout": "Kijelentkezés"
}
Note: the front-end will automatically pick up the translated strings and apply them where possible.
By default, Bazar looks for an array of emails in the bazar.admins
config. Of course, you can use a completely different approach to define admin users; it's up to you. But let's take a look at the default approach:
// config/bazar.php
'admins' => [
'admin@example.com',
'admin_2@example.com',
]
Note, different roles are not supported in Bazar (to keep things simple no plans to change this for now). However once you decide to bring it in, you can easily integrate and customize the different layers for the given admins by using policies and overriding view templates.
After the admins are defined, all users with their email addresses in the list will have access to the admin UI. This is controlled by the can:manage-bazar
middleware, which uses the manage-bazar
gate definition.
If you want to use an admin list based on the .env
file, you may do the following:
// .env
BAZAR_ADMINS=admin@example.com,admin_2@example.com
// config/bazar.php
'admins' => explode(',', env('BAZAR_ADMINS', ''))
Please note that the defined admins will receive admin notifications as well; the credentials are not used only for authorization.
As we mentioned before, the authorization process can be customized easily. By default, it checks for the authenticated user's email address; however, you can easily change its logic:
use Illuminate\Support\Facades\Gate;
Gate::define('manage-bazar', function ($user) {
return in_array($user->role, ['editor', 'cashier']);
});
Note, this gate definition is being used to allow/deny global access to the admin UI. To customize the authorization in detail, you may use policies.
Policies provide a centralized place for defining authorization for different actions. By default, Bazar does not offer policies for the models, but you may specify your custom ones. To do so, follow the original documentation and register to the Bazar models.
When a policy is registered to the model, Bazar will automatically apply them in the controller actions.
Bazar comes with a bunch of routes out of the box. The routes can be registered easily, using the Bazar::routes()
method.
use Bazar\Bazar;
Bazar::routes(function ($router) {
//
});
All Bazar routes are web routes. They have the /bazar
URL and the bazar.
name prefixes. Also, the web
, auth
, can:manage-bazar
middleware are automatically added to each Bazar routes.
You may customize the validation rules that Bazar provides out of the box. To do so, you might listen to Bazar's validation events:
use Bazar\Http\Requests\ProductStoreRequest;
use Illuminate\Support\Facades\Event;
Event::listen('bazar.validating:'.ProductStoreRequest::class, function ($validator) {
$validator->addRules([
'slug' => ['required'],
]);
});