如何優雅的寫代碼,我想是每位程序員的心聲。自從15年初第一次接觸 laravel 4.2 開始,我就迷上使用 Laravel 框架了。我一直都想找個時間好好寫寫有關 Laravel 的使用文章,由淺入深的介紹 Laravel 框架。
今天通過使用 laravel-admin 插件,來簡單說說怎么優雅的寫 Laravel 代碼。
創建 Laravel 項目
只要跟著官方文檔走,創建一個 Laravel 項目還是很簡單的:
//?使用?Composer?下載?Laravel?安裝程序 composer?global?require?"laravel/installer" //?創建?web?項目 laravel?new?web
具體配置數據庫等:略
安裝 Laravel 看官網:https://d.laravel-china.org/docs/5.5/installation
安裝 laravel-admin
laravel-admin 是一個可以快速幫你構建后臺管理的工具,它提供的頁面組件和表單元素等功能,能幫助你使用很少的代碼就實現功能完善的后臺管理功能。
注:當前版本(1.5)需要安裝 php 7+和 Laravel 5.5
看看 laravel-admin 的特性:
·內置用戶和權限系統
·model-grid 支持快速構建數據表格
·model-form 支持快速構建數據表單
·model-tree 支持快速構建樹狀數據
·內置 40+ 種 form 元素組件、以及支持擴展組件
·支持 Laravel 的多種模型關系
·支持引入第三方前端庫
·數據庫和 artisan 命令行工具的 web 實現
·支持自定義圖表
·多種常用 web 組件
·支持本地和 oss 文件上傳
有了這些功能,開發一個后臺管理系統就變得相對簡單了。
安裝插件:
composer?require?encore/laravel-admin?"1.5.*" //?發布資源: php?artisan?vendor:publish?--provider="EncoreAdminAdminServiceProvider" //?安裝 php?artisan?admin:install
簡單的三條命令,即可配置好一個簡單的后臺管理系統,賬號和密碼都是 admin
代碼主要集中在APPAdmin中
相關推薦:《laravel教程》
默認系統提供一個 Dashboard 界面:
<?php namespace AppAdminControllers; use AppHttpControllersController; use EncoreAdminFacadesAdmin; use EncoreAdminLayoutcolumn; use EncoreAdminLayoutContent; use EncoreAdminLayoutRow; class HomeController extends Controller { public function index() { return Admin::content(function (Content $content) { $content->header('Test?Dashboard'); ????????????$content->description('Description...'); ????????????$content->row(Dashboard::title()); ????????????$content->row(function?(Row?$row)?{ ????????????????$row->column(4,?function?(Column?$column)?{ ????????????????????$column->append(Dashboard::environment()); ????????????????}); ????????????????$row->column(4,?function?(Column?$column)?{ ????????????????????$column->append(Dashboard::extensions()); ????????????????}); ????????????????$row->column(4,?function?(Column?$column)?{ ????????????????????$column->append(Dashboard::dependencies()); ????????????????}); ????????????}); ????????}); ????} }
結合界面和代碼,可以看出界面主要分成這么幾個部分:header、description、兩個 row,后一個 row 包含三個 column 模塊;具體的代碼放在 Dashboard 代碼中,如下:
<?php namespace EncoreAdminControllers; use EncoreAdminAdmin; class Dashboard { /** * @return IlluminateContractsViewFactory|IlluminateViewView */ public static function title() { return view('admin::dashboard.title'); } /** * @return IlluminateContractsViewFactory|IlluminateViewView */ public static function environment() { $envs = [ ['name' =>?'PHP?version',???????'value'?=>?'PHP/'.PHP_VERSION], ????????????['name'?=>?'Laravel?version',???'value'?=>?app()->version()], ????????????['name'?=>?'CGI',???????????????'value'?=>?php_sapi_name()], ????????????['name'?=>?'Uname',?????????????'value'?=>?php_uname()], ????????????['name'?=>?'Server',????????????'value'?=>?array_get($_SERVER,?'SERVER_SOFTWARE')], ????????????['name'?=>?'Cache?driver',??????'value'?=>?config('cache.default')], ????????????['name'?=>?'Session?driver',????'value'?=>?config('session.driver')], ????????????['name'?=>?'Queue?driver',??????'value'?=>?config('queue.default')], ????????????['name'?=>?'Timezone',??????????'value'?=>?config('app.timezone')], ????????????['name'?=>?'Locale',????????????'value'?=>?config('app.locale')], ????????????['name'?=>?'Env',???????????????'value'?=>?config('app.env')], ????????????['name'?=>?'URL',???????????????'value'?=>?config('app.url')], ????????]; ????????return?view('admin::dashboard.environment',?compact('envs')); ????} ????/** ?????*?@return?IlluminateContractsViewFactory|IlluminateViewView ?????*/ ????public?static?function?extensions() ????{ ????????$extensions?=?[ ????????????'helpers'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/helpers', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/helpers', ????????????????'icon'?=>?'gears', ????????????], ????????????'log-viewer'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/log-viewer', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/log-viewer', ????????????????'icon'?=>?'database', ????????????], ????????????'backup'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/backup', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/backup', ????????????????'icon'?=>?'copy', ????????????], ????????????'config'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/config', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/config', ????????????????'icon'?=>?'toggle-on', ????????????], ????????????'api-tester'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/api-tester', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/api-tester', ????????????????'icon'?=>?'sliders', ????????????], ????????????'media-manager'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/media-manager', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/media-manager', ????????????????'icon'?=>?'file', ????????????], ????????????'scheduling'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/scheduling', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/scheduling', ????????????????'icon'?=>?'clock-o', ????????????], ????????????'reporter'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/reporter', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/reporter', ????????????????'icon'?=>?'bug', ????????????], ????????????'translation'?=>?[ ????????????????'name'?=>?'laravel-admin-ext/translation', ????????????????'link'?=>?'https://github.com/laravel-admin-extensions/translation', ????????????????'icon'?=>?'language', ????????????], ????????]; ????????foreach?($extensions?as?&$extension)?{ ????????????$name?=?explode('/',?$extension['name']); ????????????$extension['installed']?=?array_key_exists(end($name),?Admin::$extensions); ????????} ????????return?view('admin::dashboard.extensions',?compact('extensions')); ????} ????/** ?????*?@return?IlluminateContractsViewFactory|IlluminateViewView ?????*/ ????public?static?function?dependencies() ????{ ????????$json?=?file_get_contents(base_path('composer.json')); ????????$dependencies?=?json_decode($json,?true)['require']; ????????return?view('admin::dashboard.dependencies',?compact('dependencies')); ????} }
這樣我們就把代碼分塊的組織在一起。具體布局類看:class Content implements Renderable
其它的靜態資源文件放在 /public/vendor/laravel-admin 目錄下
更多內容參考 laravel-admin 官網:
http://laravel-admin.org/docs/#/zh/
寫一個 demo
有了這個 laravel-admin 插件,要寫一個 movies 列表,只需要幾個命令行就可以完成了,非常簡單:
1.建立模型,并創建 Migrations:
php?artisan?make:model?Movie?-m
2.在 Migrations,增加一個字段:name
<?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateMoviesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('movies', function (Blueprint $table) { $table->increments('id'); ????????????$table->string('name',?50)->unique(); ????????????$table->timestamps(); ????????}); ????} ????/** ?????*?Reverse?the?migrations. ?????* ?????*?@return?void ?????*/ ????public?function?down() ????{ ????????Schema::dropIfExists('movies'); ????} }
3.運行 Migrations,創建對應數據庫:
php?artisan?migrate
4.有了數據表,就需要往表里插入 fake 數據,用于測試
//?使用該插件創建?fake?數據 composer?require?fzaninotto/faker
5.建立 Seeder
php?artisan?make:seeder?MovieTableSeeder
在該類中,建立1000條假數據:
<?php use IlluminateDatabaseSeeder; class MovieTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // $faker = FakerFactory::create(); for($i = 0; $i < 1000; $i++) { AppMovie::create([ 'name' =>?$faker->name ????????????]); ????????} ????} }
運行:
php?artisan?db:seed?--class=MovieTableSeeder
是不是很簡單,數據表直接填充 1000 條假數據:
6.建立資源 Controller
php?artisan?admin:make?MovieController?--model=AppMovie
這樣就直接有了基礎的增刪改查和 movie 列表功能的 Controller 了。
7.建立 route
$router->resource('movies',?MovieController::class);
8.加入到 admin 的 menu 中
其中路徑處需要注意的是:
其中uri填寫不包含路由前綴的的路徑部分,比如完整路徑是http://localhost:8000/admin/demo/users, 那么就填demo/users,如果要添加外部鏈接,只要填寫完整的url即可,比如http://laravel-admin.org/.
上圖也是加了左側 movies 菜單的效果。
這就完成了簡單的 movie 資源的后臺管理了,在瀏覽器輸入鏈接:
http://web.app/admin/movies
就能看到一個較為完整的 movie 列表:
具體有新增、導出、篩選、操作 (刪除)、撤銷、分頁、修改、刪除等常規功能,如下幾個截圖:
總結
有了 Laravel 和 laravel-admin,基本不用寫什么代碼,敲敲幾個命令就可以完成一個「功能比較齊全」的資源操作后臺。極大的方便了我們的開發。
總體命令行和代碼如下:
php?artisan?make:model?Movie?-m php?artisan?migrate composer?require?fzaninotto/faker php?artisan?make:seeder?MovieTableSeeder php?artisan?db:seed?--class=MovieTableSeeder php?artisan?admin:make?MovieController?--model=AppMovie $router->resource('movies',?MovieController::class);
框架和開源插件,有時候確實是能方便我們開發,所以尋找優質的框架和開源庫也是促進我們生產力的。
laravel-admin 代碼是如何組織的,可以具體參考網站開發。先根據官網的介紹,利用好 laravel-admin,然后學習它的源碼和代碼設計,最后取其精華,為你所用。