20200919のlaravelに関する記事は4件です。

Larvel8系でLaravel青本を使うと出てくるエラー

Larvel8系でLaravel青本を進めていると出てくるエラー

PHPフレームワークLaravel入門 第2版 (日本語) 単行本(以下青本)を使う方も多いのではないでしょうか。

この本の出版は2019年12月と少し古いもののLaravel7系でも動作確認できていると著書の最初の方に書いてあります。
しかし!
2020年9月8日に出たばかりのLaravel8系を使うと一点問題が起きます。
9月8日以降にLaravelのプロジェクトを作った方は普通どおり操作すればLaravel8系になるのでその方が対象です。
具体的にはweb.phpを記載する際、これまで

Route::get('hello','HelloController@index')

と書いていた所をLaravel8系では

use App\Http\Controllers\HelloController;
Route::get('hello', [HelloController::class, 'index']);

と書くんです。
大事なのはuse.....もいる所。そしてコントローラー名の記載方法が””の中に書くものから[]内に書くという方法へと変わったことです。

青本でいうとp43に初めて影響が出てくるのですが、これを従来の方法で書くと

Target class [HelloController] does not exist.

と怒られてしまいます……

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel sql]DB:selectの中身のSQL文のプレースホルダの使い方メモ

状況

Laravel入門でDBクラスを使った際にプレースホルダの例が乗っていたので使えそうなのでメモ

controller

use Illuminate\Support\Facades\DB;  //DBクラスのnamespaceを指定

public function index(Request $request)
{
  if (isset($request->id)) 
  {
    $param = ['id' => $request->id]; //プレースホルダ用に連想配列を作る
    $items = DB::select('select + from people where id = :id', $param);
  } else {
    $items = DB::select('select * from people');
  }
  return view('hello.index', ['items' => $items]);
}

selectメソッドの第一引数のsql文の中で:idと置いて置いて
第二引数に連想配列を代入すると:idに一致するキーを連想配列から取得してくれるようだ。
?id=数字のクエリ文字を入れてアクセスすると望みの動きをする。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[laravel]Mysqlとの接続メモ

前提条件

Mysqlはインストール済、dbをcreate済、環境はMacOS

設定

config/database.php

return [

    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', '※接続するデータベース名'),
            'username' => env('DB_USERNAME', '※ユーザ名'),
            'password' => env('DB_PASSWORD', '※パスワード'),
        ],
]

.env

DB_USERNAME=※ユーザ名
DB_PASSWORD=※パスワード

接続確認

$ php artisan serve

正しく接続してなければエラーが返ってくる。

所感

.envはdatabase.phpを上書きするようだ。本番環境に置く時に.envでパラメータ上書きして使うのかな?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel NovaのCardやActionで自作クラスを作らずにインスタンス化する

Laravel NovaのCardやAction, Filter、Partitionですが、基本的には自作クラスを作る必要があります。

image.png

カードの作成例
$ php artisan nova:card acme/analytics

https://nova.laravel.com/docs/3.0/customization/cards.html

AnalyticsCar.php
<?php

namespace Acme\Analytics;

use Laravel\Nova\Card;

class Analytics extends Card
{
    /**
     * The width of the card (1/3, 1/2, or full).
     *
     * @var string
     */
    public $width = '1/3';

    /**
     * Indicates that the analytics should show current visitors.
     *
     * @return $this
     */
    public function currentVisitors()
    {
        return $this->withMeta(['currentVisitors' => true]);
    }

    /**
     * Get the component name for the card.
     *
     * @return string
     */
    public function component()
    {
        return 'analytics';
    }
}

こうして作ったクラスをリソースに登録します。

Analitcs.php(リソース)
...
public function cards(Request $request)
{
    return [new Analytics];
}
...

作成 -> 登録が面倒な場合には無名クラスを使うと便利です。

Analitcs.php(リソース)
public function cards(Request $request)
{
    return [
       (new class extends Card {
              public $width = '1/3';
              public function currentVisitors()
              {
                 return $this->withMeta(['currentVisitors' => true]);
              }
       ),
   ];
}

こうすることでクラスを作らなくともいきなりカードの登録ができます。

インスタンスからメソッドの呼び出しも可能です。

Analitcs.php(リソース)
public function cards(Request $request)
{
    return [
       (new class extends Card {
              public $width = '1/3';
              public function currentVisitors()
              {
                 return $this->withMeta(['currentVisitors' => true]);
              }
       )->currentVisitors(),
   ];
}

複数のリソースをまたがったりする場合にはクラスを作ったほうが良いですが、ちょっとカードを使いたいときは無名クラスが便利です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む