成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【日常手記】之Laravel5.3

kidsamong / 1222人閱讀

摘要:個人網(wǎng)站最近剛寫了一個手機在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復(fù)用的約束集合,方便鏈式調(diào)用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應(yīng)用中復(fù)用。

關(guān)于作者

程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。

個人網(wǎng)站:http://www.linganmin.cn

最近剛寫了一個手機在線播放的H5電影站:http://www.ifilm.ltd

使用Laravel5.3 日常手記

2017.03.01更新

使用laravel的ORM的查詢作用域的本地作用域去自定義可復(fù)用的約束集合,方便鏈式調(diào)用

什么是本地查詢作用域
本地作用域允許我們定義通用的約束集合以便在應(yīng)用中復(fù)用。例如,你可能經(jīng)常需要獲取訪問量大于指定數(shù)量的文章,要定義這樣的一個作用域,只需簡單在對應(yīng) Eloquent 模型方法前加上一個 scope 前綴,作用域總是返回查詢構(gòu)建器,下面來實現(xiàn)這個例子:

news 數(shù)據(jù)表結(jié)構(gòu)如下

我們只需要在News對應(yīng)模型文件中增加一個方法如下(pv為訪問量)

/**
* @param $query
* @param $value
* @return mixed
*/
public function scopePv($query, $value)
{
    return $query->where("pv",">",$value);
}

有了以上模型方法,我們就可以在任何可能用到的地方使用ORM的鏈式調(diào)用查詢了,舉例子如下

Route::any("test",function(){
    // 使用我么自己定義的本地作用域約束集合獲取新聞閱讀量大于10的數(shù)據(jù)
    return AppModelsNews::pv(10)->get();
});
我們可以使用trait做的更通用

比如當我們有三張新聞類相關(guān)的數(shù)據(jù)分別是news,readings,deepnesses,表結(jié)構(gòu)不盡相同但有些字段是相同的,比如瀏覽量pv等,如果當有需求為查看這三張表中pv大于100的時候,使用laravel自帶的ORM模型操作如下:

    AppModelsNews::where("pv",">","100")->get();
    AppModelsReading::where("pv",">","100")->get();
    AppModelsDeepness::where("pv",">","100")->get();

可以看到,這樣寫會有不少的代碼冗余,所以我們可以按照上面的方法使用本地作用域為每個模型去構(gòu)建一個叫scopePv的方法,者樣就可以在查詢指定的閱讀量的時候直接使用pv方法,如下:

AppModelsNews::pv(100)->get(),
AppModelsReading::pv(100)->get(),
AppModelsDeepness::pv(100)->get(),

然而在每個模型中去構(gòu)建一個相同的方法也是會有代碼冗余,當然你也可以在新建一個模型類的基類,在基類離去添加這個方法,然后每個模型再去繼承模型基類,但是這里推薦的是使用trait的方式

自 PHP 5.4.0 起,PHP 實現(xiàn)了一種代碼復(fù)用的方法,稱為 trait。

Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復(fù)用機制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨立的類中復(fù)用 method。Trait 和 Class 組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和 Mixin 類相關(guān)典型問題。

我們可以在laravel項目的app目錄下新建一個叫Traits的文件夾,在里面可以創(chuàng)建各種trait文件,laravel框架中其實大量使用到了PHP的trait特性,比如模型的軟刪除SoftDeletes

還是接著說上面的例子,為演示代碼我在appTraits目錄下創(chuàng)建了一個叫GeneralModelMethods.php的trait文件,

里面定義的代碼如下:

/**
 * Created by PhpStorm.
 * User: saboran
 * Date: 2017/3/2
 * Time: 8:23
 */

namespace AppTraits;


trait GeneralModelMethods
{
    public function scopePv($query, $value)
    {
        return $query->where("pv",">",$value);
    }
}

定義完后只需在每個需要使用到的模型中使用關(guān)鍵字use一下這個trait文件后,就可以像上面在模型中定義這個本地約束集合一樣使用了


ORM的集合方法
setter 和 getter
使用服務(wù)容器綁定設(shè)置模型工廠默認填充中文數(shù)據(jù)

appProvidersAppServiceProvider.phpregister方法中加入如下代碼

  // 設(shè)置模型工廠數(shù)據(jù)格式為中文
       $this->app->bind("FakerGenerator",function(){
           return Factory::create($locale = "zh_CN");
       });

設(shè)置默認語言后,可以在工廠模型中使用一些方法生成符合國內(nèi)格式的填充數(shù)據(jù),比如中文姓名,中國手機號碼等等,下面是一個簡單的用戶工廠

$factory->define(AppUser::class, function (FakerGenerator $faker) {
    return [
        "mobile" => $faker->phoneNumber, // 可以生產(chǎn)中國手機號格式的手機換號碼
        "username" => $faker->name, // 可以生產(chǎn)中文姓名
        "realname" => $faker->word,
        "nickname" => $faker->word,
        "password" => bcrypt($faker->password),
        "email" => $faker->safeEmail,
        "avatar" => $faker->word,
        "gender" => $faker->word,
        "role_id" => $faker->randomNumber(),
        "status" => $faker->randomNumber(),
        "deleted_at" => $faker->dateTimeBetween(),
    ];
});

詳細模型工廠的使用方式,請移步 中文官方文檔

生成測試數(shù)據(jù)可以使用這個laravel擴展包:mpociot/laravel-test-factory-helper

擴展包GitHub地址:https://github.com/mpociot/la...


數(shù)據(jù)遷移migration正確使用步驟

一套流程走下來,總結(jié)如下:

先執(zhí)行 php artisan make:migration create_xxxx_table --create=xxx生成所需的所有表的遷移文件

在各遷移文件中寫入相應(yīng)字段和索引,不包含外鍵

多帶帶創(chuàng)建一個增加外鍵的遷移文件,比如php artisan make:migration add_foreign_key,在里面增加所有表的外鍵關(guān)系

為什么這樣做呢,而不是在每個表的遷移文件中創(chuàng)建對應(yīng)外鍵呢?因為,在最后執(zhí)行php artisan migrate生成遷移文件時是按照創(chuàng)建遷移文件的順序去創(chuàng)建數(shù)據(jù)表,這就會出現(xiàn)一個問題,比如有一張角色表和一張用戶表,用戶表的role_id外鍵連接到角色表的id,這樣如果我們在創(chuàng)建遷移文件時先創(chuàng)建用戶的遷移文件,后創(chuàng)建角色的遷移文件,那么在執(zhí)行php artisan migrate的時候,就會報錯,提示外鍵無法創(chuàng)建,無法創(chuàng)建是因為那個字段的外鍵的所屬表還不存在,而為了避免這種問題出現(xiàn),比較好的解決方法,就是先將所有遷移文件創(chuàng)建好,最后再添加一個遷移文件去給所有需要增加外鍵的字段創(chuàng)建外鍵關(guān)系,這個時候,所有數(shù)據(jù)表都已經(jīng)存在,也就不會有上面所說的問題出現(xiàn)

使用擴展或者手動創(chuàng)建對應(yīng)數(shù)據(jù)表的Model文件


自定義驗證規(guī)則方法

為什么要自定義驗證規(guī)則,因為Laravel框架本身給我們提供的驗證規(guī)則是有限的,很多時候我們需根據(jù)自己的實際需求去增加對應(yīng)的驗證方法,比如我們現(xiàn)在需要增加一個驗證中國手機號碼格式的方法,如下:

增加驗證規(guī)則方式如下

在AppServiceProvider.php中的boot方法中定義一個驗證規(guī)則,驗證規(guī)則格式如下:

 Validator::extend("foo", function($attribute, $value, $parameters, $validator) {

     // do something to deal $value ...
    
     // 返回處理后的值
     return $value == "foo";
});
下面是增加一個中國手機號碼格式驗證規(guī)則
  Validator::extend("mobile",function($attribute,$value,$parameters,$validator){
            return preg_match("/^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])d{8}$/",$value);
      });

注:當我們自己創(chuàng)建的驗證規(guī)則過多時,boot方法中就會顯得特別臃腫,違反了Laravel一貫優(yōu)雅的寫法,所以當我們需要增加多個驗證規(guī)則時,我們可以去創(chuàng)建一個trait文件,在里面創(chuàng)建一個方法用來創(chuàng)建這些驗證規(guī)則,然后在AppServiceProvider.php中use過來,并在boot方法中調(diào)用即可,關(guān)于trait后面詳細說

關(guān)于trait附上一篇安正超大神的文章和PHP中文文檔對trait的介紹

安正超博客 我所理解的trait

PHP中文文檔 Trait實現(xiàn)代碼復(fù)用方法


一個模型生成擴展包

一個還不錯的模型生成擴展包,支持從數(shù)據(jù)庫生成模型各個表之間的關(guān)系,支持自定義 namespace 和生成的Model路徑

使用場景大致為使用migration建好遷移文件,執(zhí)行php artisan migrate生成數(shù)據(jù)表之后,從數(shù)據(jù)表生成模型文件

擴展包 GitHub地址,readme里面有詳細使用說明。

使用配置文件定義生成路徑和命名空間可以省去每次在命令行指定生成路徑和命名空間,方法如下:

在laravel的配置文件目錄創(chuàng)建文件eloquent_model_generator.php,在該配置文件中覆蓋擴展包里面設(shè)置的默認路徑

return [
    "model_defaults" => [
        "namespace"       => "SomeOtherNamespace", // 設(shè)置命名空間
        "base_class_name" => "SomeOtherClassName", // 設(shè)置模型繼承的基類
        "output_path"     => "/full/path/to/output/directory", // 設(shè)置模型的輸出目錄
        "no_timestamps"   => true,  // 設(shè)置時間戳
        "date_format"     => "U", // 設(shè)置時間格式化格式
        "connection"      => "other-connection", // 設(shè)置數(shù)據(jù)庫連接
    ],
];

下面是一個我自己使用到的設(shè)置


return [
    "model_defaults" => [
        "namespace"       => "AppModels",
        "base_class_name" => IlluminateDatabaseEloquentModel::class,
        "output_path"     => "appModels",
        "no_timestamps"   => null,
        "date_format"     => null,
        "connection"      => null,
    ],
];

一個后臺生成擴展包

GitHub地址

laravel-admin 是一個可以快速幫你構(gòu)建后臺管理的工具,它提供的頁面組件和表單元素等功能,能幫助你使用很少的代碼就實現(xiàn)功能完善的后臺管理功能。而且該包還有詳細的中文文檔(雖然寫的不是那么完美),下面說一說文檔上沒有寫的一些東西和自己填的坑

關(guān)于無限極分類

官方文檔地址 數(shù)據(jù)模型樹,如果根據(jù)他文檔上這樣去配置之后直接去訪問當分類沒有子分類時會發(fā)現(xiàn)是報錯的,原因是該包的模板文件branch.blade.php中一個判斷寫的并不嚴謹,源文件中代碼如下

@if(isset($branch["children"]))
    
    @foreach($branch["children"] as $branch) @include($branchView, $branch) @endforeach
@endif

isset($branch["children"])并不能判斷到當$branch["children"]為空時去阻止執(zhí)行下面的代碼,而當$branch["children"]為空時,下面的遍歷便會出錯,所以我們要將isset($branch["children"])改為!empty($branch["children"])

無限極分類做select下拉框數(shù)據(jù)

無限極分類做select下拉框數(shù)據(jù)時應(yīng)該在option()方法中傳遞分類的自帶的方法Category::selectOptions(),如下為實例

 $form->select("parent_id","上級分類")->options(Category::selectOptions());
關(guān)于列的editalbe

在index方法展示數(shù)據(jù)時,如果想使用點擊更改,最好將editable()放在鏈式調(diào)用的最后,這樣就可以在editable()使用display()將數(shù)據(jù)處理成想要的格式

下面裝個例子是處理性別,數(shù)據(jù)庫中存儲規(guī)則是:f代表女生,m代表男生,空代表未知性別,所以展示的鏈式調(diào)用如下:

// 鏈式調(diào)用處理性別展示
$grid->gender()->display(function ($gender){
    // 閉包函數(shù)傳遞當前字段值
                $data = [
                    "f"=>"女",
                    "m"=>"男",
                    ""=>"未知"
                ];
                // 根據(jù)字段值返回顯示的中文名稱
                return $data[$gender];
                // 使用editable()方法實現(xiàn)列可編輯
            })->editable("select", ["" => "未知性別", "m" => "男", "f" => "女"]);
關(guān)于導(dǎo)出Excel文件亂碼,

因為中文的Windows操作系統(tǒng)微軟默認設(shè)置的字符編碼都是gbk,包括office和cmd控制臺等等,而我們數(shù)據(jù)庫里一般存的都是utf-8編碼,所以在導(dǎo)出數(shù)據(jù)時一定要將從數(shù)據(jù)庫獲取到的數(shù)據(jù)轉(zhuǎn)碼,根據(jù)該擴展官方文檔導(dǎo)出數(shù)據(jù)的使用方法,只需增加一行轉(zhuǎn)碼即可,代碼如下

namespace AppAdminExtensions;

use EncoreAdminGridExportersAbstractExporter;

class CustomExporter extends AbstractExporter
{
    /**
     * {@inheritdoc}
     */
    public function export()
    {
        $titles = [];
        $filename = $this->getTable() . ".csv";
        $data = $this->getData();
        if (!empty($data)) {
            $columns = array_dot($this->sanitize($data[0]));
            $titles = array_keys($columns);
        }
        $output = implode(",", $titles) . "
";
        foreach ($data as $row) {
            $row = array_only($row, $titles);
            $output .= implode(",", array_dot($row)) . "
";
        }
        $headers = [
            "Content-Encoding" => "UTF-8",
            "Content-Type" => "text/csv;charset=UTF-8",
            "Content-Disposition" => "attachment; filename="$filename"",
        ];
        $output =  iconv("UTF-8","GBK",$output);
        response(rtrim($output, "
"), 200, $headers)->send();
        exit;
    }

    /**
     * Remove indexed array.
     *
     * @param array $row
     *
     * @return array
     */
    protected function sanitize(array $row)
    {
        return collect($row)->reject(function ($val, $_) {
            return is_array($val) && !Arr::isAssoc($val);
        })->toArray();
    }
}

安小下同學(xué)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22447.html

相關(guān)文章

  • [爬蟲手記] 我是如何在3分鐘內(nèi)開發(fā)完一個爬蟲的

    摘要:前言開發(fā)爬蟲是一件有趣的事情。的可配置爬蟲是基于的,因此天生是支持并發(fā)的。遵守協(xié)議這個默認是開啟的。的可配置爬蟲降低了爬蟲的開發(fā)時間,增加了爬蟲開發(fā)效率,完善了工程化水平,將爬蟲工程師從日常的繁瑣配置工作中解放出來。 前言 開發(fā)爬蟲是一件有趣的事情。寫一個程序,對感興趣的目標網(wǎng)站發(fā)起HTTP請求,獲取HTML,解析HTML,提取數(shù)據(jù),將數(shù)據(jù)保存到數(shù)據(jù)庫或者存為CSV、JSON等格式,再...

    sushi 評論0 收藏0
  • [爬蟲手記] 我是如何在3分鐘內(nèi)開發(fā)完一個爬蟲的

    摘要:前言開發(fā)爬蟲是一件有趣的事情。的可配置爬蟲是基于的,因此天生是支持并發(fā)的。的可配置爬蟲降低了爬蟲的開發(fā)時間,增加了爬蟲開發(fā)效率,完善了工程化水平,將爬蟲工程師從日常的繁瑣配置工作中解放出來。前言 開發(fā)爬蟲是一件有趣的事情。寫一個程序,對感興趣的目標網(wǎng)站發(fā)起HTTP請求,獲取HTML,解析HTML,提取數(shù)據(jù),將數(shù)據(jù)保存到數(shù)據(jù)庫或者存為CSV、JSON等格式,再用自己熟悉的語言例如Python對...

    YorkChen 評論0 收藏0
  • 日常填坑】ajax請求laravel的api接口

    摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...

    Arno 評論0 收藏0
  • 日常填坑】ajax請求laravel的api接口

    摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...

    neu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<