聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

九月 9, 2015

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» JavaScript in 2015

Screen Shot 2015-09-09 at 2.03.34 PM

在這幾年的趨勢看來,JavaScript 已經環繞在各領域了,不管在 Web 前端或後端,上層或下層,都充滿了 JavaScript,其實都是托 Node.js 的福,網路上看到這篇 JavaScript in 2015,裡面講到 JavaScript 所有的工具,不管前端到後端,每一年都有新的工具跟新的 Framework,從以前寫 BackboneAngular.js 到現在 React.js 改變了整個 JavaScript View 的生態,工具流程整合從 Grunt.jsGulp.js 的出現,整個生態又轉換了,大家陸續將工具全都轉到 Gulp,最後又出來一套 Webpack,Webpack 出現基本上不會影響 gulp 發展,因為 Webpack 還是有很多限制,在前端或後端在上 Production 前的一些流程像是 copy 檔案等,這些是 webpack 無法整合的,看到這些工具一一出現,也不知道明年或現在會不會又跑出一套新的玩具,讓整個 JavaScript 生態整個改變。寫上層的同時,看到同事在寫底層,同事就會跑過來拍拍我肩膀說:『好險我是搞 Kernel,搞上層就要跟你們一樣天天追新技術,永遠沒有停止的一天』。看一下全世界 Job Trends

Screen Shot 2015-09-09 at 2.28.21 PM Screen Shot 2015-09-09 at 2.28.28 PM

結論就是,大家快邁向全端工程師,活到老學到老。對於 Grunt 或 Gulp 的基礎介紹可以參考我分享的 Slide:

PS. 圖片來源:JavaScript in 2015

九月 4, 2015

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» Laravel Presenter 在 Controller 的使用

Laravel PHP Framework

Laravel Auto Presenter 是一套用在 view 裡的 decorates objects,搭配資料庫時,如果有需要組合或整合欄位來顯示相關資訊,這套就非常適合使用在 Laravel View 裡,如果不是透過 Laravel Auto Presenter,開發者也可以利用 Laravel Accessors & Mutators 來實現這方法,只是這要寫在 Model 層,寫法如下,此做法寫起來蠻亂的,而且也並不是每個地方都需要擴充這些欄位。

/**
 * The accessors to append to the model's array form.
 *
 * @var array
 */
protected $appends = [
    'is_twitter',
];

/**
 * Get the user's is_twitter flag.
 *
 * @param  string  $value
 * @return string
 */
public function getIsTwitterAttribute()
{
    return (bool) ($this->attributes['options'] & self::$OPTIONS['is_twitter']);
}

如果是使用 Laravel Auto Presenter 則寫法如下

<?php  namespace App\Models\Presenters;

use App\Models\User;
use Illuminate\Contracts\Support\Arrayable;
use McCool\LaravelAutoPresenter\BasePresenter;

class UserPresenter extends BasePresenter implements Arrayable
{
    public function __construct(User $resource)
    {
        $this->wrappedObject = $resource;
    }

    public function isTwitter()
    {
        return (bool) ($this->wrappedObject->info->options & self::$OPTIONS['is_twitter']);
    }

    /**
     * Get the instance as an array.
     *
     * @return array
     */
    public function toArray()
    {
        return [
            'id'        => $this->wrappedObject->id,
            'isTwitter' => $this->isTwitter(),
            'avatarUrl' => $this->avatarUrl(),
        ];
    }
}

但是使用在 Laravel View 裡面都可以正確拿到 isTwitter 欄位沒問題,如果要用在 RESTFul + 前端 ReactJS 的話,則要透過 Laravel Facades 來實現,加上 AutoPresenter::decorate 就可以在 Controller 內使用 AutoPresenter 了。

<?php

use McCool\LaravelAutoPresenter\Facades\AutoPresenter;

class MessageController extends Controller
{
    /**
     * @var Repository
     */
    private $user;

    public function __construct(UserRepository $user)
    {
        $this->user = $user;
    }

    public function index(Request $request)
    {
        $user = $this->user->with('info')->find(\Auth::id());
        $state = collect([
            'user' => AutoPresenter::decorate($user),
        ]);

        return $state;
    }
}

support:

biggo.com.tw

A Django site.