用Laravel實現後臺網站(初期)遇到問題及解決方法記錄

虛擬機部分

homestead配置訪問名稱

[windows]下首先修改C:\Windows\System32\drivers\etc\host,將虛擬機IP與指定的名稱綁定。

192.168.10.10 news.test

然後修改homestead.yaml(在安裝文件夾下),綁定域名到特定項目的public文件夾。

sites:
    - map: news.test
      to: /home/vagrant/Code/20190108bg-laravel/public

Laravel框架部分

遷移數據庫和測試數據生成

遷移數據庫
php artisan make:migration xxx //用Blueprint實現字段定義,要注意區分新建和修改,其它參看文檔
測試數據生成

首先定義數據庫模型(model),即需要填充操作的數據庫

php artisan make:model xxx  // 注意此處定義的名字的複數形式會被作爲表名,可以在模型內更改

構造生產函數

php artisan make:factory xxx    //生產函數內部使用Faker實現字段填充

將生產函數添加到默認seedDatabaseSeeder

public function run() {
    factory(\App\Article::class, 500)->create();    //500爲生成數量
}

或是新建一個seed

php artisan make:seed xxx
public function run() {
    $this->call(UsersTableSeeder::class);   // 詳情文檔
}

啓動seed

php artisan db:seed

模型內部常用的定義

在模型內部的定義會影響到後續使用該模型操作的數據庫結果,定義在模型類當中。

使用軟刪除,啓用後會創建默認字段deleted_at,當模型類對數據調用delete刪除時,自動創建當前時間,否則該字段爲null,此外開啓該字段以後框架會在所有使用該模型類的sql操作末尾加上條件wheredeleted_atis null

use SoftDeletes
protected $dates = ['deleted_at'];

修改軟刪除的字段名方式,此處注意遷移數據庫需與此處一致,如果更改後上述第二條定義也需要一致。

const DELETED_AT = 'isDelete';

棄用自動創建created_atupdated_at字段(默認開啓)

public $timestamps = false;

所使用的路由定義方法總結

Laravel框架的路由定義位置在/routes/web.php中,用到的方式如下:

閉包方式:

Route::get('/', function () {
    return redirect('/news');
});

控制器方式:

Route::get('/news', 'NewsController@index')->name('news.home');     //name爲別名,後續可以使用框架提供的route()方法訪問

路由分組:

Route::name('form.')->prefix('form')->group(function () {
    Route::post('add', 'RequestController@add')->name('add');   //統一處理前綴爲/form的路由,此處的name會自動和分組name合併
    Route::post('modify', 'RequestController@modify')->name('modify');
}

三種常用的操作數據庫的方式

原生語句:

use Illuminate\Support\Facades\DB;
DB::statement('sql');   // 原生操作方式不會使用模型類中的定義

查詢構建器方式:

use Illuminate\Support\Facades\DB;
DB::table('table_name')->xxx();      // xxx爲方法名,具體參考文檔,此處不會調用模型類中的定義

Eloquent方式:

use \App\User;  //定義的模型類 
DB::all()->xxx();   //使用eloquent都會調用模型類中的設定,除了不用手動指定表外可以直接使用查詢控制器的方法。

Laravelblade中提供訪問特定變量的方法

訪問config中配置的變量:

config(xxx.val_name);   // xxx爲文件名,後者爲變量名       

訪問url:

url("path")     // path可以是路由中定義的相對路徑,會自動解析爲絕對路徑

asset("path")   // 常用來引用靜態文件,位置固定

route("name")   // name爲路由中定義的別名,會自動解析

軟刪除的使用方法

軟刪除首先在模型類中棄用,並在遷移文件中配置相應的刪除字段,最後調用時用模型類的刪除即可。

$flag = $article->delete();     // 此處一定是通過模型類調用

怎麼設置時區

時區的設定位置在config/app.php

'timezone' => 'Asia/Shanghai',  // 默認UTC

利用post方法提交返回419錯誤

Laravel框架中處於安全會處理跨站攻擊,需要在表單中添加語句

<form>
    <!--...-->
    <input type="hidden" name="_token" value="{{ csrf_token() }}"/>
</form>

PHP部分

給數組添加一個值

直接賦值:

arr_name['xxx'] = value;

利用foreach給數組循環賦值

循環賦值時注意不能對as後的值進行修改,這樣最後不會被保存,一定要把修改保存到傳入的變量中

foreach ($res as $key=>$val) {
    $res[$key]["xxx"] = $your_value     // 賦值給原$res
}

如何判斷_GET或其它數組是否存在及其中某個元素是否存在

if (is_array($_GET) && count($_GET)>0) {    // 藉助is_array count檢查數組情況
    if (isset($_GET['c_sort'])) {   // 用isset判斷變量是否存在
        // 
    }
}

Mysql部分

怎麼更新作爲查詢條件的字段

藉助臨時表完成:

DB::statement('CREATE TABLE `temp` AS (SELECT * FROM `articles` WHERE `category_id`= ?)', [$cid]);
DB::statement('UPDATE `articles` SET `category_id`=1 WHERE `id` IN (SELECT `id` FROM `temp`)');
DB::statement('DROP TABLE `temp`');

前端html css js部分

點擊一個按鈕觸發另一個按鈕或者文本框的方法

phpecho打印alert後再跳轉到頁面出現字體變大,css失效問題

此處的問題是alert彈出後打斷了單線程的js和css加載,導致後面出現問題。如果只是想跳回之前的老頁面,可是使用history.back()

echo "<script>alert('分類 ' + $name + ' 已存在!');history.back();</script>";

防止回車鍵提交表單

在表單中加入以下js代碼:

<form method="post" onkeydown="if(event.keyCode==13)return false;" action="" id="listform">

對同一個表單不同的提交按鈕執行不同的動作

在按鈕對應的js代碼中替換原來的action動作:

document.getElementById("listform").action = "{{ route('form.delete') }}"
document.getElementById("listform").method = "post";
$("#listform").submit();

通過回車鍵提交表單內的一個特定的input

未實現

其它

grep精確匹配的用法

du -h | grep -nw 'log'  // n顯示行數,w實現精確匹配

總結

第一次用PHP搭建後臺,之前僅僅是把Laravel教程得代碼複製粘貼,雖然能跑,什麼都不懂。這次借用前端模板,先是用純PHP實現了一遍,然後用Laravel實現了一遍,感觸還是挺多。分別講述體會總結如下:

PHP實現:

現階段的體會就是雖然實現了,面向對象的思想完全沒有啊,基本都是走一步是一步。但就像之前說的一樣,如果過程都不熟悉,哪裏談得上對象。而且目前都沒有複雜的邏輯,整體的一個交互構造就是:前端->後臺->數據庫

利用Laravel框架的實現:
框架的使用總結如下,主要有以下幾個部分:

  • artisan常用命令使用
  • config的配置和使用
  • 路由-控制器(web-controller)
  • 數據庫模型model
  • 數據庫遷移(migration)
  • 隨機數據生成(seed factory)
  • blade模板的基本使用

總體來說其實萬變不離其宗,核心還是有***前端->後臺->數據庫***三部曲,這裏還外加一個***路由***,不過之前這三部曲都是自己來寫,現在都變成了對框架的調用。前端使用了blade模板,resourcespublic文件夾。數據庫可以選擇原生DB操作,查詢構造器操作,Eloquent三種方式來操作,至於後臺邏輯通常和路由結合在一起編寫,目前我的邏輯都寫在了控制器裏面,對於後期應該還要引入一個服務的概念。

此外還有一些通用的新的,比如說對PHP語法的熟悉以及前端三件套的代碼能基本讀懂,能更具自己的需求做一個簡單的定製等等。

當然最重要的一點是越發感覺到了,單純意義上的編碼真的算不得是一個技術活。有時候知道解決思路和最優解決方法更多基於經驗和理論功底,往往實際上手發現某個方法不會那都是可以百度!谷歌!的呀!!!所以在一定程度上,思想和理論深度佔據指導地位啊!至於語言,寫着寫着,你閉着眼睛都會了,就和用筷子碗吃飯一個意義,但是前提是一定要用,看是看不出花來的,哪怕有時候看出花兒了,一上手丫的全是刺兒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章