こなさんち

しがないフリーランスエンジニアの備忘録。

カスタム関数をエイリアス使ってしまおうぜ。 @laravel5

以前、こんな記事を書きました。↓

cresta522.hateblo.jp

これは確かに手段としてあるが、 Laravelチックではないな…と反省。

だったら もう少しLaravelチックに書こうじゃないかと。

上記記事と比べてみてください。

1. /app/lib/CostomHelper.php

ファイル名は適当で良いです。

<?php

namespace app\lib;

class CostomHelper
{

    /**
    * Create link tag element for css
    * 
    * @param   string  $file_name
    * @param   bool    $secure = false
    * @return  string  link_tag
    */
    public static function asset_css($file_name, $secure = false){
        if (is_array($file_name)) {
            $tag = '';
            for ($i = 0; $i < count($file_name); $i++) {
                $relative_file_path = '/css/' . $file_name[$i] . '.css';
                $tag .= self::make_tag($secure, 'link', $relative_file_path, ['rel' => 'stylesheet']) . PHP_EOL;
            }
        } else {
            $relative_file_path = '/css/' . $file_name . '.css';
            $tag = self::make_tag($secure, 'link', $relative_file_path, ['rel' => 'stylesheet']);
        }
        return $tag;
    }
    
    /**
    * Create link tag element for javascript
    * 
    * @param   string  $file_name
    * @param   bool    $secure = false
    * @return  string  script_tag
    */
    public static function asset_js($file_name, $secure = false)
    {
        if (is_array($file_name)) {
            $tag = '';
            for ($i = 0; $i < count($file_name); $i++) {
                $relative_file_path = '/js/' . $file_name[$i] . '.js';
                $tag .= self::make_tag($secure, 'script', $relative_file_path, ['type' => 'text/javascript']) . PHP_EOL;
            }
      
        } else {
            $relative_file_path = '/js/' . $file_name . '.js';
            $tag = self::make_tag($secure, 'script', $relative_file_path, ['type' => 'text/javascript']);
        }
    
        return $tag;
       
    }
    
    
    /**
    * Create link tag
    * 
    * @param   string  $tag_header
    * @param   string  $relative_file_path
    * @param   string  $attr = ''(array)
    * @return  string  script_tag
    */
    public static function make_tag($secure, $tag_header, $relative_file_path, $attr = '')
    {
        $file_full_name = asset($relative_file_path, $secure);
        $abs_file_path = public_path($relative_file_path);
        $timestamp = filemtime($abs_file_path);
        
        $tag_attr = ' ';
        if(is_array($attr)){
            foreach ($attr as $key => $value) {
                $tag_attr .= $key . '="' . $value . '" ';
            }
        } else {
            $tag_attr .= $attr;
        }

        switch ($tag_header) {
            case 'link':
                $tag_file_name = ' href="' . $relative_file_path. '?' . $timestamp . '" ';
                $tag_end = '';
                break;

            case 'script':
                $tag_file_name = ' src="' . $relative_file_path . '?' . $timestamp . '" ';
                $tag_end = '</' . $tag_header . '>';
                break;
        
            default:
                $tag_file_name = '';
                $tag_end = '';
                break;
        }
    
        $tag_begin = '<' . $tag_header . $tag_file_name . trim($tag_attr) . '>';
    
        $tag = $tag_begin . $tag_end;
    
        return $tag;
    }
    
}

2. config/app.php

追記するよ

'aliases' => [
        
        ...
              
        // Custom Function
        'CostomHelper' => 'app\lib\CostomHelper',

    ],

こんな感じで使うよ

use 宣言しても良かったかも。

 <head>
   <meta charset="utf-8">
   <title>@yield('title')</title>
   <link rel="stylesheet" href="/assets/css/style.css">
   {!! App\lib\CostomHelper::asset_css(['app', 'semantic.min']) !!
   {!! App\lib\CostomHelper::asset_js(['jquery.min', 'semantic.min', 'app']) !!}
 </head>

おいroutes.php どこ消えたんや。@Laravel 5.3~

お疲れ様です。

プロジェクトによって、Laravel5.4 を実装してみました。

大きく変わったことの一つとして、routes.phpの場所ですね。

今までは、

app/Http/routes.php

にありました。

ただ、5.3からは。。

routesというディレクトリが作られました。 その中に、ウェブ用の

routes/web.php

があったりと、インターフェース別にファイルが制作されております!

便利です!!

詳細は以下。ありがとうございます!

atuweb.net

独自Validation作っちゃお☆@Laravel5

お早うございます。 安定剤のせいで体調不良な空瓶です。

動機

LaravelのValidationってめっちゃ便利!でも変に組み合わせると見にくいし可読性に欠けてしまう。
→自分で作れるんやない?

概要

他サイトやQiitaにて似たような記事はありますが、備忘録も兼ねてまとめておきます。

1.既存のValidaterを継承したクラスの作成
2.Providerの定義と登録
3.使用

1.既存のValidaterを継承したクラスの作成

場所は任意です。
今回は app/Validator を作成して、その中に作ります。
(ディレクトリ名称を[Valdiators]にしようか迷いましたが、中身は1つだけなのでいいかな..複数作る予定もないし。)

<?php

namespace App\Validator;

class CustomValidation extends \Illuminate\Validation\Validator
{
    public function validateCodeStringCheck($attribute, $value, $parameters)
    {
        if (ctype_alnum($value)) {
            if (ctype_alpha(substr($value, 0, 1))) {
                return true;
            }
        }
        
        return false;
    }
}

この関数名ですが、[validate]はプレフィックスになっており、[codeStringCheck]というValidation名として使用します。
また、エラーメッセージの使用はValidation名をスネークケースにして使用します。(サンプルは後ほど。)

2.Providerの定義と登録

php artisan make:provider ValidatorServiceProvider でProviderを作りましょう。atisanに頼ります。

そして、config/app.phpに追加します。

<?php
...
'providers' => [

        ...
        
        App\Providers\ValidatorServiceProvider::class, // custom

    ],

3.使用

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CompanyRequest extends Request
{
    /**
    * Determine if the user is authorized to make this request.
    *
    * @return bool
    */
    public function authorize()
    {
        return true;
    }

    /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
    public function rules()
    {
        return [
            'mail_address' => 'email|required',
            'company_code' => 'required|min:4|max:20|codeStringCheck',
            'company_name' => 'required|max:20',
        ];
    }
    
    public function messages()
    {
        return[
            'company_code.code_string_check' => '英字から始まる半角英数字の文字列を入力してください。'
        ];
    }
}
php```

CSRF Exception キャッチしろやあ @Laravel5

お疲れ様です。

フォームを開いたまま仕事に行き、数時間放置した後に再度Submit.

すると

TokenMismatchException in VerifyCsrfToken.php

なるエラーが。
そういう時は自分でExceptionをThrowする。

対象はこちら↓

app/Exceptions/Handler.php

1.CatchするためのExceptionを読み込もうね!!

use Illuminate\Session\TokenMismatchException;

2.function render をいじろうね!!

    public function render($request, Exception $e)
    {
        
        // csrf error 
        if ($e instanceof TokenMismatchException) {
            return redirect()->back()->with(
                'csrf_error' ,
                'ページを長時間開いていた為、<br />セッションが切れました。<br />もう一度最初から入力してください。'
            );
        }
        
        return parent::render($request, $e);
    }

2017/04/12

午前中

午前は転職活動。

電車で1時間揺られて着きました。

電車で勉強してる人って凄いなって思った。
自分、電車で勉強しようと思ったんだけど、気づいたら到着してたわ、爆睡。

面接は良かったんじゃないだろうか?

人当たりも多分良かったし、色々条件面金銭面とか話せたし。

これを踏み台に本命も頑張りたい。

午後

母親が帰宅するまで少し寝るつもりが、昨日に引き続きまたも3時間爆睡。
塾は相変わらず楽しかった。地味な作業(給料の出る雑務)も楽しかった。
私の担当生徒になった子二人の授業をして、完了。

帰宅して、筋トレして風呂。 筋トレいいね、筋トレ。

今夜は寝れるかな?

翌日は津波。

その日は、曇天だった。明日来る災害を連想させるような、暗くて重い雲。

津波が来る、ということはどういうわけか確定済みだった。 この市の住民はいま、街に残るか他の場所へ逃げるかの二択に迫られていた。 「どうするんだ」 「何か方法はないのか」 災害に人間が打ち勝つ方法なんて限りなく0に近いのに、夢に縋ろうとする人もいた。

「よし、逃げよう」 住人が集まっていた公会堂での会議を仕切っていた人が発した一言でぞろぞろと人は動き出す。既に皆、荷物は持ってきていた。1日、余裕があったから心なしか贅沢な荷物もあったように思える。

「よし、残ろう」 ここに残ることを決めた人たちは、津波が来たらほぼ死ぬのではという恐怖と立ち向かうことを決めた。その中でも次に分かれたのは、「足掻く」か「諦める」か。 諦めた人は知らない。絶望に耐えきれず自殺をした人もいると聞いた。私は家族と前者を選んだ。友人とも合流し、今はもぬけの殻となった数少ないマンションの横を通り、海風を浴びていた。

「さ、とりあえず高台目指そうか」

果たして生き残るんだろうか。

起きた。