Создаём своё Действие для Laravel Voyager

Создаем свою кнопку в админке Вояджер

В этом уроке вы узнаете, как добавить свой действие (action) в админку Voyager, для управления записями.

Если вы еще новичок в Laravel Voyager, то для начала ознакомьтесь с документацией.

Предполагается, что вы уже установили Laravel и Voyager с тестовыми данными и можете войти в административную панель админки.

Админка Voyager

Запускайте проект командой php artisan serve, заходите по адресу http://127.0.0.1:8000/admin и логиньтесь в систему через дефолтную админскую учетку admin@admin.com/password.

Админка Voyager

Ниже показана панель управления после входа в систему и выбора «Posts» из бокового меню или просто перехода по адресу http://127.0.0.1:8000/admin/posts.

Админка Voyager

Мы добавим еще одно действие с именем publish, создав класс действий в app/Actions/PublishAction.php, расширяющий AbstractAction Вояджера.

namespace App\Actions;
use TCG\Voyager\Actions\AbstractAction;
class PublishAction extends AbstractAction
{
    public function getTitle()
    {
        // Название действия, которое отображается в кнопке 
        // в зависимости от текущего состояния
        return $this->data->{'status'}=="PUBLISHED"?'Pending':'Publish';
    }
    public function getIcon()
    {
        // Значок действия, который отображается слева от кнопки 
        // в зависимости от текущего состояния
        return $this->data->{'status'}=="PUBLISHED"?'voyager-x':'voyager-external';
    }
    public function getAttributes()
    {
        // Класс кнопки действия
        return [
            'class' => 'btn btn-sm btn-primary pull-left',
        ];
    }
    public function shouldActionDisplayOnDataType()
    {
        // Показывать или скрыть кнопку действия. Отображается только для модели Posts
        return $this->dataType->slug == 'posts';
    }
    public function getDefaultRoute()
    {
        // URL-адрес для кнопки действия при нажатии кнопки
        return route('posts.publish', array("id"=>$this->data->{$this->data->getKeyName()}));
    }
}

Чтобы активировать вышеуказанное действие, нам нужно добавить новую строку в app/Providers/AppServiceProvider.php в метод boot().

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use TCG\Voyager\Facades\Voyager;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Включить действие для публикации записей
        Voyager::addAction(\App\Actions\PublishAction::class);
    }
}

Далее нам нужно добавить маршрут публикаций в routes/web.php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::group(['prefix' => 'admin'], function () {
    
    Route::get('posts/publish','Voyager\PostController@publish')->name('posts.publish');
    Voyager::routes();
});

Маршрут указывает на новый app/Http/Voyager/PostController.php расширяющий VoyagerBaseController.

namespace App\Http\Controllers\Voyager;
use TCG\Voyager\Http\Controllers\VoyagerBaseController;
use TCG\Voyager\Models\Post;
class PostController extends VoyagerBaseController
{
    public function publish(){
        // Получить запись по ID и переключить статус 
        // с PUBLISHED (Опубликовано) на PENDING (Ожидание) и наоборот.
        $post = Post::where('id', \request("id"))->first();
        $post->status = $post->status=="PENDING"?"PUBLISHED":"PENDING";
        $post->save();
        return redirect(route('voyager.posts.index'));
    }
}

Теперь вы можете публиковать и отменять публикации в админке в разделе Posts прямым действием.

Админка Voyager с кастомным действием

Спасибо за внимание! Весь код выложил на Github.

Автор: Ching Sue Hok
Перевод: Demiurge Ash