人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます:タグ「Laravel」での検索

Laravelのモデルで更新日(updated_at)のみ変更する

● Laravelのモデルで更新日(updated_at)のみ変更する

$model->touch(); 

これだけです、これだけで下記のようなSQL文が実行されます

            [query] => update `MY-TABLE` set `updated_at` = ? where `id` = ?
            [bindings] => Array
                (
                    [0] => 2018-10-17 22:44:43
                    [1] => 16090
                )
No.1311
10/17 22:47

edit

Laravel

LaravelでCLIから呼び出す自作コマンドを作成する。コマンドをcronで定期実行する

● LaravelでCLIから呼び出す自作コマンドを作成する

フレームワークによってはコントローラーを直接CLIから叩けるものもありますが、 Laravelの場合はコマンドを用意する必要があるようです。 (とはいえ artisan コマンドが用意されているので簡単です。)

● 作成するコマンド名を考える

コマンド名は

make:auth
make:migration

 のように(makeグループの中のauth)みたいな感じで、グルーピングされていますので、
自作コマンドもグルーピングしておくと、コマンドが増えた時に一覧表示で見やすくなります。

今回作成するコマンドは

myapp:print

とします。

● コマンドファイルを artisan で作成する

myapp:print コマンドを作成する時には次のように入力します

php artisan make:command  MyappPrint

するとファイル app/Console/Commands/MyappPrint.php が自動生成されます。

● 自動生成されたファイルを編集する

app/Console/Commands/MyappPrint.php を以下のようにします

protected $signature = 'myapp:print'; にコマンド名をセットします。
protected $description = 'MYAPP:にコマンドの説明をセットします。

<?php

namespace App\Console\Commands;
use Illuminate\Console\Command;

class MyappPrint extends Command
{
    /**
     * The name and signature of the console command.
     * @var string
     */
    protected $signature = 'myapp:print';


    /**
     * The console command description.
     * @var string
     */
    protected $description = 'MYAPP: ハローと表示します';


    /**
     * Create a new command instance.
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }


    /**
     * Execute the console command.
     * @return mixed
     */
    public function handle()
    {
        // ここにロジックを記述
        echo 'Hello Myapp Command !!!' . "\n";
    }
}

● ターミナルから実行する

php artisan myapp:print

結果

Hello Myapp Command !!!

● コマンドラインで引数を受け取る

1. シグネイチャを変更します

    protected $signature = 'myapp:print';

 ↓

    protected $signature = 'myapp:print {id}';

と変更します。

「引数なし」を許可するには

    protected $signature = 'myapp:print {id?}';

とします。

2.handle()メソッド内で引数を受け取ります

    public function handle()
    {
        // ここにロジックを記述
        $id = $this->argument('id');
        echo 'Hello Myapp Command !!!' . "\n";
        echo $id;
    }

ターミナルから実行時に引数を渡します

php artisan myapp:print

● Laravelでコマンドをcron定期実行する(タスクスケジュール)

Laravel で定期実行させるにはまず cron で毎分ごとにLaravelのスケジューラを実行させ、その中でLaravelで設定した時間ごとにコマンドを自動実行します。

1. crontab に設定する

crontab -e

crontabの書式に沿って以下のように記述します

* * * * * php7 /YOUR/APP/PATH/artisan schedule:run >> /dev/null 2>&1

2. app/Console/Kernel.php にコマンドを記述

コマンド「myapp:getdata」を1分ごとに起動するように設定します。

    protected function schedule(Schedule $schedule)
    {
        // RSSからデータを取得 (1分ごと)
        $schedule->command('myapp:getdata')->everyMinute();
    }

以上です。 ログを見て定期実行が行われているか確認します。

スケジュールは以下のように設定できます。

メソッド 説明
->cron('* * * * * *'); CRON記法によるスケジュール
->everyMinute(); 毎分タスク実行
->everyFiveMinutes(); 5分毎にタスク実行
->everyTenMinutes(); 10分毎にタスク実行
->everyFifteenMinutes(); 15分毎にタスク実行
->everyThirtyMinutes(); 30分毎にタスク実行
->hourly(); 毎時タスク実行
->hourlyAt(17); 一時間ごと、毎時17分にタスク実行
->daily(); 毎日深夜12時に実行
->dailyAt('13:00'); 毎日13:00に実行
->twiceDaily(1, 13); 毎日1:00と13:00時に実行
->weekly(); 毎週実行
->monthly(); 毎月実行
->monthlyOn(4, '15:00'); 毎月4日の15:00に実行
->quarterly(); 四半期ごとに実行
->yearly(); 毎年実行
->timezone('America/New_York'); タイムゾーン設定

● php artisan schedule:run で動作を確認する

cronでコマンドが呼ばれているかを確認するには

php artisan schedule:run

としますが、あらかじめ メソッドの修正が必要です!(重要)

1. schedule メソッドの実行間隔を 1分に変更する

1分に変更しないと、No scheduled commands are ready to run. が出て終了してしまいます。
また、重複起動を回避するメソッド withoutOverlapping() も外しておきましょう。

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('myapp:getdata')->everyMinute();

2. schedule:run を実行する

php artisan schedule:run

とします。

これで必ず設定されたタスクが走るので、ログを見て動作を確認します。

● withoutOverlapping() メソッドはデッドロックを自動解除しない?

どうやら withoutOverlapping() はデッドロックを自動で解除できないようです。

https://goo.gl/mVchaN

No.1309
11/26 14:47

edit

Laravel
CLI
コマンド

Laravelのパンくずリストlaravel-breadcrumbsを使用してページタイトルとパンくずを表示させる

● laravel-breadcrumbsのインストール

composer require davejamesmiller/laravel-breadcrumbs:5.x

● パンくずリストのデータを定義する

routes/breadcrumbs.php を以下の内容で作成します

<?php

// Home
Breadcrumbs::for('home', function ($trail) {
    $trail->push('Home', route('home'));
});

// Home > About
Breadcrumbs::for('about', function ($trail) {
    $trail->parent('home');
    $trail->push('About', route('about'));
});

● 設定ファイルを生成する

次の設定ファイルを生成コマンドを実行します

php artisan vendor:publish --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"

● パンくずリストを表示する

ビューファイル(XXXXX.blade.php)に以下のように記述します

{{ Breadcrumbs::render('home') }}

もしくは、Route::currentRouteName() で現在のルーティングが取得できるので

{{ Breadcrumbs::render(Route::currentRouteName()) }}

としておくとビューファイルは触らなくてもいいので楽です。(レイアウトファイルにパンくずを設置してある場合はこちらがおすすめです。)

● パンくずリストをカスタマイズする

自作のパンくずリストテンプレートを使用するには config/breadcrumbs.php を編集します

25行目を次のように書き換えます

###    'view' => 'breadcrumbs::bootstrap4',
    'view' => 'my_breadcrumbs',

すると、テンプレートファイルviews/breadcrumbs.blade.phpを見に行くようになります。

テンプレートファイルを用意する

views/breadcrumbs.blade.php

(以下は例です。適宜書き換えてください。)

@if (count($breadcrumbs))
    <ol class="navbar__breadcrumb breadcrumb d-none d-sm-flex">
        @foreach ($breadcrumbs as $breadcrumb)
            @if ($breadcrumb->url && !$loop->last)
                <li class="breadcrumb-item"><a href="{{ $breadcrumb->url }}">{{ $breadcrumb->title }}</a></li>
            @else
                <li class="breadcrumb-item active">{{ $breadcrumb->title }}</li>
            @endif
        @endforeach
    </ol>
@endif

以上です。 とても簡単にパンくずリストが出来るのでLaravelを使っている場合は必須ともいえるでしょう。

● パンくずの一番後ろのテキストをページタイトルとして表示する

これも便利です。blade.php ファイルにページタイトルを記述しなくても自動的にセットされます。

    <title>{{ ($breadcrumb = Breadcrumbs::current()) ? $breadcrumb->title : 'No Name' }}</title>
No.1302
11/13 16:43

edit

Laravel

Laravelのキャッシュクリア

● Laravelのファイル更新が反映されない?時はキャッシュクリアを行いましょう

Laravelで「ファイルを更新したのに更新されてない?」
という時はキャッシュが残っている可能性が大です。
こちらのコマンドでキャッシュを削除しましょう。

php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
composer dump-autoload

・1行で書いてコピペして実行!

php artisan cache:clear; php artisan config:clear; php artisan route:clear; php artisan view:clear; composer dump-autoload
No.1283
10/12 16:21

edit

Laravel

Laravel で自作パッケージを簡単に作成する

PackageCreator がとても便利です

● PackageCreator

https://github.com/SUKOHI/PackageCreator

・インストール

composer require sukohi/package-creator

インストールすると「make:package コマンド」が使用できるようになります

・パッケージの作成( php artisan make:package コマンド )

php artisan  make:package   (ベンダー名)   (パッケージ名)   (保存するフォルダ名(アプリケーションからの相対パス) )  

例 )

php artisan  make:package  myname  my-package  test_packages 

自動生成されるファイル

./test_packages/Myname/MyPackage/src/Facades/MyPackage.php
./test_packages/Myname/MyPackage/src/MyPackage.php
./test_packages/Myname/MyPackage/src/MyPackageServiceProvider.php
./test_packages/Myname/MyPackage/composer.json

● パッケージ作成例

例として mydump クラスを作成してみます。

1. コマンドの実行

php artisan  make:package  akato0315  mydump  mypackages 

2. クラスの実装

APP/mypackages/Akato0315/Mydump/src/Mydump.php を編集して以下の内容にします

<?php 
namespace Akato0315\Mydump;
class Mydump {
    public static function dump( $mix )
    {
  		print "\n".'<pre style="text-align:left;display:block;padding:9.5px;margin:10px;font-size:13px;line-height:1.4;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;">'."\n";
  		print '<span style="color:#999;">TYPE: ' . gettype($mix) . "</span>\n";
  		print_r($mix);
  		print "\n</pre>\n\n";
    }

    public static function dump2( $mix )
    {
      print "\n"."<!--"."\n";
  		print "\n".'<pre style="text-align:left;display:block;padding:9.5px;margin:10px;font-size:13px;line-height:1.4;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;">'."\n";
  		print '<span style="color:#999;">TYPE: ' . gettype($mix) . "</span>\n";
  		print_r($mix);
  		print "\n</pre>\n\n";
      print "\n"."-->"."\n";
    }
}

3. configファイル と composer.json を編集

APP/config/app.php の「providers」と「aliases」に以下を追加します

    'providers' => [
        ..................... 
        Akato0315\Mydump\MydumpServiceProvider::class,
    'aliases' => [
        ..................... 
        'Mydump' => Akato0315\Mydump\Facades\Mydump::class,

composer.json を以下のように修正します

        "psr-4": {
            "App\\": "app/" 
        }

        ↓

        "psr-4": {
            "App\\": "app/" ,
            "Akato0315\\Mydump\\": "mypackages/Akato0315/Mydump/src"
        }

4. コマンドラインから次のコマンドを実行

composer dumpautoload -o
php artisan config:cache

5. Laravelのコントローラーから使用する

use Mydump;

$mix = [
    'aaa' => 'bbb' ,
    'ccc' => 'ddd' ,
];
Mydump::dump( $mix );

5. 結果

添付ファイル1
mydump.png ( 22.5 KBytes ) ダウンロード
No.1282
10/05 09:52

edit

添付ファイル

Laravel
composer

Laravel で DBの構造と最後に実行したSQL文を取得する

● Laravel の Schema クラス

use Illuminate\Support\Facades\Schema;

category テーブルのカラムを配列で取得する

$columns = Schema::getColumnListing('category');
dump($columns);

● 最後に実行したSQL文を取得する

・方法その1

$data = $model->orderBy('id', 'desc')->paginate( 10 );
dump( $model->toSql() );

・方法その2

use DB;
DB::enableQueryLog();
$data = $model->orderBy('id', 'desc')->paginate( 10 );
dump(DB::getQueryLog());
No.1277
10/29 16:45

edit

Laravel