CPIの共用サーバーでのLaravel5.5設定(サブディレクトリに設置)のメモ

CPIの共用サーバーでのLaravel5.5設定(サブディレクトリに設置)のメモ

SSHログイン

基本使える、公開鍵認証OK、基本的なコマンド利用可能

一覧 http://acesr.document.secure.ne.jp/tools/sshkeys/

  • ※rsyncでデプロイしたかったが利用不可。> FTPの同期などで代用
  • composer使いたかったけど利用不可。 > FTPでアップ

ドキュメントルートの問題

シンボリックリンクでOKドキュメントルートは基本以下

/usr/home/ユーザー名/html

URLはサブディレクトリにする必要があった。(本当はサブドメインが良かったが、SSLが高い事が原因で致し方なく)以下がルートのようにしたい。

https://hogehoge.com/myapp/

アプリはいかに設置

/usr/home/ユーザー名/myapp/

以下のディレクトリからpublicにシンボリックリンクをはる

/usr/home/ユーザー名/html/myapp  -> ../myapp/public/

DELETEメソッドが通らない

axios.delete(ほげほげ〜とすると通らない。フォーム同様に POSTで投げて、_methodパラメータで渡す。

axios.post('/myapp/pathtourl/999,{ _method:'DELETE' }).then(res => {
    //何か処理
})

PHPのバージョン

publicフォルダにphp.iniファイルを置いて php7.1を利用
(詳しくはHelpを)

AddHandler x-httpd-php71 .php

Lalavelで、Faker Seederを使ってダミーデータを作成

Lalavelで、Faker Seederを使ってダミーデータを作成

まずはartisanのコマンドでクラスを作成

$ php artisan make:sheeder MySeeder

database/seeder/MySeeder.phpが作成されますので、
run()メソッドにダミーデータを作成するスクリプトを記載します。

<?php

use IlluminateDatabaseSeeder;
use FakerFactory as Faker;
use CarbonCarbon;

class MySeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
   public function run()
    {
        $faker = Faker::create('ja_JP');
        for ($i = 0; $i < 100; $i++) {
            $params = [
                'email' => $faker->email,
                'name' => $faker->name,
                'created_at' => Carbon::today(),
                'updated_at' => Carbon::today()
            ];
        }
    }
}

実行は以下

//すべてのスクリプトを実行
$ php artisan db:seed --class=UserTableSeeder
//指定したスクリプトを実行
$ php artisan db:seed --class=MySeeder

Laravel 年度ごとのサブディレクトリでルートのPrefixを設定

Laravel 年度ごとのサブディレクトリでルートのPrefixを設定

年度ごとにサブディレクトリがあるサイト(就職/進学サイト)などで、各年度ごとにRouteのprefixを設定したメモ。

//「/20●●/」にマッチした場合だけRouteを設定
$uri = env('REQUEST_URI');
if(preg_match('/^(/)(20d{2})/',$uri,$matches)){
    if(isset($matches[2])){
        $year = $matches[2];
        Route::middleware(['my_middleware'])->prefix($year)->group(function ($router) {
            Route::get('/','HomeController@index')->name('home.index');
                ・
                ・
                ・
        });
    }
}

PHPSpreadsheetでメモリ食いすぎておちるので、メモリ解放する方法

PHPSpreadsheetでメモリ食いすぎておちるので、メモリ解放する方法

デストラクトのメソッドがあるのでそのままCallするだけ。

$spreadsheet->__destruct();

Laravelで selectタグのオプションに使うリスト取得 (CakePHPの ->list()の様に)

Laravelで selectタグのオプションに使うリスト取得 (CakePHPの ->list()の様に)

laravelでは Model::pluck()をつかう。

//Groupモデルの場合
Group::pluck('name','id');
や。
Group::pluck('label','group_id');
など先にvalueになる内容 / 後にkeyになるフィールド

//例) 以下の様に取得
1 => 管理者
2 => 一般ユーザー
3 => ゲスト

Laravelで、CakePHPのHash::combineみたいに、ネストの配列を取得

Laravelで、CakePHPのHash::combineみたいに、ネストの配列を取得

CakePHPのHash::combineみたいに取得したかった。
CollectionクラスにmapWithKeysがありそれっぽくできる。

MyModel::get([$key,$label])->mapWithKeys(function($item) use($key,$label) {
        return [$item[$key] => $item[$label]];
})->toArray();

PHPStormで親クラスのメソッドをオーバーライドするショートカット

PHPStormで親クラスのメソッドをオーバーライドするショートカット

Command + O (Macの場合)

選択のダイアログ

選択のダイアログ

以下のようにparentの呼び出し+TODOコメントまでついてラクラク。

    public function getMiddleware()
    {
        return parent::getMiddleware(); // TODO: Change the autogenerated stub
    }

手打ちだと、1分くらいかかるとするとだいぶ早い。

Laravel 初期セットアップやることメモ

バージョンを決める。

基本PHPに合わせるが、PHP7以上でないとな感じ(Laravel5.5以上で使いたい)
PHP7.0だと最新は使えないが、現在最終のLTS(Long-term Support)の5.5が使えるのでそこを使う。

希望としてPHP7.1以上で最新を使っていきたい気もする。

PHP7.0 > 7.2であまり大きな変化は無いようだけど、HTMLメール作成でエラーがでて使えないことがあった(原因がプログラムなのかフレームワークなのかは調べてない)

Laravelのインストール

composerでサクッと対象バージョン入れる

デプロイ/サーバー環境セットアップ

  • ステージング/プロダクションのデプロイ設定(いつもはrsync)
  • パーミッションも
//グループの場合によって 770とか
$ chmod -R 777 ./storage
$ chmod -R 777 ./bootstrap/cache
  • .envの設定(ローカル/リモート)
    APP_NAMEとか、APP_ENVとか、DBの設定とか

  • config/app.php設定

//日本化
    'timezone' => 'Asia/Tokyo',
    'locale' => 'ja',
    'fallback_locale' => 'ja',
//ログ設定(config/app.php) ログをdailyに
    'log' => env('APP_LOG', 'daily'),
    'log_level' => env('APP_LOG_LEVEL', 'debug'),
    'log_max_files' => '90',
    
  • app/Providers/AppServiceProvider.php
//Slackへ流すエラーログなど
    public function boot()
    {
        //ログ設定 
        $token = env('SLACK_API_KEY');
        $channel = env('SLACK_API_CHANNEL');
        //Error以上はSlackに流す
        Log::listen(function ($event) use ($token) {
            $monolog = Log::getMonolog();
            $handlers = $monolog->getHandlers();
            $slackHandler = new SlackHandler(
                $token,
                $channel,
                env('APP_NAME'),
                'log',
                false,
                Logger::ERROR,
                false,
                true,
                true);
            array_push($handlers,$slackHandler);
            $monolog->setHandlers($handlers);
        });
    }
    
  • 一旦設定が終わったら簡単に動作するかを見る。

リポジトリ設定

リモートを置く/またはローカルのみ

モデル関連

artisanでモデル/コントローラーをすべて作成。

$ php artisan make:model  Client  -r --controller

カスタムバリデーション

カスタムバリデーションを準備

パッケージ類

//インストール
$ composer require "laravelcollective/html":"^5.5.0" // 今回はlaravel5.5に合わせて5.5.0を指定
$ composer require monolog/monolog
$ composer require spatie/laravel-backup
$ composer require intervention/image
// config/app.phpに追記
    //providers
        Intervention\Image\ImageServiceProvider::class,
        Collective\Html\HtmlServiceProvider::class,
        Spatie\Backup\BackupServiceProvider::class,
    //alias
        'Image' => Intervention\Image\Facades\Image::class,  
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,
バックアップの設定

//バックアップ設定ファイルを生成
$ php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
→コピーしてと言われるのコピー
$ cp ./vendor/spatie/laravel-backup/config/backup.php ./config/backup.php 

// バックアップ設定ファイル(config/backup.php)を編集→こちらは必要に応じて
'to' => env('MAIL_SYSTEM_ADMIN') とか。

//バックアップのテスト
$ php artisan backup:run --only-db  //DBのみ
→storage/app/Ryunavi/に保存される。
→通知メール設定していたら送信される(.envのメールの設定をたまに忘れる)

ミドルウェア関連

//ミドルウェア作成
$ php artisan make:middleware MyApp
// app/Http/Kernal.phpに追加
    protected $routeMiddleware = [
        'myapp' => \App\Http\Middleware\MyApp::class,
    ];

Auth関連

たとえば user,admin,clientがある場合。

//config/auth.phpに追記、guardsとproviders
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    
        'user' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'client' => [
            'driver' => 'session',
            'provider' => 'clients',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
------------------------    
   'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'clients' => [
            'driver' => 'eloquent',
            'model' => App\Client::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],    

Helper設定

独自ヘルパ関数などをまとめたファイル読み込み

//composer.jsonのautoloadにfiles追記読み込むファイルHelper.phpを追加して
"autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "app/Helper.php"
        ]
    },

//autoloadをダンプ →読み込まれるようになる
$ composer dumpautoload


//app/Helper.phpに独自ヘルパ関数などを定義していく。
if (!function_exists('mb_trim')) {
    function mb_trim($str)
    {
        return trim(mb_convert_kana($str, "s"));
    }
}
if (!function_exists('h')) {
    function h($str)
    {
        return htmlspecialchars($str, ENT_COMPAT);
    }
}
if (!function_exists('h_attr')) {
    function h_attr($str)
    {
        return htmlspecialchars($str, ENT_QUOTES);
    }
}



Route設定

prefixなど設定

PHPStormで、配列の記述フォーマットをarray()から[]ショート表記にする

PHPStormで、配列の記述フォーマットをarray()から[]ショート表記にする

環境設定で 強制的にショート表記に変更するにチェック

環境設定 > Editor > Code Style > PHP の Other タブで Array Declaration Style の Force showr declaration style にチェックする。

その後エディターで、ショートカット 「Cmd + Opt + L 」で変換されます。

環境設定パネル

環境設定パネル

CakePHP3のHasManyに動的にソートを適用する。

CakePHP3のHasManyに動的にソートを適用する。

注文(Orders) > 発注書(PurchaseOrders) > 業者(Supplier)がありました。
select条件2のみであればOrdersのHasManyで設定すればよいがselect条件1でエラーとなる。

select条件1:業者まで繋げない

Orders>PurchaseOrders

select条件2:業者まで繋げる。

Orders>PurchaseOrders>Suppliers

HasManyクラスのsetSort()を使う。

$this->Orders->PurchaseOrders->setSort(['Suppliers.name'=>'asc']);

で動的に設定できます。

すでに既存のSortが設定されている場合。

(バージョン 3.5.17にて確認)
ソースコードをみると、$this->_sortを上書きしているだけのセッターなので、そのまま上書きな感じでした。

/**
 * Sets the sort order in which target records should be returned.
 *
 * @param mixed $sort A find() compatible order clause
 * @return $this
 */
public function setSort($sort)
{
    $this->_sort = $sort;

    return $this;
}

Page 1 of 38

Powered by WordPress & Theme by Anders Norén