Laravelでカスタムバリデーションの登録方法。

[:ja]

Laravelでカスタムバリデーションの登録方法。

以下のように設定してしまったほうがだいぶ楽な感じ

1 /app/Services/CustomValidator.php クラスを作成

<?php
namespace AppServices;

class CustomValidator extends IlluminateValidationValidator
{
    
    public function validateAlphaNumeric($attribute,$value,$parameters){
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }
    
    public function validateAlphabet($attribute,$value,$parameters){
        return (preg_match("/^[a-zs]+$/i", $value));
    }
}

2 app/Providers/ValidatorServiceProvider.php クラスを作成

<?php

namespace AppProviders;

use AppServicesCustomValidator;
use IlluminateSupportServiceProvider;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::resolver(function($translator,$data,$rules,$messages){
            return new CustomValidator($translator,$data,$rules,$messages);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

3 /config/app.php の ‘providers’ に追記

    'providers' => [
        .
        .
        .
        AppProvidersValidatorServiceProvider::class,
    ],  

4 使う

関数名がキャメルケースでValidationではスネークケース。

    public function validateAlphaNumeric($attribute,$value,$parameters){
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }

という関数なら、以下のようにスネークケースで指定できる。

    'name' => 'required|alpha_numeric'

[:en]

Laravelでカスタムバリデーションの登録方法。

以下のように設定してしまったほうがだいぶ楽な感じ

1 /app/Services/CustomValidator.php クラスを作成

<?php
namespace App\Services;

use Illuminate\Validation\Validator;

class CustomValidator extends Validator
{
   
// public function validateAlphaNumeric($attribute,$value,$parameters){
//    return (preg_match("/^[a-z0-9]+$/i", $value));
// }
// 
// public function validateAlphabet($attribute,$value,$parameters){
//    return (preg_match("/^[a-zs]+$/i", $value));
// }
   
   public function validateRegulationCuts($attribute,$value,$parameters){
      
      dd($value);
      
   }
   
}

2 app/Providers/ValidatorServiceProvider.php クラスを作成

<?php

namespace App\Providers;

use App\Services\CustomValidator;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;


class ValidatorServiceProvider extends ServiceProvider
{
   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      Validator::resolver(function($translator,$data,$rules,$messages){
         return new CustomValidator($translator,$data,$rules,$messages);
      });
   }
   
   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
      //
   }
}

3 /config/app.php の ‘providers’ に追記

    'providers' => [
        .
        .
        .
        App\Providers\Validator\ServiceProvider::class,
    ],  

4 使う

関数名がキャメルケースでValidationではスネークケース。

    public function validateAlphaNumeric($attribute,$value,$parameters){
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }

という関数なら、以下のようにスネークケースで指定できる。

    'name' => 'required|alpha_numeric'

[:]

LaravelのHasManyのGlobalScope(グローバルスコープ)を外す。

LaravelのHasManyのGlobalScope(グローバルスコープ)を外す。

モデルの基本的なwhere条件など(削除フラグetc)をboot()メソッドで addGlobalScopeで追加できるまではよかったが、hasManyで引っ張る時に removeGlobalScopeなんて関数がなく困った。

以下のようにhasManyを別々にして対応。もう少しスマートにできないかな。

<?php
class User extends Model
{
    
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('スコープ名', function(Builder $builder) {
            $builder->where('delete_flg', 0);
        });
    }
    
    public function post(){
        return $this->hasMany(
            "App\Post",
            'id',
            'user_id'
        );
    }
    
    public function postAll(){
        return $this->hasMany(
            "App\Post",
            'id',
            'user_id'
        )->withoutGlobalScope('スコープ名');
    }
}

LaravelでCakePHPのbeforefind的なこと。

LaravelでCakePHPのbeforefind的なこと。

Eloquentモデルのboot()でグローバルスコープを追加。
同じテーブルだけど。モデルは別で絞って取得とか、自分が著者の生地一覧など。

<?php

namespace App;

use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentModel;

class Work extends Model
{
    
    protected $table = 'metas';

    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('work_meta', function(Builder $builder) {
            $builder->where('type', 'work');
        });
    }
    
}

MacのbrewのPHP7.1にImagickをいれる。

MacのbrewのPHP7.1にImagickをいれる。

$ brew install php71-imagick

でインストール

$ php -S localhost:8000

でphpinfo()を書いて。テスト
http://localhost:8000 へ。

Imagick

Imagick

Windows(InternetExploler/Edge)でインターネットのSambaへのリンク(UNCリンク)を開く設定。

Windows(InternetExploler/Edge)でインターネットのSambaへのリンク(UNCリンク)を開く設定。

2017.12月現在はできました。

いろいろパスを変えてもできなかったのですが、セキュリティー設定を変更するとできました。
インターネットセキュリティーのプロパティーを開いて、[セキュリティー]タブの“信頼済サイト”に該当サイトを追加します。(サイトがhttpsでない場合はhttps必須のチェックを外す)
→InternetExploler/Edgeともこれで開けるようになります。

リンクはfile::///から初めるかたち。

<a href="file:///\exampele.compathtofile_or_dir">リンク文字列</a>

ちなみにMacは、そのままsmb://~で行けました。(iPad/iPhone/Androidなどはどうなるかは未検証

<a href="smb://exampele.com/path/to/file_or_dir">リンク文字列</a>

限定した業務システムなどでは使えそうな感じです。

Laravelで日付の検索、YYYYMMDDの形式の場合。前方後方真ん中、年月日組み合わせ検索。

Laravelで日付の検索、YYYYMMDDの形式の場合。前方後方真ん中、年月日組み合わせ検索。

をつくってみた。

public static function set_date_search($query,$date,$targetKey){
        $y = ($date['year'])?'1':'0';
        $m = ($date['month'])?'1':'0';
        $d = ($date['day'])?'1':'0';
        $ymd = ''.$y.$m.$d;
        switch($ymd){
            case '001':
                return $query->where($targetKey,'like','______'.$date['day']);
            case '011':
                return $query->where($targetKey,'like','____'.$date['month'].$date['day']);
            case '100':
                return $query->where($targetKey,'like',$date['year'].'____');
            case '110':
                return $query->where($targetKey,'like',$date['year'].$date['month'].'__');
            case '010':
                return $query->where($targetKey,'like','____'.$date['month'].'__');
            case '101':
                return $query->where($targetKey,'like',$date['year'].'__'.$date['day']);
            case '111':
                return $query->where($targetKey,'=',dateArr2DbString($date));
            default:
                return $query;
        }
    }

PHPでいろいろな種類の改行コードを簡単に配列に格納する。のは”R” がよさそう。

PHPでいろいろな種類の改行コードを簡単に配列に格納する。のは“R” がよさそう。

参考
http://php.net/manual/ja/regexp.reference.escape.php

そのままですが。

$lines = preg_split('/R/',$text);

$textはテキストエリアなどに入力された文字を想定。
win/macどちらからでも

Laravelで任意の場所(親コントローラー)などで強制リダイレクトする方法。

Laravelで任意の場所(親コントローラー)などで強制リダイレクトする方法。

ふつうのコントローラーだと。アクションで return して上げればリダイレクトできる。

    function restore($request){
        ・
        ・
        return Redirect::route("item.index")->with('message', '登録しました。'); 
    }

ただ、親のコントローラーや別のメソッドからだとできない場合は以下の様にする。

    function hoge(){
        Redirect::route('item.index')->withErrors(['redirect'=>'エラー発生'])->throwResponse();
    }

Redirect(ファザード)の実態は。IlluminateRoutingRedirector で、
route()->withErrors()を実行した戻り値は。IlluminateHttpRedirectResponse
その RedirectResponseクラスのthrowResponse();を実行している流れ。

Laravel5.5で、一覧ページのPaginationにソートを追加する。(sort,orderby)

Laravel5.5で、一覧ページのPaginationにソートを追加する。(sort,orderby)

こちらを使わせてもらいました。

kyslik/column-sortable
https://github.com/Kyslik/column-sortable

まずはcomposerでインストール。

$ composer require kyslik/column-sortable

config/app.phpの providersに追加


    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        IlluminateAuthAuthServiceProvider::class,
        IlluminateBroadcastingBroadcastServiceProvider::class,
        IlluminateBusBusServiceProvider::class,
            ・
            ・
            ・
            ・
        /*
         * paginate sortable ※こちら
         */
        KyslikColumnSortableColumnSortableServiceProvider::class,

    ],

モデルに追記。

<?php

namespace App;

use IlluminateDatabaseEloquentModel;
use SymfonyComponentHttpFoundationRequest;

use KyslikColumnSortableSortable; //※ここと。

class User extends Model
{    
    use Sortable;  // ※ココ

ビューは以下の様に

<th>@sortablelink('email','メールアドレス')</th>

Laravelで簡単にExcelからのCSVを読み込んで処理したい。

Laravelで簡単にExcelからのCSVを読み込んで処理したい。

Goodby, CSV
https://github.com/goodby/csv#requirements

composer.json のrequireに“goodby/csv”を追加。

"require": {
    "goodby/csv": "*"
}

して、composerをアップデート

$ composer update
$ composer dump-autoload

モデル、ライブラリをuseして使う。

app/ItemCsv.php
<?php
namespace App;

use IlluminateDatabaseEloquentModel;

use GoodbyCSVImportStandardLexer;
use GoodbyCSVImportStandardInterpreter;
use GoodbyCSVImportStandardLexerConfig;

class ItemCsv extends Model
{
    
    protected $table = 'items'; 
    
    public static function import($path){
    
        $config = new LexerConfig();
        $config->setToCharset("UTF-8");
        $config->setFromCharset("sjis-win");
        $interpreter = new Interpreter();
        $tmp = array();
        $interpreter->addObserver(function(array $row) use (&$tmp) {
            $tmp[] = $row;
        });
        $lexer = new Lexer($config);
        $lexer->parse($path, $interpreter);
        dd($tmp);
    }
    
}

あとは、何処かしらから。

ItemCsv::import($path_to_csv_file);

Page 13 of 47

Powered by WordPress & Theme by Anders Norén