vasadibt/yii2-action-resolver

Extension for Yii Framework 2.0 what extending the controllers and you can use simply the action resolvers.

1.0.0 2023-04-19 13:47 UTC

This package is auto-updated.

Last update: 2024-11-19 17:15:21 UTC


README

Extend Yii2 controller actions with custom resolved classes

Installation

Package is available on Packagist, you can install it using Composer.

composer require vasadibt/yii2-action-resolver "^1.0"

or add to the require section of your composer.json file.

"vasadibt/yii2-action-resolver": "^1.0"

Dependencies

Usage

You need to add ActionResolveTrait trait to your controller. THis will be extending your bindInjectedParams method with a new event trigger. After that you can use easily the behavior:

use vasadibt\actionresolver\ActionResolveTrait;
use vasadibt\actionresolver\ResolvableActionBehavior;

class CashregisterApiController extends \yii\web\Controller
{
    use ActionResolveTrait;
    
    public function behaviors()
    {
        return [
            'resolver' => [
                'class' => ResolvableActionBehavior::class,
                'resolvers' => [
                    // Define a new resolvable
                    [
                        'resolvable' => User::class, // User class need to implement `\vasadibt\actionresolver\ResolvableInterface`
                        // Optional you can filter the fiering action
                        // 'actions' => ['*'],
                        // 'actions' => ['view', 'update', 'delete'],
                    ],
                    
                    // or a simple way
                    User::class,
                    
                    // or you can use callable resolving
                    [
                        'resolvable' => Post::class,
                        'actions' => ['update'],
                        'callable' => function(Request $request, Action $action){
                            $post = static::findOne($request->post('id'));
                            if($post === null){
                                throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
                            }
                            if (!Yii::$app->user->can('updatePost', ['post' => $post])) {
                                throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
                            }
                            return $post;
                        },
                    ],
                ],
            ],
        ];
    }
    
    public function actionView(User $user)
    {
        return $this->render('view', ['user' => $user]);
    }
    
    public function actionUpdate(Request $request, Post $post)
    {
        if($post->load($request->post())){
            $post->save();
            return $this->redirect(['index']);
        }
        return $this->render('update', ['model' => $post]);
    }
    
    public function actionDelete(Post $post)
    {
        $post->delete();
        return $this->redirect(['index']);
       
    }
}
use vasadibt\actionresolver\ResolvableInterface;

class User implements ResolvableInterface
{
    public function resolve($request, $action)
    {
        if($model = static::findOne($request->post('id'))){
            return $model;
        }
        throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
    }
}