tohokuaikiのチラシの裏

技術的ネタとか。

LaravelのBladeで生のStringをテンプレートとしてParseする

どんな要望やねん…ていうか、こんな感じですね。 laravel.io

Controllerの中で、

<?php
$foo = 'bar';
$text = view('This is {{$foo}}.')->render();
// $text = 'This is bar.';

結構この手の質問は見かけられるんだけど、どれも5年以上前ので。

ヘルパ関数ひとつ作れっていう回答

こんな感じ laracasts.com

<?php
use Symfony\Component\Debug\Exception\FatalThrowableError;

function render($__php, $__data)
{
    $obLevel = ob_get_level();
    ob_start();
    extract($__data, EXTR_SKIP);
    try {
        eval('?' . '>' . $__php);
    } catch (Exception $e) {
        while (ob_get_level() > $obLevel) ob_end_clean();
        throw $e;
    } catch (Throwable $e) {
        while (ob_get_level() > $obLevel) ob_end_clean();
        throw new FatalThrowableError($e);
    }
    return ob_get_clean();
}

このメソッドは、Controllerに入れておけばいいかな。

で、使う時は

<?php

$blade = 'Hello, {{ $planet }}!';
$php = Blade::compileString($blade);
return render($php, ['planet' => 'World']);

だって。

wpb/string-blade-compiler を使う

良いパッケージがあった。 packagist.org

2014年2月にInitial Commitでまだ開発継続中。

これで何も考えずに composer require wpb/string-blade-compiler して、Configとか不要で

<?php
        $user = Auth::user();
        $x = view(['template' => 'Email => {{$user->email}}'], ['user' => $user]);
//     $x =>  Email => admin@example.com

でいける。うーん、なんかよく動作原理がわからんけど、クソ便利。

LaravelでDateをAPIからPATCHする時

JavaScriptのDate objectが飛んでくるので ミューテタを使って

<?php
    /// 入金日
    public function setPaymentDateAttribute($value)
    {
        $this->attributes['payment_date'] = $value ? Carbon::parse($value)
            ->timezone(config('app.timezone'))->format('Y-m-d 00:00:00') : null;
    }

ってやっていい感じにしてあげないとダメっぽい。えー。面倒…

お名前ドットコムの女の子

このバナーをよく見かけるんだけど、
f:id:tohokuaiki:20210120104008j:plain

これは、PIXTAのこの素材写真のようだ。

pixta.jp

このモデルさんはどういう名前でどういう仕事をしてきたのだろう…

Pangaeaさん(No.1112995)のの写真素材 - PIXTAを見ても、あんまり良くわからないんだよな…5万枚近くあるし…

この素材、

  • 撮影日時 : 2018-07-09
  • アクセス : 3,310

ということで、割と最近なんだな…もっと昔から見てたような気もするけど。アクセス数がこの人の他の写真より10倍くらい多いのでやっぱり結構気にしてる人多いんだと思う。

https://pixta.jp/photo/45036178 この素材も割と使われている。

LaravelのEloquentでDBに登録する時にTEXTなフィールドがNULLでINSERTしようとして困ってしまう件

TEXTフィールドにNULLはダメだよってDBから怒られてしまう。

空文字列にしてくれればいいのに…

ということで、こんな感じで間に合わせ。

<?php
class Post extends Model
{

    protected static function boot()
    {
        parent::boot();
        self::saving(function (Post $post) {
            if (is_null($post->etc)) {
                $post->etc = '';
            }
        });
    }
}

なんかいい方法ないかな…

Laravelの配列をValidateする時の指定とかエラーメッセージの加工とか

JSONで投げられる値で

{
  address: "Tokyo", 
  entries: [
    {name: "", email: ""},
    {name: "", email: ""}
    {name: "", email: ""}
  ]
}

みたいなのをValidateしたい時。

単にVlidateすればいい場合

FormRequestのルールに

<?php
    public function rules()
    {
        return [
            'entries.name' => ['required'],
        ];
    }

と書いておけばいい。

エラーメッセージは

こんな感じ。

<?php
    public function messages()
    {
        return [
            'entries.name.required' => '氏名は必須です。',
        ];
    }

配列のインデックスをエラーメッセージに入れたい場合

上述の場合、

<?php
    public function rules()
    {
        return [
            'entries.*.name' => ['required'],
        ];
    }

と書いてもValidateしてくれる。そして、この指定をした場合にはエラーメッセージに

<?php
    public function messages()
    {
        return [
            'entries.*.name.required' => '氏名は必須です。',
        ];
    }

としておくと、エラーで返ってくるJSON

{ errors: 
    entries.0.name: '氏名は必須です。',
    entries.1.name: '氏名は必須です。',

となる。

このエラーメッセージに配列のインデックスを入れたい場合は、 stackoverflow.com を参考にして

<?php
    public function messages()
    {
        $messages = [];
        foreach ($this->request->get('entries') as $key => $entry) {
            $messages['entries.' . $key . '.name.required'] = . $key . 'の氏名は必須です。';
        }
        return $messages;
    }

としておくといける。