elnooronline/laravel-concerns

此包已被弃用且不再维护。未建议替代包。

组成 Elnooronline 的 Laravel 项目的组件

v2.1.1 2020-03-11 18:22 UTC

README

组成 Elnooronline 的 Laravel 项目的组件。

安装

composer require elnooronline/laravel-concerns

配置

  1. 在您的基控制器类中导入 \Elnooronline\LaravelConcerns\Http\Controllers\Helpers 特性
<?php

namespace App\Http\Controllers;

use Elnooronline\LaravelConcerns\Http\Controllers\Helpers;
...
class Controller extends BaseController
{
    use Helpers;
    ...
}

此功能使您可以使用 flash()getResourceName() 方法。

  • flash() : 此方法将设置带有本地化消息的闪存会话。
    • 示例
     public function store(Request $request)
     {
     	// Handle store
     
     	$this->>flash('created'); // returns : trans('%RESOURCE_NAME%.messages.created').
     
     	return view('home');
     }
  • getResourceName() : 此方法返回在 ControllerRequestModel 中使用的特定 CRUD 的资源名称。
    • 示例:如果您有 UserController 类,将返回 users。您可以通过添加 $resourceName 属性来自定义资源名称。
     class UserController extends Controller 
     {
     	public function index()
     	{
     		return $this->getResourceName();
     		// returns : users
     	}
     }
     class UserController extends Controller 
     {
     	/**
     	 * The controller resource name.
     	 *
     	 * @return string
     	 */
     	protected $resourceName = 'persons';
     	
     	public function index()
     	{
     		return $this->getResourceName();
     		// returns : persons
     	}
     }
    
  1. 所有 Request 类都应扩展 \Elnooronline\LaravelConcerns\Http\RequestsFormRequest 类。

API

  • getResourceName()
  • parseLocale()
    • 示例
     /**
      * Get the validation rules that apply to the request.
      *
      * @return array
      */
     public function rules()
     {
     	return $this->parseLocale([
     		'name:{default}' => 'required|string|max:255',
     		'name:{lang}' => 'nullable|string|max:255',
     	]);
     }
    
    替代
     /**
      * Get the validation rules that apply to the request.
      *
      * @return array
      */
     public function rules()
     {
     	// The default locale is "en" in this example
     	return [
     		'name:en' => 'required|string|max:255',
     		'name:ar' => 'nullable|string|max:255',
     		'name:fr' => 'nullable|string|max:255',
     	];
     }
    
  • getAproperRules()
    • 示例
     /**
      * Get the validation rules that apply to the request.
      *
      * @return array
      */
     public function rules()
     {
     	return $this->getAproperRules();
     }
     
     /**
      * The rules of create request.
      *
      * @return array
      */
     public function createRules()
     {
     	return [];
     }
     
     /**
      * The rules of update request.
      *
      * @return array
      */
     public function updateRules()
     {
     	return [];
     }
    

可筛选

首先,您应该在您的模型中使用 Filterable 特性。


namespace App\Models;

use Elnooronline\LaravelConcerns\Http\Filters\Filterable;
use Elnooronline\LaravelConcerns\Models\Abstracts\Authenticatable;

class User extends Authenticatable
{
    use Filterable;
    
    ...
}

然后运行以下命令以生成您的筛选类。

php artisan make:filter UserFilter

App\Http\Filters\UserFilter

<?php

namespace App\Http\Filters;

use Elnooronline\LaravelConcerns\Http\Filters\BaseFilters;

class UserFilter extends BaseFilters
{
    /**
     * Registered filters to operate upon.
     *
     * @var array
     */
    protected $filters = [
        'type',
        'created_at',
    ];
    
    /**
     * Filter the query by a given type.
     *
     * @param  string|int  $value
     * @return \Illuminate\Database\Eloquent\Builder
     */
    protected function type($value)
    {
        return $this->builder->where('type', $value);
    }

    /**
     * Filter the query by a given created at date.
     *
     * @param  string|int  $value
     * @return \Illuminate\Database\Eloquent\Builder
     */
    protected function createdAt($value)
    {
        return $this->builder->whereDate('created_at', $value);
    }
}

现在您可以从控制器中使用该筛选器。

示例 URL: /users?type=admin

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Http\Filters\UserFilter;
use Illuminate\Support\Facades\View;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @param \App\Http\Filters\UserFilter $filter
     * @return \Illuminate\Http\Response
     */
    public function index(UserFilter $filter)
    {
        return View::make('users.index')
            ->withUsers(
                User::filter($filter)->latest()->paginate()
            );
    }
    
    ...
}

Eloquent 多个认证提供者

您应该在您的 config/auth.php 中添加 'eloquent.multiple' 提供者。

'providers' => [
	'users' => [
		'driver' => 'eloquent.multiple',
		'model' => App\Models\User::class,
		'mapping' => [
			App\Models\User::ADMIN_TYPE => App\Models\Admin::class,
			App\Models\User::USER_TYPE => App\Models\User::class,
		],
	],

在用户表中添加 type 列。

Schema::table('users', function (Blueprint $table) {
	$table->string('type')->index();
});

User 模型中添加用户类型的常量。

class User extends Authenticatable
{
    /**
     * The code of normal user type.
     */
    const USER_TYPE = 'user';

    /**
     * The code of admin type.
     */
    const ADMIN_TYPE = 'admin';

此外,您应该在用户模型中使用 Elnooronline\LaravelConcerns\Models\Concerns\SingleTableInheritance 特性来填充创建事件中的类型。

// User model

use Elnooronline\LaravelConcerns\Models\Concerns\SingleTableInheritance;

class User extends Authenticatable
{
    use SingleTableInheritance;

    /**
     * The type of the current model for single table inheritance.
     *
     * @var string
     */
    protected $modelType = 'user';
	...

// Admin Model

use Elnooronline\LaravelConcerns\Models\Scopes\UserTypeScope;
use Elnooronline\LaravelConcerns\Models\Concerns\SingleTableInheritance;

class Admin extends User
{
    use SingleTableInheritance;

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The type of the current model for single table inheritance.
     *
     * @var string
     */
    protected $modelType = 'admin';

	/**
	 * The "booting" method of the model.
	 *
	 * @return void
	 */
	protected static function boot()
	{
		parent::boot();

		static::addGlobalScope(new UserTypeScope(static::ADMIN_TYPE));
	}
	...

使用 Elnooronline\LaravelConcerns\Models\Scopes\UserTypeScope 确定用户类型,并应将其添加到所有用户类型模型中。

现在,如果您账号类型是 admin,则当您调用 Auth::user() 时将返回 App\Models\Admin 实例,而不是 App\Models\User

注意: App\Models\Admin 模型和其它类型模型应该继承 App\Models\User 模型。