gilsonsouza/lara-polices

Laravel 请求策略

v1.2 2017-01-11 16:14 UTC

This package is auto-updated.

Last update: 2024-09-16 02:01:44 UTC


README

使用composer,执行以下命令自动安装composer.json

composer require gilsonsouza/lara-polices

或手动在您的composer.json文件中安装

{
    "require": {
        "composer require gilsonsouza/lara-polices": "^1.0"
    }
}

2. 中间件

要使用它们,需要在您的app/Http/Kernel.php文件中注册。

 protected $middleware = [
        // other middleware ommited
    	\LaraPolices\Middlewares\PolicesMiddleware::class,
 ];

3. 提供者(可选)

为了配置错误消息和存储策略文件的文件夹,需要在您的项目config目录中添加polices.php文件。为此,在providers部分的末尾添加以下代码

// file START ommited
    'providers' => [
        // other pro````viders ommited
        \LaraPolices\Providers\PolicesServiceProvider::class,
    ],
// file END ommited

3.1 发布配置文件(仅在完成步骤3后执行)

要发布与包一起提供的默认配置文件,请执行以下命令

php artisan vendor:publish  --provider="LaraPolices\Providers\PolicesServiceProvider"

4 配置(仅在完成步骤3和3.1后执行)

使用所需的错误消息和路径配置文件。

config/polices.php

5 创建策略

在创建策略时,将use LaraPolices\Polices\AbstractPolice;作为您要扩展的类的依赖项添加。策略的方法和验证定义非常开放,只需遵守一些约定即可。

O mesmo nome de classe usado no Controller deverá ser o nome da classe da Police.

  Ex.: "PostsController" => "PostsPolice"
As rotas cobertas pelo middleware de polices devem apontar sempre para um {Controller@action} e não possuir um Closure. Rotas com
 closures na definição não são cobertas pelas Polices.

  Coberto: "Route::get('posts', 'PostsController@index')" => "PostsPolice@index"
  Não Coberto: "Route::get('posts', function () {
    return [];
  )" => "-"
Os métodos de validação da Police devem ser os mesmos do controller no qual será aplicada. Tais metodos recebem `$request`
 como parâmetro para captura de dados e validações

  Ex.: "PostsController@show" => "PostsPolice@show"

对于基于用户数据的验证,您可以使用$this->user变量来捕获Auth中的当前Authenticatable。

创建策略的示例。

<?php

namespace LaraPolicesTests;

use LaraPolices\Polices\AbstractPolice;

class MockPolice extends AbstractPolice
{
    public function mockTrueMethod($request)
    {
        return (bool) ($request->owner_id == $this->user->group['owner_id'] &&
            $request->owner_type == $this->user->group['owner_type']
        );
    }
}

Abstract Police类的详细信息。

<?php

namespace LaraPolices\Polices;

use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use LaraPolices\Exceptions\ObjectNotFoundException;

abstract class AbstractPolice
{
    /**
     * Define the Autenticatable Interface
     * @var Authenticatable
     */
    protected $user;

    /**
     * @var array Objects storage
     */
    private $objects = array();

    /**
     * AbstractPolice constructor.
     * @param Request $request
     * @param Authenticatable $user
     */
    public function __construct(Authenticatable $user)
    {
        $this->user = $user;
    }

    /**
     * Store object in police
     *
     * @param mixed $object
     * @return $this
     */
    public function pushObject($object)
    {
        $objectReflection = new \ReflectionClass($object);
        $this->objects[$objectReflection->getShortName()] = $object;

        return $this;
    }

    /**
     * Get object from police
     *
     * @param $name
     * @return mixed
     * @throws ObjectNotFoundException
     */
    public function getObject($name)
    {
        if (!isset($this->objects[$name])) {
            if (class_exists($name)) {
                $this->pushObject(App::make($name));

                return $this->getObject($name);
            }

            throw new ObjectNotFoundException("Object not found.");
        }

        return $this->objects[$name];
    }

    /**
     * Function to call action method to authorize resource permission to user.
     * This function should be return a boolean.
     * @param Request $request Request to validate
     * @param string $actionToValidate Police action to validate
     * @return bool
     */
    public function canMakeAction(Request $request, $actionToValidate)
    {
        return (bool) $this->$actionToValidate($request);
    }
}

感谢和贡献

请随时提出纠正、改进文档或代码的建议,或者如果您愿意,在我们的代码中发起pull-request。:-D

贡献者

Gilson Fernandes Batista de Souza - 个人网站