laravel開發中遇到的問題與bug修復的一些總結

php自學中心發表於2021-02-01

文章來自:mp.weixin.qq.com/s/SETCij3kzsCTt1F...
微信學習群:Laravel技術交流群

好記性不如爛筆頭,學習php開發也不能懶,作筆記是一種學習的好習慣!
關注以下公眾號,可獲取兩套視訊教程:【laravel7.x 從入門到核心架構講解】 與 【Laravel高階實戰教程42講】 ,助你提升你的php學習技能。最後祝你學習愉快!
關注公眾號:輕鬆學Laravel

1 禁止全域性csrf認證

app/Http/Kernel.php中,$middleware表示全域性中介軟體,而$routeMiddleware表示針對某個路由的中介軟體,所以只需要把csrf在$middleware中註釋掉,然後在$routeMiddleware中新增'csrf' => 'App\Http\Middleware\VerifyCsrfToken'如果要在某個路由上使用就這樣:

Route::group(['middleware' => 'csrf'], function(){   // csrf保護的介面
  Route::get('/', 'HomeController@index');
}


2 處理上傳檔案

$file = Input::file('upload_file");// 獲取上傳檔案物件
$file->isValid()          // 檢驗檔案是否有效
$file->getClientOriginalName();  // 獲取檔案原名
$file->getFileName();       // 獲取上傳後快取的檔案的名字
$file->getRealPath();       // 獲取快取檔案的絕對路徑
$file->getClientOriginalExtension();// 獲取上傳檔案的字尾
$file->getMimeType();       // 獲取上傳檔案的MIME型別
$file->getSize();         // 獲取上傳檔案的大小


3 手動清理配置快取

php artisan config:cache


4 插入資料的時候出現**MassAssignmentException in Laravel錯誤**

需要給資料表設定可訪問的欄位,在Model裡面:

protected $fillable = array('欄位1', '欄位2');


5 php artisan db:seed出現[ReflectionException] Claxx XXXTableSeeder dows not exist錯誤

這是因為新增加了檔案但是composer沒有感知到,需要先執行composer dump-autoload 定義/修改欄位型別為timestamp時出現錯誤:”Unknown column type “timestamp” requested.” 按照[How do I make doctrine support timestamp columns?]的做法,目前最簡單的方式是直接用DB::statement()來寫SQL語句


6 POST資料的時候出現The payload is invalid

我遇到這個情況是因為在做複雜的表單提交,直接提取X-XSRF-TOKEN的值,但是由於沒有轉移,導致後端token揭祕失敗


7 儲存model的時候出現錯誤:Missing argument 2 for Illuminate\Database\Eloquent\Model::setAttribute()

一般是Model的幾個屬性沒有設正確,檢查這幾個值incrementing/timestamps/primarykey/fillable


8 佇列出現Cannot initialize a MULTI/EXEC transaction over aggregate connections

升級到最新版laravel吧,然後將redis的擴充套件切換到phpredis,laravel5.3之前自帶的predis不支援redis的sentinel,並且有些redis操作強依賴於predis的事務操作,各種糾結,最後都不能成功。或者自己寫類似的中介軟體


9 Class ‘Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory’ not found

偶爾安裝了某些個第三方庫會出現這種么蛾子,可以用這種方式解決composer require symfony/psr-http-message-bridge


10 更新表時出現AH00052: child pid 71 exit signal Segmentation fault (11)

原因可能是沒有設定主鍵而直接在該表上面更新資料,導致ORM不知道到底該更新誰。並且Laravel不支援複合主鍵。這種情況,要麼給該表新增唯一主鍵,要麼只能用where直接更新了。


11 Error while reading line from server

Predis需要設定read_write_timeout=0或者-1,特別是daemon任務,最好設定不超時


12 PHP Fatal error: Uncaught exception ‘ReflectionException’ with message ‘Class log does not exist’ in /Users/freek/dev/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php

出現於5.2版本中,原因是.env檔案中的配置的值,中間存在空格,如果中間有空格,需要將值用雙引號包起來


13 Class env does not exist / Class request does not exist

通常出現在框架還未載入完成就報錯,但是在處理錯誤的時候卻使用了env()/request()這個功能,導致沒有列印真實的錯誤。處理方式,一是不要使用app()->environment('...'),而是檢查.env檔案中是否有錯誤,例如包含空格的值,必須用雙引號包圍。我在自定義ExceptionHandler中遇到過幾次


14 The given data failed to pass validation

認證出錯卻不知道具體錯在哪裡並且狀態碼是500,如果有用Dingo API,那麼注意Request不要繼承use Illuminate\Foundation\Http\FormRequest而應該是use Dingo\Api\Http\FormRequest


15 Call to undefined method setHidden

注意command的主邏輯不是fire而應該是handle


16 啟動時報錯Unknown: failed to open stream: No such file or directory in Unknown on line 0

可能是錯誤地刪除了server.php檔案,可以直接自己寫一個:

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package Laravel
 * @author  Taylor Otwell <taylor@laravel.com>
 */

$uri = urldecode(
  parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
  return false;
}


require_once __DIR__.'/public/index.php';

composer install時報錯: Please provide a valid cache path

需要手動建立快取目錄,在storage/framwork下面新建sessions、views、cache資料夾即可

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章