Tag: laravel

將 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: failed to open stream: Too many open files

Posted by – April 24, 2015

Office Worker with Mountain of Paperwork公司的 Team 開發的產品也越來越龐大了,API 的部份依賴 Laravel 內建整合的 PHPUnit 來進行自動化測試。

這回從 git repo 上拉了新的 code 後,照慣例跑一下 phpunit,然後就掛了...

PHP Warning: failed to open stream: Too many open files

好像沒見過這樣的訊息。Google 一下才知道是踩到了 Mac OS 檔案開啟上限的地雷。

$ ulimit -a # 這個指令可以看系統限制
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256 # 這行
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

ulimit -n 1024 臨時改為 1024 就可以正常跑完測試了。一時好奇借了同事的電腦看看,都是 Macbook Air (with Yosemite),其他人的 open files 值是 2560 耶,為什麼我的只有 256 ??? 不解。

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,而後者不會。

Change the hostname in Mac OS X

Posted by – September 5, 2014

近期的開發工作是在 Laravel Framework 下進行的,這個 framework 會依系統的 Hostname 來切換環境,在 local 與 production 之間切換,就可以連到不同資料庫之類的設計,這個設計好不好沒什麼感覺,畢竟主要是在 local 下開發。

這個 Hostname 神秘的地方是會因為網路而有差異,這兩天部門的網路有所更動,Hostname 就不一樣,Laravel 碰到不認得的 Hostname 會自動切換回 production,然後就一堆設定掛在那邊 XD

Laravel 的 Hostname 識別可以在 /%laravel_root%/bootstrap/start.php 下設定,但改來改去也挺麻煩的。

 

Mac OS X 修改 Hostname 並不是難事,雖然我並不確定改下去會不會有什麼後遺症...

在 Terminal 下輸入

sudo scutil --set HostName john-macbook-air.local

然後輸入密碼就改完了,不必重開機。

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)$/')

);

搞定。