Category: Laravel

Laravel 4.x WhoopsDisplayer::display() must be an instance of Exception

Posted by – September 28, 2017

有個用 Laravel 4.2 開發的舊專案,近來經常遇到下面這個錯誤

PHP Fatal error: Uncaught TypeError: 
Argument 1 passed to Illuminate\Exception\WhoopsDisplayer::display() 
must be an instance of Exception, instance of ParseError given

找了許多討論都提到是 Laravel 4.x 與 PHP 7 不相容的關係。但我的開發環境有 PHP 5.6 和 PHP 7,似乎前者也有機會發生,十分不解。

每當發生這個 Error 就不會看到真正的 Exception 訊息,debug 十分困擾。

Stackoverflow 上找到一個應急用的解法,可以用在開發環境上....

app/config/local/app.php 的檔案開頭加兩行

set_error_handler(null);
set_exception_handler(null);

暫時搞定了...

將 Sequel Pro 的表導出成 Laravel migration 文件

Posted by – December 23, 2016

Laravel 學院看到一篇有趣的文,筆記下。


将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件

對於用 Mac 的開發者來說頗為實用。Sequel Pro 這款 MySQL GUI 也是我用過最好用、最順手的 DB 管理工具,沒有之一,輕巧高效,可惜支援的 DB 種類不多。

Connection could not be established with host

Posted by – July 19, 2016

最近重灌了工作用的筆電,把開發環境的 PHP 升級到 5.6.10,然後就各種狀況.....

其中一個問題是從本機連不上公司 mail server,所以寄信功能就掛掉了。Laravel log 的訊息如下

local.ERROR: 500 - Connection could not be established with host xxx.com.tw [ #0] @ /
exception 'Swift_TransportException' with message 'Connection could not be established with host xxx.com.tw [ #0]' in laravel/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php:270

原來是因為從 PHP 5.6 開始,變更了 SSL 認證的預設值,verify_peer 與 verify_peer_name 這兩項安全檢查都被改為預設,然後很多 SSL verification 就過不了。雖然提高安全性是好事,但開發環境卻造成一些困擾。

以上述的 swiftmailer 套件為例,它的 SSL 連線是用 stream_socket_client 實現的,其參數設置是透過 stream_context_create 傳入,所以設定方式如下:

$contextOptions = [
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false
    ]
];
$context = stream_context_create($contextOptions);
stream_socket_client(
    $host.':'.$port, 
    $errno, 
    $errstr, 
    $timeout, 
    STREAM_CLIENT_CONNECT, 
    $context
);

如此一來就可以關閉檢查,終於可以連上 mail server 了。收工。

Laravel 5.0: 紀錄 SQL 指令

Posted by – August 22, 2015

在同事轉貼的一些文章裡翻到這篇记录运行时SQL语句,稍微修改一下,在我的 Laravel 5.0 測試站上實作。

文章中的第一步我就傻眼了,因為我的 php artisan list 裡面沒有 make:listener.... More

Laravel 4 all Bar-code generator

Posted by – November 18, 2014

Github 絕對對碼農們的好朋友。

Bar-code generator,這也是一個在 Github 上翻到的實用 Laravel 套件,用來產生 barcode 和 qrcode。

本套件支援的編碼格式相當多元,輸出格式也頗為豐富。

 

Laravel 4 Async Queue Driver

Posted by – November 18, 2014

在 Github 上找到一個有趣又實用的 Laravel 4 套件:Laravel 4 Async Queue Driver

162319-queues-at-apple-shop-in-glasgow-for-iphone-five

Laravel 4 有支援 Queue,但是對小型或是開發中的專案來說,特地去弄一套 Queue Worker 並不是很便利,但是用 Sync Mode 又很浪費時間,因為 Sync Mode 真的要等系統把排程跑完才會繼續執行之後的程式碼....

這時候 Async Driver 就派上用場了。這組 driver 會用子執行緒的方式在背景跑 Queue,雖然是立即執行式 (fire instantly),跟 "Queue" 的理念不太一樣,但已足以應付許多需求。

ps. 圖片與本文無關

Laravel Eloquent – Encrypt/Decrypt Data on call

Posted by – November 3, 2014

在開發商業網站的時候,對資料加密是必要的手段,尤其是資料庫中關於會員隱私,或是商業機密的部份都要特別處理。

在實務上通常不會用資料庫內建的加密功能,而是用後端語言來實現 encrypt 與 decrypt,資料庫只儲存加密後的訊息。

在 Laravel 裡加解密可以透過繼承 Eloquent,用 magic function 來達成自動化。

class BaseModel extends Eloquent {

    protected $encrypt = [];

    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encrypt))
        {
            $value = Crypt::encrypt($value);
        }

        return parent::setAttribute($key, $value);
    }

    public function getAttribute($key)
    {
        if (in_array($key, $this->encrypt))
        {
            return Crypt::decrypt($this->attributes[$key]);
        }

        return parent::getAttribute($key);
    }

    public function attributesToArray()
    {
        $attributes = parent::attributesToArray();

        foreach ($attributes as $key => $value)
        {
            if (in_array($key, $this->encrypt))
            {
                $attributes[$key] = Crypt::decrypt($value);
            }
        }

        return $attributes;
    }

而需要用到加解密的 Model 改繼承 BaseModel,並將需要加密的欄位寫在 $encrypt 陣列中即可。

需要搜尋加密欄位的時候,可以參考以下作法...

$match = User::all()->filter(function($record) use($email) {
            $field = $record->email['email'];

            if(Crypt::decrypt($field) == $email) return $record;
         });

這個作法會 scan table,效率應該會很糟。但 Laravel 預設的加密方式會自動加鹽,相同的明文配相同的金鑰也會產出不一樣的密文,暫時只想到這種解決。

for($i = 1; $i <= 10; $i++)
{
    // 會得到十種結果
    echo "\n". Crypt::encrypt('secret');
}

先醬,想到再補充。

Output Laravel 4 View as String

Posted by – October 16, 2014

覺得 Laravel 這套框架真的有很多眉眉角角的。

這回遇到的是要將 View::make() 的結果當成文字回傳,但 View::make() 回傳的內容似乎是包含 http header 的,無法直接存成純文字。

網路上找到兩種解法,都是官方文件裡沒提到的用法..... #$%^&*

$html = (string) View::make('foo', ['bar' => 'baz']);

$html = View::make('foo', ['bar' => 'baz'])->render();

兩者的差異是前者會遮蔽 Exception,而後者不會。

Trait for validating Eloquent models on save in Laravel 4.2+

Posted by – August 26, 2014

https://github.com/dwightwatson/validating

這個 Laravel 外掛是在同事的程式碼中看到的,花了一點點時間了解,原來是個把 validation 綁定在 model 上的外掛,如此一來就可以在資料寫入資料庫之前自動進行一次 validation,不需要自己手動呼叫驗證程序,只要記得接 Exception 就可以。

安裝方式很簡單,現在 PHP 有 composer 這項神器加持。

開啟 Laravel 專案下的 composer.json,在 require 區段中加入宣告

"watson/validating": "0.10.*

接著執行 composer update 更新套件。

使用方式參考官網的範例。

https://github.com/dwightwatson/validating/blob/0.10/README.md

Issue with Laravel Rules & Regex (OR) operator

Posted by – August 20, 2014

換了新工作後才開始接觸 Laravel 這套 PHP framework,學習的過程碰到不少問題,跟之前慣用的 CodeIgniter 相比,Laravel 引了很多新觀念。

這天在使用 Laravel 內建的 Validation 作表單檢查的時候,發現 regex 規則怎麼寫都不會過..... (怒

規則如下:

<?php

$rule = array(

    'mode' => 'required|regex:/^(typeA|typeB)$/'

);

執行時會一直收到如下的錯誤訊息...

ErrorException
preg_match(): No ending delimiter '\/' found

苦惱了十分鐘後才在文件上看到這段話...

Note: When using the regex pattern, it may be necessary to specify rules in an array instead of using pipe delimiters, especially if the regular expression contains a pipe character.

因為 pipe (|) 衝突的關係... WTF...

所以要改寫成 array 的形式

<?php

$rule = array(

    'mode' => array('required', 'regex:/^(typeA|typeB)$/')

);

搞定。