記錄一個Laravel orm訪問器不起作用的問題

前言

今天碼磚的時候發現laravel orm的訪問器在用户前台死活都用不了,但是管理員後台卻顯示正常,一時間感到很迷亂……

問題原因

經過仔細觀察,原來後台是先查詢然後再通過手工調用對象屬性的方式顯示,前台則是查詢後直接將結果返回給用户。

翻了下官方手冊,orm的訪問器並不是在數據庫查詢的時候起的作用,而是在調用相應的orm對象屬性的時候才會生效。

所以,想用訪問器的話就不要把查詢到的orm對象直接返回給客户了,中間加一層處理就好了。

附加

根據訪問器的工作原理可知,假如數據庫查詢時限制了輸出的字段,那麼在訪問器中被限制輸出的字段是沒辦法用$this->field或$this->attributes[‘field’]來索引的。

Guzzle遇到4xx和5xx的狀態碼時返回異常的解決辦法

前言

寫了個API商城的項目,就是向外收費提供API接口。其中實名認證相關的接口是調用的阿里雲的,他們有個很操蛋的設定——如果認證失敗會返回555狀態碼。要知道5xx可是服務器出錯才會返回的,這種返回值説實話對api調用方不是很友好。我的習慣是,只要接口調用成功就應該返回2xx的狀態碼,然後在返回值裏面加入code字段來標註錯誤碼。

阿里的這種返回方式觸發了Guzzle的異常,很頭疼。

解決辦法

後來耐心翻閲了一下官方手冊,發現可以在new對象的時候加入http_errors=false的選項來禁止Guzzle生成異常。

具體示例代碼如下:

$client = new Client(['http_errors' => false]);
$response = $client->request('GET', 'https://xxx.com/xxx', ['headers' => $post_head, 'form_params' => $post_data]);

結語

實際應用中遇到任何問題可以在評論區留言。我會協助你解決的!

laravel查詢記錄時連關聯表的記錄一同查詢

前言
剛接觸laravel開發框架,一直糾結一個問題:為什麼有時候查詢記錄時會順帶輸出關聯表的內容,有時候卻不輸出?
後來翻官方文檔的時候才知道關聯表默認是懶加載,只有在關聯表數據被調用的時候才會加載出來。為了實現在不調用關聯表數據的情況下默認查詢輸出關聯表數據可以將加載方式改為預加載

預加載的方法
在調用查詢的時候加上with(‘關聯表的函數名’)即可,如:

return User::with('comment')->where('id', $id)->first();

這樣,在輸出user記錄的時候就會默認附帶上和這個用户有關的comment記錄。

homestead環境中使用Laravel Mix報錯的解決方法

報錯信息彙總(解決方案在文章下面)

報錯信息1:
此報錯在執行yarn install命令時彈出

error An unexpected error occurred: "EPROTO: protocol error, symlink '../../../parser/bin/babel-parser.js' -> '/home/vagrant/Code/cloudsystem/node_modules/@babel/core/node_modules/.bin/parser'".
info If you think this is a bug, please open a bug report with the information provided in "/home/vagrant/Code/cloudsystem/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

報錯信息2:
此報錯在執行npm run watch-poll命令時彈出

sh: 1: cross-env: not found
npm ERR! file shnpm ERR! code ELIFECYCLE
npm ERR! errno ENOENTnpm ERR! syscall spawn
npm ERR! @ development: `cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js "--watch" "--watch-poll"`
npm ERR! spawn ENOENT
npm ERR!npm ERR! Failed at the @ development script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:npm ERR!     /home/vagrant/.npm/_logs/2019-06-10T01_49_28_082Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ watch: `npm run development -- --watch "--watch-poll"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ watch script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2019-06-10T01_49_28_139Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ watch-poll: `npm run watch -- --watch-poll`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ watch-poll script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2019-06-10T01_49_28_187Z-debug.log

解決方案

問題1的解決方案:
為命令添加–no-bin-links參數

yarn install --no-bin-links

問題2的解決方案:
步驟一:
修改項目根目錄下的package.json,將`scripts中的內容修改為以下(刪掉原內容粘貼新內容即可):

"dev": "npm run development",
"development": "NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "npm run watch -- --watch-poll",
"hot": "NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"production": "NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"

如圖:
修改後的package.json文件

步驟二:
執行命令

npm run watch --watch-poll

此時Laravel Mix即可成功運行。