elnooronline / laravel-concerns
此包已被弃用且不再维护。未建议替代包。
组成 Elnooronline 的 Laravel 项目的组件
v2.1.1
2020-03-11 18:22 UTC
Requires
- elnooronline/laravel-bootstrap-forms: ^2.0
- elnooronline/laravel-locales: ^1.0
- ezyang/htmlpurifier: ^4.10
- laracasts/flash: ^3.0
- laracasts/presenter: ^0.2.1
- laravel/framework: ~5.6|^6.0|^7.0
- spatie/laravel-medialibrary: ^7.12
Requires (Dev)
- mockery/mockery: ^1.2
- orchestra/testbench: ~3.0
README
组成 Elnooronline 的 Laravel 项目的组件。
安装
composer require elnooronline/laravel-concerns
配置
- 在您的基控制器类中导入
\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()
: 此方法返回在Controller
、Request
、Model
中使用的特定 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 } }
- 示例:如果您有
- 所有
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
模型。