tohokuaikiのチラシの裏

技術的ネタとか。

PHPの可変長引数について、コンストラクタでそのまま渡せるのか確かめた

要するに、クラスを継承した時に引数の呼び出し方を変えたくないということなんだけど。

親クラスの __constructの引数の実装を知らなくても良いようにしたいということ。

ダメだったケース

<?php
class ArgsP
{
    function __construct(... $args){
        var_dump($args); 
    }
}
class ArgsC extends ArgsP
{
    function __construct(... $args){
        parent::__construct($args);
    }
}
new ArgsC(1, 2, 3);

ってすると、

array(1) {
  [0] =>
  array(3) {
    [0] =>
    int(1)
    [1] =>
    int(2)
    [2] =>
    int(3)
  }
}

ってなってしまった。当たり前やん。

呼び出す時も... を使った可変長引数を使えばO.K

こんな感じ。

<?php
class ArgsP
{
    function __construct(... $args){
        var_dump($args); 
    }
}
class ArgsC extends ArgsP
{
    function __construct(... $args){
        parent::__construct(... $args);
    }
}
new ArgsC(1, 2, 3);

これで結果が

array(3) {
  [0] =>
  int(1)
  [1] =>
  int(2)
  [2] =>
  int(3)
}

ってなる。やった~。

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 = '';
            }
        });
    }
}

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