Laravel5のページジェネレーションでGETのパラメータが引き継げないと焦った件
結論は引き継げます。すでにリリースしててバグだったので焦りました。
同じことでハマる人がいると思うのでメモ。
例えばユーザメッセージの一覧を表示させる場合、コントローラー側で以下のように書きます。(20行づつを1ページとして表示)
$msg_array = Msg::find($user->id)->orderBy('created_at', 'DESC')->paginate(20);
これをView側でページ部分を表示させようとすると以下のように書くのは既存です。
{!! $msg_array->render() !!}
でも、URLがhttp://xxxx.com/msg?toid=yyのようにGETパラメータをついている状態で生成されたリンク先に飛ぶとエラー・・!?
生成されたリンクを見てみると以下のようにできていました。
http://xxxx.com/msg/?page=2
なんじゃこりゃ・・ということでググって見たら日本のサイトが見つからない・・・・
やばいということで英単語で区切ったら海外のサイトで発見
View側を以下のようにしないといけないとのこと
{!! $msg_array->render() !!}
↓
{!! $msg_array->appends(Input::except('page'))->render() !!}
page以外のGETパラメータをアペンドするという形でOKみたいです。
いや、ページジェネレーションの機能が便利すぎて多用してましたがバグを見つけたときは自作しないといけないのかと思いめちゃくちゃ焦りました。良かった♪
3PS ジョブのBookmarkの機能を追加しました
3Dプリンター保有者のジョブ(出力ジョブ)に対して気になるけど、いきなり連絡とるのはちょっとという時のためにブックマーク(お気に入り)に登録できる機能をを追加してみました。
"出力依頼"->"ジョブ検索"->"ジョブ詳細"
ジョブの内容で少し気になる記事があればブックマークに登録して、そのあと吟味した上で連絡を取るなどできます。
ブックマークは最大30個まで保存できます。
登録したブックマークは"出力依頼"->"Bookmark"に登録されます。
次は、少しデザインをもう少しまともなもに修正しようかと思います。ログイン後の画面、冷静に見ればかなりダサいです(><
その次にユーザー間でファイルの出力ファイルの受け渡しができる機能を追加しようかな、出力依頼者が3Dプリンター出力者にファイルを渡す方法が必要になってきますからね。
Laravel Socialiteを利用してFacebook, Twitter, Google+の認証処理を共通化できた
現在、作成している3PS(3Dプリンター共有サービス)はFacebook, Twitter, Google+のアカウントを持っている人であればだれでもご利用できます。 後日ですが各SNSアカウントを持ってなくてもメールアドレス、パスワード登録で独自アカウント作成の機能も追加します。
各SNSのログイン認証の処理はLaravelのSocialiteライブラリを使ってやっています。
Socialiteは各SNSのログイン認証の処理を共通化してほぼ同じコードでやってくれるという凄まじく便利なライブラリです。この3PSのように他のSNSアカウントを利用(寄生?)してるサービスでは神様のようなライブラリです。Socialiteを利用して3社のログイン認証の開発で3時間程度かかったとすると、もしこれが無ければ、10倍ぐらい開発で時間かかったと思います。(各SNSのSDKを落として仕様を理解したりの時間)
で! どんな風に使うといえば
参考にしたサイト
madroom project: Laravel SocialiteでFacebookとTwitterの認証をしてみた
■composerでSocialiteのインストール
composer.json
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "type": "project", "require": { "laravel/framework": "5.0.*", "facebook/php-sdk": "dev-master", "barryvdh/laravel-debugbar": "~2.0", "laravelcollective/html": "~5.0", "intervention/image": "dev-master", "intervention/imagecache": "~2.1" "laravel/socialite": "~2.0", //この行を追加 }, //省略 }
■各SNSのAPIキーを取得
これは各SNSのディベロッパー登録をして取得してください。 省略
■services.phpにAPIキーを登録
app/config/services.php
services.phpに取得したAPIキー、シークレットキーを記述。
redirectには認証後にコールバックされるurlを記述します。
'facebook' => [ 'client_id' => 'xxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'redirect' => url('/facebook/callback'), ], 'twitter' => [ 'client_id' => 'xxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'redirect' => url('/twitter/callback'), ], 'google' => [ 'client_id' => 'xxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'redirect' => url('/google/callback'), ],
■処理部分
routes.php
//Facebookログイン認証のURL Route::get('/facebook', 'FacebookController@getLogin'); //認証後にコールバックされるURL Route::get('/facebook/callback', 'FacebookController@getCallback');
FacebookController.php
ログイン認証時、認証後に実行する処理などを記述する
<?php namespace App\Http\Controllers; use Laravel\Socialite\Contracts\Factory as Socialite; //省略 class FacebookController extends Controller { /** * @var Socialite */ protected $socialite; /** * * */ public function __construct(Socialite $socialite) { $this->socialite = $socialite; } /** * * */ public function getLogin() { //ここで各SNSを設定する return $this->socialite->driver('facebook')->redirect(); } /** * * */ public function getCallback() { //認証後にここがコールバックされます。 $fuser = $this->socialite->driver('facebook')->user(); $fuser->getId(); //facebookのユーザID $fuser->getName(); //facebook上の名前 $fuser->getEmail(); //メールアドレス //あとはお好きに!! //facebookのIDと自分のサービスのユーザIDを紐づける処理などを記述してください $user = User::where('app_id', $fuser->getId())->first(); if(!$user) { //自分のuserテーブル登録されていないユーザなので新規ユーザ //ユーザ登録の処理 } else { //facebookのIDからユーザアカウント(自分のサービス)を取得できたのでログインの処理をする //ログイン Auth::login($user); } } }
3PS ここ2日の作業
最近起きている時間は散歩か3PSの開発をおこなっています(><
- ユーザのメールアドレスを設定できるようにしました。
設定->プロフィールでユーザのメールアドレスを設定できるようにしました。
メールアドレスを設定していただくと3PS上でユーザ間のメッセージ受信で自分のメールアドレスに通知が届きます。
既存のSNSなどの仕様同様、メールアドレス変更時は3PSからの自動送信メールに繋れているURLにアクセス後にメールアドレスが正式に変更となります。メールアドレスの削除時にはこの作業は必要ありません。
メールサーバの設定とLaravel側の設定で結構はまった・・・
- ユーザの3Dプリンターのジョブ(できること)に対してコメントをかけるようにしました。
3Dプリンターの保有者は自分の保持している3Dプリンターでできること(ジョブ)を作成します。
このジョブは全ユーザから閲覧可能になります。
例えば、”1時間あたりでXXX円で3Dデータを出力します””XXXX社の3Dプリンターでサンプル品を出力します”など、 このジョブに対して一般ユーザ(ログインユーザ)が自由にコメントをできるようにしました。
現在の仕様では全コメントはジョブの保有者が承認して一般公開になります。
3PS (3Dプリンター共有 サービス)
2日ほど前にレンタルサーバからVPSに移行して、しばらくはこれで運用していこうかと思います。
周りにほとんど告知していないので、まぁそこまでアクセスが増えることもないと思います。
改めて3PSの自己紹介。
- サービスの目的
物づくりを楽しむための応援サイト
3Dプリンターをユーザ間で共有してローコストで3Dデータの出力が可能になれば面白いと思っています。
- 今後の課題など
まだ出来立てのほやほやで自分の思ってる機能の2割程度しか実装していません。なんせ3PS内で受信したメッセージをユーザにメール通知する機能すらないです。
■課題のリスト
・メール通知機能(メールサーバの構築)
・マニアルの作成
・ユーザ間での3Dデータ共有(転送)
・出力場所を地図に表記する(希望者のみ)
近場で空いてる3Dプリンターユーザとマッチングできれば当日納品とかも可能になる
・コミニティーの充実
・ユーザ作品のギャラリー作成
・デザイン
これはセンスがな無いのでどうしようかホントに困ってる
・サーバ周りの諸事情
個人間で3Dプリンターを共有できるサービスがあれば面白い
2,3週間前ですが、Zortrax M200を購入して届いた翌日にふと考え事してて
こんな30万もする3Dプリンターみんなが買えるもんじゃないし、持ってる人と使いたい人が個人間で3Dプリンターを共有したら面白いんじゃないかなと思い。 開発してみることにしました。
とりあえず名前は即席で3PS。 3D Printer sharing(3Dプリンター共有 サービス) 絶対ドメイン取れないだろうなおもってたら案の定空きはなし。 とりあえず 3ps-net.com(商用じゃないけど・・) で取得。 正直あんまりドメインにハイフン入れたくはなかった。
サービス的には基本は利用ユーザ任せですが、3Dプリンターの保有者と3Dプリンターを持ってないけど3Dデータを出力したい人をマッチングさせる感じです。もちろん、3Dプリンターの保有者はタダで出力をする事はないと思うので出力費用はユーザ間で決めてもらう考えです。
趣味の個人レベルの3Dプリンター保有者からすれば、使ってる時間より空いてる時間が多いはずなので、安値でもお小遣い稼げたらうれしいと思います。 上手くマッチングすれば出力希望者も安く3Dデータの出力ができると思います。
現在作りかけのサイトイメージはこんな感じです。
Facebook、Twitterアカウントがあればだれでも登録が可能です。
メリット、デメリットはひいき目にみてこんな感じかな
■メリット(3Dプリンター保有者)
・3Dプリンターを使っていない時間を有効に使える
・出力価格はユーザ間で自由に決めることができる。
■メリット(出力希望者)
・出力価格はユーザ間で自由に決めることができる。
・3Dプリンター購入前のサンプル出力品をGETすることができる。
・保有者の出力場所(おおよそ)を地図に登録すれば、近場の保有者を検索して当日納品とかも可能
■デメリット
・低価格の3Dプリンターは出力者のメンテや腕でクオリティが多少左右する。
・機密保持などに関する出力品は難しい(正式な出力サービスを利用してください)
3Dプリンターの保有者と出力希望者間でネットワークができれば面白いサービスになりそうな気がします。
とりあえずこのブログ書いてるのは作り始めて3週間ほどたった後です。
まだ細かいバグはあると思いますが初期α版としリリースしたいと思います。
バグについてはご理解をお願いいたしますm(_ _)m
3Dプリンターでおしゃれなコイン置きを出力してみた。
最近いろいろとコーディングが急がしくて、せっかく買ったZortrax中々つかえなく残念。
お出かけ前にフリーのデータでおしゃれなコイン置きを見つけて出力してみました。
曲線や直線の積層はホント綺麗に出力されます♪