ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

Laravelの自作コマンドで引数を取得する

自作コマンドを作成してみた。

php artisan command:make testFutari --command=test:futari


上記コマンドで生成されたソースにfire()とgetArguments()とgetOptions()の中身を追記した。

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class testFutari extends Command {

  /**
   * The console command name.
   *
   * @var string
   */
  protected $name = 'test:futari';

  /**
   * The console command description.
   *
   * @var string
   */
  protected $description = 'Command description.';

  /**
   * Create a new command instance.
   *
   * @return void
   */
  public function __construct()
  {
    parent::__construct();
  }

  /**
   * Execute the console command.
   *
   * @return mixed
   */
  public function fire()
  {
    print 'example = ' . $this->argument('example') . "\n";
    print 'optional = ' . $this->option('optional') . "\n";
    print 'none = ' . $this->option('none') . "\n";
  }

  /**
   * Get the console command arguments.
   *
   * @return array
   */
  protected function getArguments()
  {
    return array(
      array('example', InputArgument::REQUIRED, 'An example argument.'),
    );
  }

  /**
   * Get the console command options.
   *
   * @return array
   */
  protected function getOptions()
  {
    return array(
      array('optional', '-o', InputOption::VALUE_OPTIONAL, 'An example option.', null),
      array('none', null, InputOption::VALUE_NONE, 'An example option.', null),
    );
  }

}


そしてコマンドを実行したらこんな結果になった。

$ php artisan test:futari aaa -o bbb --none
example = aaa
optional = bbb
none = 1

ちなみにソース上でコマンドを実行する時は以下のように書く。

Artisan::call('test:futari', [
  'example' => 'aaa',
  '-o' => 'bbb',
  '--none' => true
]);

Laravelのソース内でArtisanコマンドを使う

Laravelのソース内でArtisanコマンドを使う。

Artisan::call('mybench:mycommand');

引数付きで使う例。

Artisan::call('mybench:mycommand', ['year' => 2014]);

引数付きで使う場合、自作コマンド側の引数受け取り部分はこうなる。

/**
 * Get the console command arguments.
 *
 * @return array
 */
protected function getArguments()
{
  return array(
    ['year', InputArgument::OPTIONAL, '年']
  );
}

Laravelでラジオボックス

Laravelでラジオボックスの情報を取得したときのメモ。

Blade側

@foreach($comments as $comment)
<div class="inline-group">
<label class="radio">
  <input type="radio" name="priority_{{ $comment->id }}" value='abc'>
  <i class="rounded-x"></i>abc
</label>
<label class="radio">
  <input type="radio" name="priority_{{ $comment->id }}" value='efg'>
  <i class="rounded-x"></i>efg
</label>
<label class="radio">
  <input type="radio" name="priority_{{ $comment->id }}" value='hij'>
  <i class="rounded-x"></i>hij
</label>
</div>
@endforeach

コントローラー側。

$inputs = Input::all();

foreach ($inputs as $key => $value) {

  if (strpos($key, 'priority_') !== FALSE) {

    $id = str_replace('priority_', '', $key);

    $comment = Comment::find($id);

    $comment->priority = $value;

    $comment->save();
  
  }

}

WindowsにComposerをインストールする

以前手動インストールの方法を書いたので今度は自動インストール。


ComposerをWindowsに手動インストール - ふたりはララベル (Laravel PHP Framework)

Composer-Setupをダウンロードして実行する。以下の画面でphp.exeのパスを指定するだけ。
f:id:laravel:20150102111503p:plain

これで完了。以下のコマンドでバージョンが出てきたら成功している。

composer -V

Laravel5のスタート画面の格言たち

Laravel5のスタート画面では、格言がランダムで表示されるようになった。↓白くて薄い!
f:id:laravel:20141217004523p:plain

どうやって表示しているのだろう?と思ってtemplateの内容を見てみたら

Inspiring::quote()

というメソッドが格言を表示していた。ソースを追ってIlluminate\FoundationのInspiring.phpを開いたら「ユングフラウヨッホ山(標高3500M)にいるときにコミットしたわー」とLaravel作者のコメントが書かれていた。コミットした物理的な場所を書くのは珍しいな。

ちなみに表示される格言は以下のとおり。

When there is no desire, all things are at peace. - Laozi

「欲を持たなければ、全ては安らかとなる - 老子」 中国語だと「不欲以静 天下将自定」なので英語とはちょっと意味が違いますね。

Simplicity is the ultimate sophistication. - Leonardo da Vinci

「単純さは洗練の極みである レオナルド・ダ・ヴィンチ」 これは日本でも有名な格言です。

Simplicity is the essence of happiness. - Cedric Bledsoe

「単純さは幸福の本質である セドリック・ブレッドソー」 セドリック・ブレッドソーって誰?

Smile, breathe, and go slowly. - Thich Nhat Hanh

「笑い、呼吸をすることで、穏やかに生きる ティク・ナット・ハン」 ベトナムの坊さんの格言。この場合の「呼吸」は生理現象じゃなくて瞑想するときなんかの精神的な呼吸ですね。

Simplicity is an acquired taste. - Katharine Gerould

「単純さは獲得されるものである キャサリン・ジェロールド」 エッセイストらしい。この「単純」は「複雑さの対義語」です。

注目すべきなのは、半分以上の格言の主語が「Simplicity(簡素、単純)」であること。日本語の「単純」はネガティブなイメージがあるけど、Inspiring::quote()の「単純」はとてもポシティブだ。

私も仕事で「これ、プログラムで何とかなりませんか?」としょっちゅう依頼される。殆どの場合、依頼者たちは私が呆れるほど仕様を複雑に考えている。私が問題を解決すると「さすが!」と評価されるけど、私の頭が良いわけじゃない。プログラミングしているうちに物事をシンプルに捉えるクセが自然に身についただけだ。逆にネット上には私が悩んでいたプログラミング上の問題をシンプルに解決する解答ばかりだ。
単純であればあるほど論理的になっていく感覚はもっと広まっていいと思う。

そしてSimplicityを目指しているというLaravel5が楽しみだ。

ところでInspiring::quote()はネタにできそうな機能だ。フレームワークに疲れた心情を表現してみた。
f:id:laravel:20141217005511p:plain

Pycharm上でプログラムが実行できなかった

Pycharm上でプログラムが実行できなかった。調べたらpython interpreterの設定が「None」になっていた。何も設定しないとそうなるのかよ。
Python.exeを指定したら動いた。

LaravelのEloquentで複数条件を指定する

Eloquentのwhereメソッドは重ねることもできる。

Title::where('type', '=', $type)->where('rank', '>', '100')->get();

「orWhere」というのもある。

Title::where('type', '=', $type)->orWhere('rank', '>', '100')->get();

Pydio vs Owncloud

ファイル管理のためのソフトが欲しかったけど、PydioとOwncloudのどっちが便利か悩んで決められなかった。だから両方ともサーバに入れてみた。

ところがOwncloudはちょっとバージョンアップしたらぶっ壊れてしまった。Pydioは5.2から6.0のバージョンアップもマウスクリックだけで無事終了。今後はPydio一本で行こう。でもPydioのAndroidクライアントの使いにくさはなんとかしてほしい。

Perlでn次ハッシュを使った時のメモ

Perlでn次ハッシュを使った時のメモ

use strict;

use warnings;

my %hash;

my @array1 = ('1','2','3');

my @array2 = ('a','b','c');

my @array3 = ('A','B','C');

foreach my $value1 (@array1) {

	foreach my $value2 (@array2) {

		foreach my $value3 (@array3) {

			push(@{$hash{$value1}{$value2}},$value3);

		}

	}
}

foreach my $key1 (keys(%hash)) {

	my %hash2 = %{$hash{$key1}};

	foreach my $key2 (keys(%hash2)){

		foreach (@{$hash{$key1}{$key2}}) {

			print "$_ ";

		}

	}
}

出力結果は

A B C A B C A B C A B C A B C A B C A B C A B C A B C

あんまり意味ないな。

4つの言語の感想

書くネタが無いので。

Perl → 昔は大好きだったけど、古くなりすぎた気がする。
Python → 楽しい。Pycharmエディタが便利。でもPython3の情報をググって読むのは大変。
PHPCMSとLaravel使うときだけ。
Ruby → 便利そうだけど覚える気はない。

Eloquentを使ってfindの前後を取得する

Eloquentを使ってfindの前後を取得するテクニックがあった。
How to get previous / next records in DB with Eloquent. (Page 1) / Laravel 3.x Code Samples / Laravel Forums

なるほど、モデルにそういうメソッドを追加すればいいのか。

idだったら上記のテクニックでOKだけど、id以外の要素だと工夫が必要だね。

public function get_next()
{
  return static::where('votes', '<', $this->votes)
    ->where('subject', $this->subject)
    ->orderBy('votes','DESC')
    ->first();

}

public function get_previous()
{
  return static::where('votes', '>', $this->votes)
    ->where('subject', $this->subject)
    ->orderBy('votes','DESC')
    ->first();
}

LaravelのEloquentでID値が指定できない

下記のようにidを指定してcreate()しても、指定した数ではなくて通番になっていた。

$name = Name::find(4);

Title::create(['id' => $name->id])

モデル上でidを保護しているのが原因だった。

<?php

class Title extends Eloquent {

  protected $guarded = ['id'];

モデルの保護を全消したら想定通りの動作になった。

<?php

class Title extends Eloquent {

  protected $guarded = [];

さくらのレンタルサーバにLaravel4.2をインストール

以前にも似たエントリ書きました。 さくらのレンタルサーバにLaravelをインストール - ふたりはララベル (Laravel PHP Framework)

以前との違いは

です。

インストールディレクトリを決める

今回は以下のフォルダに作ることにしました。

/home/mysakura/source

Composerをインストールする

例によってレンタルサーバにComposerをインストールする - ふたりはララベル (Laravel PHP Framework)を参照してください。composer.pharの置き場所は/home/mysakura/sourceです。

laravelをインストールする

以下のコマンドを実行すればインストールが始まります。

php composer.phar create-project laravel/laravel myproject --prefer-dist
Installing laravel/laravel (v4.2.11)
  - Installing laravel/laravel (v4.2.11)
    Downloading: 100%

Created project in myproject

シンボリックリンクを貼る

publicフォルダにシンボリックリンクを貼ります。

ln -s /home/mysakura/source/myproject/public/ /home/mysakura/www/myproject

ここでhttp:://mysakura.jp/myprojectにアクセスしてもまだエラーが出ます。

htaccessを編集する

htaccessのパスは

/home/mysakura/source/myproject/public/.htaccess

です。
「Options -MultiViews」の行をコメントアウトしてください。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        #Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

これでhttp:://mysakura.jp/myprojectにアクセスすればLaravelのアイコンが出ます。