Plugins
Introdução
Um plugin permite que você adicione novos recursos ao seu site, muitos plugins estão disponíveis em nosso Mercado, e você também pode criar um caso não encontre um que corresponda ao seu precisa.
Criando um plugin
Antes de criar um plugin, é recomendado que você leia a documentação do Laravel.
Quando Azuriom é instalado localmente para desenvolvimento de plugin, é altamente recomendável ativar a depuração para simplificar o desenvolvimento. Isso pode ser feito simplesmente editando essas 2 linhas no arquivo
.env
:APP_ENV=local APP_DEBUG=true
Estruturando um plugin
plugins/ <-- Folder containing the different installed plugins
| example/ <-- Id of your plugin
| | plugin.json <-- The main file of your theme containing the various information
| | assets/ <-- The folder containing the assets of your plugin (css, js, images, svg, etc)
| | database/
| | | migrations/ <-- The folder containing your plugin's migrations
| | resources/
| | | lang/ <-- The folder containing the translations of your plugin
| | | views/ <-- The folder containing the views of your plugin
| | routes/ <-- The folder containing the different routes of your plugin
| | src/ <-- The folder containing the sources of your plugin
O arquivo plugin.json
O arquivo plugin.json
é necessário para carregar um plugin e contém as diferentes informações de um plugin:
{
"id": "example",
"name": "Example",
"version": "1.0.0",
"description": "A great plugin.",
"url": "https://azuriom.com",
"authors": [
"Azuriom"
],
"azuriom_api": "1.0.0",
"providers": [
"\\Azuriom\\Plugin\\Example\\Providers\\ExampleServiceProvider",
"\\Azuriom\\ Plugin\\Example\\Providers\\RouteServiceProvider"
]
}
Plugin ID
Cada plugin deve ter um id, que deve ser único e conter apenas números, letras minúsculas e hífens. Recomenda-se usar o nome como base para a criação do id, por exemplo, se o nome for Hello World
, o id pode ser hello-world
. Além disso, o diretório do plugin deve ter o mesmo nome de seu id.
Para criar um plugin você pode usar o seguinte comando que irá gerar automaticamente a pasta do plugin e muitos arquivos por padrão:
php artisan plugin:create <plugin name>
Dependencies
A seção dependencies
permite que você especifique os plugins (usando seu id) que devem ser instalados para usar o plugin. Um ?
após o nome do plugin significa que o plugin é opcional, ou seja, não precisa ser instalado, mas quando for, a versão deve corresponder. Também é possível especificar uma versão do Azuriom usando o valor azuriom
.
Por exemplo, este plugin precisa do Azuriom 0.4.0
ou superior, da versão do plugin Shop 0.1.0
ou superior. Além disso, quando o plugin Vote estiver instalado, ele deve estar na versão 0.2.0
ou superior:
"dependencies": {
"azuriom": "^0.4.0",
"shop": "^0.1.0",
"vote?": "^0.2.0"
}
Routes
As routes permitem que você associe uma URL a uma ação específica.
Eles são armazenados no diretório routes
na raiz do plugin.
Para obter mais informações sobre como as routes funcionam, você pode ler a documentação do Laravel.
Exemplo:
Route::get('/support', 'SupportController@index')->name('index');
Tenha cuidado para não usar rotas com fechamentos, pois elas não são compatíveis com algumas otimizações internas.
Admin routes
Para uma route estar no painel de administração, basta colocá-la no arquivo routes/admin.php
do plugin.
Views
As views são a parte visível de um plugin, são os arquivos de conteúdo HTML do plugin para exibir uma página.
Azuriom usando Laravel, as views podem ser feitas usando o Blade. Se você não domina o Blade, é altamente recomendável ler sua documentação, especialmente porque é bastante curto.
É altamente recomendável NÃO usar a sintaxe do PHP. quando você trabalha com o Blade, porque o Blade não traz o tradicional sem vantagens e apenas desvantagens.
Para exibir uma view, você pode usar view('<plugin id>::<nome da visualização>')
, por exemplo view('support::tickets.index')
para exibir o tickets.index
visualização do plug-in de suporte.
Para definir o layout da página, é necessário que a view estenda a view que contém o layout, você pode usar o layout padrão (ou o layout do tema se houver) com @extends('layouts.app')
, ou crie seu próprio layout e estenda-o.
Em seguida, coloque todo o conteúdo principal na seção content
e o título da página na seção title
.
@extends('layouts.app')
@section('title', 'Page name')
@section('content')
<div class="container content">
<h1>A title</h1>
<p>A text</p>
</div>
@endsection
Assets
Os assets (CSS, JS, images, etc.) estão localizados na pasta assets/
e podem ser usados com a função plugin_asset('<plugin id>', '<asset path>')
.
Os assets podem ser incluídos na página por meio de uma Blade stack em 2 lugares diferentes na página, dependendo do tipo de ativo:
styles
para arquivos CSS (localizados no<head>
)scripts
para arquivos JS (localizados no<head>
, não esqueça de adicionar o atributodefer
ao script, para que não bloqueiem a renderização da página)
Exemplo:
@push('scripts')
<script src="{{ plugin_asset('vote', 'js/vote.js') }}" defer></script>
@endpush
Admin view
Para uma página usar o layout do painel de administração, basta usar o layout admin.layouts.admin
, também é recomendável criar uma pasta admin na pasta resources
e colocar as visualizações do administrador nela.
Controllers
Controllers são a parte central de um plugin, eles estão localizados na pasta src/Controllers
na raiz do plugin, e eles se encarregam de transformar uma requisição na resposta que será enviada de volta ao usuário.
Para mais informações sobre como os controllers funcionam, você pode ler a documentação do Laravel.
Exemplo:
<?php
namespace Azuriom\Plugin\Support\Controllers;
use Azuriom\Http\Controllers\Controller;
use Azuriom\Plugin\Support\Models\Ticket;
class TicketController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// We're picking up all the tickets
$tickets = Ticket::all();
// We're return a view, pass him the tickets...
return view('support::tickets.index', [
'tickets' => $tickets,
]);
}
}
Models
Os models representam uma entrada em uma tabela de banco de dados e permitem que você interaja com o banco de dados.
Você também pode definir em um modelo os diferentes relacionamentos do modelo. Por exemplo, um ticket
pode ter um user
e uma category
, e ter comments
.
Você pode encontrar mais informações sobre models (também chamados de Eloquent no Laravel) na documentação do Laravel.
<?php
namespace Azuriom\Plugin\Support\Models;
use Azuriom\Models\Traits\HasTablePrefix;
use Azuriom\Models\Traits\HasUser;
use Azuriom\Models\User;
use Illuminate\Database\Eloquent\Model;
class Ticket extends Model
{
use HasTablePrefix;
use HasUser;
/**
* The table prefix associated with the model.
*
* @var string
*/
protected $prefix = 'support_';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'subject', 'category_id',
];
/**
* The user key associated with this model.
*
* @var string
*/
protected $userKey = 'author_id';
/**
* Get the user who created this ticket.
*/
public function author()
{
return $this->belongsTo(User::class, 'author_id');
}
/**
* Get the category of this ticket.
*/
public function category()
{
return $this->belongsTo(Category::class);
}
/**
* Get the comments of this ticket.
*/
public function comments()
{
return $this->hasMany(Comment::class);
}
}
Service Provider
Os service provider são o coração de um plugin, eles são chamados no estágio de inicialização. Do Laravel, e permite salvar as diferentes partes de um plugin (views, translations, middlewares, dependencies, etc.).
Os service provider devem ser adicionados à parte providers
do plugins.json
:
{
"providers": [
"\\Azuriom\\Plugin\\Support\\Providers\\SupportServiceProvider"
]
}
Você pode encontrar mais informações sobre os service provider na documentação do Laravel.
<?php
namespace Azuriom\Plugin\Support\Providers;
use Azuriom\Extensions\Plugin\BasePluginServiceProvider;
class SupportServiceProvider extends BasePluginServiceProvider
{
/**
* Register any plugin services.
*
* @return void
*/
public function register()
{
$this->registerMiddlewares();
//
}
/**
* Bootstrap any plugin services.
*
* @return void
*/
public function boot()
{
// $this->registerPolicies();
$this->loadViews();
$this->loadTranslations();
$this->loadMigrations();
$this->registerRouteDescriptions();
$this->registerAdminNavigation();
//
}
}
Dependências
Dentro do seu diretório de plugins, execute seu comando usual composer require.
Em seguida, adicione require_once __DIR__.'/../../vendor/autoload.php';
ao método register do provedor de serviços do plugin.
Certifique-se de que as dependências que você precisa não são fornecidas pela Azuriom para evitar conflitos de versões e erros.
Migration
As migrations permitem criar, modificar ou excluir tabelas no banco de dados. data, eles podem ser encontrados na pasta database/migrations
.
Você pode usar o seguinte comando para gerar automaticamente o arquivo de migration:
php artisan make:migration <migration name> --path plugins/<plugin id>/database/migrations
Você pode encontrar mais informações sobre migrations na documentação do Laravel.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('support_tickets', function (Blueprint $table) {
$table->increments('id');
$table->string('subject');
$table->unsignedInteger('author_id');
$table->unsignedInteger('category_id');
$table->timestamp('closed_at')->nullable();
$table->timestamps();
$table->foreign('author_id')->references('id')->on('users');
$table->foreign('category_id')->references('id')->on('support_categories');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('support_tickets');
}
};
Traduções
As traduções permitem que você traduza um plugin (incrível), elas são encontradas no diretório resources/lang
na raiz de um plugin, na pasta do idioma (en
, fr
, etc…).
Você pode encontrar mais informações sobre traduções na documentação do Laravel.
Para recuperar uma tradução, você pode usar o trans('<plugin id>::<filename>.<message>')
, por exemplo trans('support::messages.tickets.home')
para exibir o tickets.home
, no arquivo messages.php
do plugin de suporte:
<?php
return [
'tickets' => [
'home' => 'Your tickets',
],
];
Barra de navegação
Usuários
Recomenda-se cadastrar as rotas principais do seu plugin para que possam ser facilmente adicionadas na barra de navegação. Para fazer isso, simplesmente chame o método $thiS->registerRouteDescriptions()
no provedor do plugin e retorne as diferentes routes no método routeDescriptions()
com o formato[<route> => <description>]
:
/**
* Bootstrap any plugin services.
*
* @return void
*/
public function boot()
{
// ...
$this->registerRouteDescriptions();
}
/**
* Returns the routes that should be able to be added to the navbar.
*
* @return array
*/
protected function routeDescriptions()
{
return [
'support.tickets.index' => trans('support::messages.title'),
];
}
Admin
Para fazer com que as páginas de administração do seu plugin apareçam na barra de navegação do painel de administração, você pode registrá-las chamando o método $this->registerAdminNavigation()
e retornando as diferentes routes no método adminNavigation()
.
/**
* Bootstrap any plugin services.
*
* @return void
*/
public function boot()
{
// ...
$this->registerAdminNavigation();
}
/**
* Return the admin navigations routes to register in the dashboard.
*
* @return array
*/
protected function adminNavigation()
{
return [
'support' => [
'name' => trans('support::admin.title'), // Translation of the tab name
'icon' => 'bi bi-joystick', // Bootstrap Icons icon
'route' => 'support.admin.tickets.index', // Page's route
'permission' => 'support.tickets', // (Optional) Permission required to view this page
],
];
}