Ich habe hunger

あふりかエンジニア、アフリカ向けのB2BのSaaSを開発する

Laravel4でCodeSleeve/laravel-staplerのコマンド「stapler:refresh」が実行出来ない件

問題

このLaravel4で開発をしていて、画像アップロード系の処理にstaplerを使ってます。

で、デザインが大きく変わったことで、今のデザインに合わせると、画像が必要な幅よりも小さくなってしまって、画像が粗くなってしまってます。つまり、必要となる画像の大きさが200x200ぐらいからmin-widthが300ぐらい必要になりました。

対処策

1. 新しいサイズを追加する
large => 200x200となっていたところに
xlarge => 300x300を追加。
表示する時にxlarge -> large -> noimageの順に条件分岐させて表示。

2. 既にあるファイルを変換する
アップロードされた画像ファイルはoriginalディレクトリに
元ファイルが入っているので、もう一度全部変換し直す。(方法は知らん)


という2点考えました。

出来れば、現在のコードを変えなくて済むし、今後のデザイン変更にも柔軟に対応出来そうな後者でいきたいと思って調査してました。


CodeSleeve/laravel-stapler · GitHub

見つけたのが、laravel-staplerのREADMEにrefreshコマンドを見つけました。これは、指定したModelの最新の設定に合わせて画像を再生成(reprocess)してくれるというコマンドでした。

問題発生

しかし、いざコマンドを実行してみると、

  [Codesleeve\LaravelStapler\Exceptions\InvalidClassException]
  Invalid class: the Article class is not currently using Stapler.

みたいな感じでエラーが・・・(´・_・`)

	public function refresh($class, array $attachments)
	{
		if (!method_exists($class, 'hasAttachedFile')) {
			throw new InvalidClassException("Invalid class: the $class class is not currently using Stapler.", 1);
		}


		$models = App::make($class)->all();

		if ($attachments)
		{
			$attachments = explode(',', str_replace(', ', ',', $attachments));
			$this->processSomeAttachments($models, $attachments);

			return;
		}

		$this->processAllAttachments($models);
	}

ImageRefreshService.php内の
初めの!method_existsの条件分岐で
エラーを吐き出してるらしい。


hasAttachedFileという名のメソッドでstapler
が読み込まれてるかを判定しているけど、
実際にはモデル内でしっかりこやって使ってるんだけどな・・・(´・_・`)

	public function __construct(array $attributes = array())
	{
		$this->hasAttachedFile('figure', [
			'styles' => [
				'small'  => '50x50',
				'medium' => '100x100',
				// 'large'  => '600x600',
				'large'  => '200x200',
				'xlarge'  => '600x600',
			],
			'default_url' => null,
		]);

		parent::__construct($attributes);
	}

結果としてどうなったか

結論としては、このエラーに関しては何も解決してないです。
うーん、hasAttachedFileメソッドはあるはずなので、
ImageRefreshService.phpでrefreshメソッドを呼ぶ時に
1. classを読み込めてない
2. classを読み込めてはいるが、メソッドをうまく貼付けれていない
のどちらかなー、という感じです。

うーん、もう少し頑張ってみよう。

追記

class_existsメソッドで呼び出したclass調べてみたら、ないって言われた・・・(´・_・`)
さてどうしたものか。

解決!

stapler:refreshの引数はclass名を入れるんだけども、普通にArticleモデルを呼んでもダメだった。その原因が、nameスペース使ったりとかしてて、Tabitatsu\Models\○○というような構成で普通にArticleだけ呼んでもダメだった。

よく考えたらそうなんだけども、きちんと$classだけでclass呼び出せるようにしてあげる。

php artisan stapler:refresh Tabitatsu\\Models\\Article

普通ならTabitatsu\Models\Articleで良いんだけども、
\は特殊文字なので\\と重ねてあげないといけない。

危うく、compoaserで入れてるプラグインの中いじって無理矢理やるところだった。
というか、一回やった後の解決なんだけども・・・(´・_・`)