rtmatt / abstractresource
Laravel的抽象资源管理器
Requires
- php: >=5.3.0
- illuminate/support: ~5.1
- intervention/image: ^2.3
- laravelcollective/html: ^5.1
Requires (Dev)
- phpunit/phpunit: 4.*
- scrutinizer/ocular: ~1.1
README
Laravel中的抽象资源管理。
通过配置资源,而不是一遍又一遍地重复相同的代码,来加速基本的CRUD功能...
此包目前使用Bootstrap 3标记生成水平表单。
先决条件
在理想的世界里,这将是一个完全自包含的包。这不是理想的世界。
Laravel
您需要一个现有的laravel 5.1安装。您需要设置数据库并将其连接到应用程序。
管理布局
您需要在 /resources/views/layouts
中有一个名为 admin.blade.php
的文件。至少,该文件需要包含 @yield('content)
。
安装
通过Composer
$ composer require rtmatt/abstractresource
将服务提供者添加到 config/app.php
中的列表
RTMatt\AbstractResource\AbstractResourceServiceProvider::class,
此包有一些依赖项,您需要在应用中注册,如果尚未注册的话。确保以下内容在您的 config/app.php
文件中的 'providers' 列表下:
'Intervention\Image\ImageServiceProvider', 'Collective\Html\HtmlServiceProvider',
在相同的文件中,以下内容需要位于您的 'aliases' 列表下:
'Form' => 'Collective\Html\FormFacade', 'Image' => 'Intervention\Image\Facades\Image',
为了使文件上传工作,您需要在 public
目录中有一个可由Web服务器写入的 uploads
文件夹。
如果您还没有一个,请在 app/Http/Controllers
中创建一个名为 Admin
的文件夹。
使用方法
创建模型和迁移
$ php artisan make:model [ResourceName] -m
在迁移文件中,定义您的模式。请确保定义所有可空输入。没有值的输入将在后端设置为null。完成后运行迁移。
创建资源控制器
创建控制器时,确保其名称为您的资源名称(复数且大写)+ 'Controller'
$ php artisan make:controller Admin/[ResourceNames]Controller --plain
内容应反映以下内容
<?php namespace App\Http\Controllers\Admin; use App\Http\Requests; use RTMatt\AbstractResource\AbstractResourceController; class [ResourceNames]Controller extends AbstractResourceController { protected $model = '\App\[ResourceName]'; }
重要的是控制器名称与资源名称完全相同,只是复数且位于控制器目录的 Admin
子目录中。
它应从 RTMatt\AbstractResource\AbstractResourceController
扩展,并具有 App\Http\Controllers\Admin
命名空间。
这是默认功能所需的所有内容。
创建路由
在您的 routes.php
文件中
Route::resource('/admin/[resource-names]','Admin\[ResourceNames]Controller');
URI需要是 /admin
的子路由。路由需要是资源路由。
定义模型
按常规定义您的模型。添加您的可填充数组以及您需要的任何访问器或修改器。
添加以下方法
public static function getResourceControllerConfigs() { return [ 'resourceName' => 'resource-names', 'creatable' => true, 'deletable' => true, 'indexFields' => [ 'field_1', 'field_2' ], 'editableFields' => [ // ... ] ]; }
此方法是力量的所在。我们稍后讨论它。开玩笑的。我们现在就讨论它。
配置模型
通过更改 getResourceControllerConfigs
方法返回的数组来配置您的模型。
[ 'resourceName' => 'resource-names', //this is the lower-case, hyphenated resource name 'creatable' => true, //whether the resource should be creatable in the admin 'deletable' => true, //whether the resource should be deletable in the admin 'indexFields' => [ 'field__name_1', 'field_name_2' ], //fields to display on the index view of the resource manager 'editableFields' => [ // all the fields that appear on the create and edit forms 'field_name' => 'field_type' // field definition. make sure each field is fillable ] ]
在生成的表单中,标签将自动从字段名称生成,通过替换下划线为空格并将结果大写。此外,如果字段名称以 "_id" 结尾,则将其删除。
'hide_flag' => "Hide Flag:", 'property_type_id' => "Property Type:"
字段_type的标准选项
'field_name' => 'text', // <input type="text" name="field_name"> 'field_name' => 'tel', // <input type="tel" name="field_name"> 'field_name' => 'email', // <input type="email" name="field_name"> 'field_name' => 'textarea', // <textarea name="field_name"></textarea> 'field_name' => 'image', // <input type="file" name="field_name"> - configured for image uploads 'field_name' => 'file', // <input type="file" name="field_name"> - configured for file uploads 'field_name' => 'checkbox', // single checkbox
基于数组的字段_type选项
某些字段类型更复杂,定义为数组
'field_name' => [ // Array Field Type 'type' => 'radioGroup', //creates a radio group 'options' => [ //options are defined as value:key pairs 'value_1' => 'Display Text for value_1', 'value_2' => 'Display Text for value_2', ] ], 'field_name' => [ // Array Field Type 'type' => 'select', //creates a select input 'options' => [ //options are defined as value:key pairs 'value_1' => 'Display Text for value_1', 'value_2' => 'Display Text for value_2', ] ], 'field_name' => [ // Array Field Type 'type' => 'checkGroup', //creates a checkbox group 'options' => [ //options are defined as value:key pairs 'value_1' => 'Display Text for value_1', 'value_2' => 'Display Text for value_2', ] ],
注意:checkgroup字段类型需要在存储值时在模型上创建访问器和修改器以对字段进行json_encode,并在检索值时进行json_decode。
特殊字段_type选项
WYSIWIG
'field_name' => 'wysi', //creates a wysi input. requires additional scripts
这仅创建一个textarea输入,并为其添加一个名为"wysi"的类。您可以为此类附加任何您喜欢的wysiwig插件。
日期/日期时间
'field_name' => 'date', //creates an input primed for a datepicker. requires additional scripts 'field_name' => 'datetime', //creates an input primed for a datepicker. requires additional scripts
上面的代码创建类型为"text"的输入,分别具有"date-picker"和"date-time-picker"类。您可以使用这些类附加任何您想要的日期/日期时间选择器插件。
#####具有尺寸变体的图片 这是为了需要自动保存各种尺寸的图片(标准 - 320x240,缩略图 - 32x24等)
'field_name' => 'varied_image', //creates a image input field
为了让系统创建图像变体,您需要在返回自getResourceControllerConfigs()
数组的索引中添加一个新索引。
'field_name_versions' => [ // make sure `field_name` corresponds to the name you used to create the input 'name_columns' => [ 'name_field' ], // field used to generate file names. this must be a field from the model 'versions' => // different varients of image to create. It's important these are in order of descending size [ 'field_name' => [ height, width ], // arrays are integers 'field_name_2' => [ height, width ], //... ] ]
如果您想在保存图像后查看其所有尺寸变体,请将以下内容添加到您站点的.env文件中
DEMO=true
完整的模型配置示例
<?php namespace App; use Illuminate\Database\Eloquent\Model; class ResourceName extends Model { protected $fillable = [ 'name', 'phone_number', 'email_address', 'biography', 'hide_flag', 'featured_image', 'resume_file', 'color', 'affiliation', 'skills', 'custom_content', 'birthday', 'hide_until', 'profile_picture', 'profile_picture_2x', 'profile_picture_tile', 'profile_picture_tile_2x', ]; public static function getResourceControllerConfigs() { return [ 'resourceName' => 'resource-names', 'creatable' => true, 'deletable' => true, 'indexFields' => [ 'name', 'phone_number', 'email_address' ], 'editableFields' => [ 'name' => 'text', 'phone_number' => 'tel', 'email_address' => 'email', 'biography' => 'textarea', 'hide_flag' => 'checkbox', 'featured_image' => 'image', 'resume_file' => 'file', 'color' => [ 'type' => 'radioGroup', 'options' => [ 'red' => 'Favorite Color - Red', 'blue' => 'Favorite Color - Blue', ] ], 'affiliation' => [ 'type' => 'select', 'options' => [ 'rep' => 'Republican', 'dem' => 'Democrat', 'ind' => 'Independent', 'oth' => 'Other', ] ], 'skills' => [ 'type' => 'checkGroup', 'options' => [ 'typing' => 'Typing', 'reading' => 'Readiing', 'knitting' => 'Knitting' ] ], 'custom_content' => 'wysi', 'birthday' => 'date', 'hide_until' => 'datetime', 'profile_picture' => 'varied_image', ], 'profile_picture_versions' => [ 'name_columns' => [ 'name' ], 'versions' => [ 'profile_picture_tile_2x' => [ 80, 80 ], 'profile_picture_2x' => [ 60, 60 ], 'profile_picture_tile' => [ 40, 40 ], 'profile_picture' => [ 30, 30 ], ] ] ]; } public function setSkillsAttribute($value) { $this->attributes['skills'] = json_encode($value); } public function getSkillsAttribute($value) { return json_decode($value, true); //include true arguent to create array instead of std class } }
覆盖
对于更复杂的资源,您将需要覆盖默认功能。
索引排序
如果您想更改索引页上的显示顺序,只需给您的模型提供一个名为defaultOrder的查询作用域即可。
public function scopeDefaultOrder($query){ return $query->orderBy('name','asc'); }
视图覆盖
覆盖任何资源管理器屏幕的默认视图很容易。您需要做的就是创建覆盖视图,然后它会加载。如果您还没有,您将需要一个resources/views/admin
文件夹。
在此文件夹中,为您的资源创建一个文件夹,以及您想要覆盖的以下文件之一
resources/views/admin/
[resource-names]/ //this folder needs to be the pluralized, hyphenated name of your resource
resource/ //this folder holds all the necessary resource views
index.blade.php
edit.blade.php
create.blade.php
show.blade.php
partials/
form.blade.php //the form for creating/editing your resource.
建议在创建覆盖时以本包中的默认视图作为起点。
功能覆盖
有一些超出典型REST的功能,您可以使用这些功能添加功能,而无需覆盖REST函数。
验证
// define the rules for laravel controller validation for the store request protected function getValidationRulesStore() { return [ ]; } // define custom validation messages for laravel controller validation for the store request protected function getValidationMessagesStore() { return [ ]; }
数据额外操作
//Allows you do manipulate form input before creting the new resource instance. if errors are be produced, return $args['errors'] with the error message protected function uniqueStoreArgs($args) { return $args; }
所有这些方法都有更新请求的版本。只需在函数名中将'Store'替换为'Update'。
销毁前功能
如果您需要在删除模型实例之前执行某些操作,可以覆盖以下函数
protected function pre_destroy($id){ return true; }
变更日志
有关最近更改的更多信息,请参阅CHANGELOG。
许可
独家。请参阅许可文件获取更多信息。