Laravel セットアップ メモ


■Laravelをインストールする方法(Windows、macOS、Linux別)


■LinuxにLaravelをインストール

kokaki@skynew:~$ mkdir /home/kokaki/www/laravel
kokaki@skynew:~$ cd /home/kokaki/www/laravel
1.Apacheをインストールする

2.PHPをインストールする
kokaki@skynew:~/www/laravel$ sudo apt install -y php libapache2-mod-php php-mbstring php-xmlrpc php-soap php-gd php-xml php-cli php-zip php-bcmath php-tokenizer php-json php-pear

3.MariaDBをインストールする

4.Composerをインストールする
kokaki@skynew:~/www/laravel$ curl -sS https://getcomposer.org/installer | php

  All settings correct for using Composer
  Downloading...

  Composer (version 2.6.6) successfully installed to: /home/kokaki/www/laravel/composer.phar
  Use it: php composer.phar
        
kokaki@skynew:~/www/laravel$ sudo mv composer.phar /usr/local/bin/composer
kokaki@skynew:~/www/laravel$ sudo chmod +x /usr/local/bin/composer

5.PHP、MariaDB、Composerのインストールを確認する
kokaki@skynew:~/www/laravel$ php -v mysql --version composer -V

  PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
  Copyright (c) The PHP Group
  Zend Engine v4.1.2, Copyright (c) Zend Technologies
      with Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies
        
6.Composerを使用してLaravelをインストールする
kokaki@skynew:~/www/laravel$ composer create-project --prefer-dist laravel/laravel testapp

  51 package suggestions were added by new dependencies, use `composer suggest` to see details.
  Generating optimized autoload files
  > Illuminate\Foundation\ComposerScripts::postAutoloadDump
  > @php artisan package:discover --ansi

    INFO  Discovering packages.

    laravel/sail ....................................................................................................... DONE
    laravel/sanctum .................................................................................................... DONE
    laravel/tinker ..................................................................................................... DONE
    nesbot/carbon ...................................................................................................... DONE
    nunomaduro/collision ............................................................................................... DONE
    nunomaduro/termwind ................................................................................................ DONE
    spatie/laravel-ignition ............................................................................................ DONE

  83 packages you are using are looking for funding.
  Use the `composer fund` command to find out more!
  > @php artisan vendor:publish --tag=laravel-assets --ansi --force

    INFO  No publishable resources for tag [laravel-assets].

  No security vulnerability advisories found.
  > @php artisan key:generate --ansi

    INFO  Application key set successfully.
        
7.Laravelサーバーを実行する
kokaki@skynew:~/www/laravel$ cd testapp
kokaki@skynew:~/www/laravel/testapp$ php artisan serve

http://localhost:8000/

■【初心者入門】Laravelの使い方解説!Todoアプリ作成


kokaki@skynew:~$ mkdir /home/kokaki/www/laravel/testapp
kokaki@skynew:~$ cd /home/kokaki/www/laravel/testapp
kokaki@skynew:~/www/laravel/testapp$
kokaki@skynew:~/www/laravel/testapp$ composer create-project --prefer-dist laravel/laravel . "9.*"
    --prefer-distオプション:パッケージをインストールするにあたって、
                               zip形式でダウンロードして展開するという指定です。
    "9.*":Laravelのバージョンを指定する場合は、 パッケージを例えば「"6.*"」のように指定します。
・Laravelの初期設定
kokaki@skynew:~/www/laravel/testapp$ vi config/app.php

  'timezone' => 'Asia/Tokyo',
  'locale' => 'ja',
  'fallback_locale' => 'ja',
  'faker_locale' => 'ja_JP',
        
kokaki@skynew:~/www/laravel/testapp$ vi .env

  APP_NAME=Laravel_TodoApp

  ・データベースとの接続
  DB_CONNECTION=mysql
  DB_HOST=127.0.0.1
  DB_PORT=3306
  DB_DATABASE=laravel
  DB_USERNAME=dev
  DB_PASSWORD=dev
        
※MySQLにデータベース「laravel」を作成しておく!

kokaki@skynew:~/www/laravel/testapp$ vi config/database.php

  'charset' => 'utf8',
  'collation' => 'utf8_general_ci',
        
kokaki@skynew:~/www/laravel/testapp$ php artisan config:clear
kokaki@skynew:~/www/laravel/testapp$ php artisan migrate
※phpのPDOを有効にしておく。
 php.iniのextension=pdo_mysqlのコメントを除く(有効にする)

・tasksテーブルを作る
kokaki@skynew:~/www/laravel/testapp$ php artisan make:migration create_tasks_table
kokaki@skynew:~/www/laravel/testapp$ vi database/migrations/2024_02_06_132644_create_tasks_table.php

  Schema::create('tasks', function (Blueprint $table) {
      $table->id();
      $table->string('name', 100);
      $table->boolean('status')->default(false);
      $table->timestamp('updated_at')->useCurrent()->nullable();
      $table->timestamp('created_at')->useCurrent()->nullable();
  });
        
kokaki@skynew:~/www/laravel/testapp$ php artisan migrate

・モデルを作る
kokaki@skynew:~/www/laravel/testapp$ php artisan make:model Task
kokaki@skynew:~/www/laravel/testapp$ php artisan make:controller TaskController --resource
kokaki@skynew:~/www/laravel/testapp$ vi routes/web.php

  use App\Http\Controllers\TaskController;

  Route::resource('tasks', TaskController::class);
        
kokaki@skynew:~/www/laravel/testapp$ php artisan route:list

    GET|HEAD        / ..................................................................................................
    POST            _ignition/execute-solution ignition.executeSolution › Spatie\LaravelIgnition › ExecuteSolutionContr…
    GET|HEAD        _ignition/health-check ....... ignition.healthCheck › Spatie\LaravelIgnition › HealthCheckController
    POST            _ignition/update-config .... ignition.updateConfig › Spatie\LaravelIgnition › UpdateConfigController
    GET|HEAD        api/user ...........................................................................................
    GET|HEAD        sanctum/csrf-cookie .............. sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show
    GET|HEAD        tasks ........................................................... tasks.index › TaskController@index
    POST            tasks ........................................................... tasks.store › TaskController@store
    GET|HEAD        tasks/create .................................................. tasks.create › TaskController@create
    GET|HEAD        tasks/{task} ...................................................... tasks.show › TaskController@show
    PUT|PATCH       tasks/{task} .................................................. tasks.update › TaskController@update
    DELETE          tasks/{task} ................................................ tasks.destroy › TaskController@destroy
    GET|HEAD        tasks/{task}/edit ................................................. tasks.edit › TaskController@edit

                                                                                                    Showing [13] routes
        
kokaki@skynew:~/www/laravel/testapp$ mkdir resources/views/tasks
kokaki@skynew:~/www/laravel/testapp$ vi resources/views/tasks/index.blade.php
kokaki@skynew:~/www/laravel/testapp$ vi app/Http/Controllers/TaskController.php

  public function index()
  {
      return view('tasks.index');
  }
        
kokaki@skynew:~/www/laravel/testapp$ php artisan serve

http://localhost:8000/tasks

■LaravelをApacheのDocumentRoot以外に配置する

kokaki@skynew:~$ sudo vi /etc/apache2/sites-available/laravel.conf

  Alias /laravel-testapp /home/kokaki/www/laravel/testapp/public/

  <Directory "/home/kokaki/www/laravel/testapp/public/">
    Options Includes ExecCGI FollowSymLinks
    AllowOverride All
    Require all granted
    #Order allow,deny
    #Allow from all
  </Directory>
        
kokaki@skynew:~$ sudo a2ensite laravel
kokaki@skynew:~$ sudo a2enmod rewrite
kokaki@skynew:~$ sudo systemctl restart apache2
・権限エラーが出るので、、、
kokaki@skynew:~$ sudo chmod -R 777 /home/kokaki/www/laravel/testapp/storage/

・URLの指定方法を変える(ローカルから実行する場合と、Apache2経由でのアクセスに対応)

  <form action="/tasks" method="post" ・・・
  ↓
  <form action="{{ url('/tasks') }}" method="post" ・・・

  <form action="/tasks/{{ $task->id }}" method="post" ・・・
  ↓
  <form action="{{ url('/tasks')}}/{{ $item->id }}" method="post" ・・・
        
・セッション情報の権限問題
 ローカル実行時と、Apache2経由での実行で、ファイルの権限でエラー発生
kokaki@skynew:~$ rm -r (アプリケーションディレクトリ)/storage/framework/sessions/
 →削除すればよい

■LaravelでSQLiteデータベースを使ってみよう


・SQLiteデータベースの作成(Laravel10の場合、事前に作成しなくてもよい)

※config/database.php内の記述「database.sqlite」に合わせる
kokaki@skynew:~/www/laravel/testapp$ touch database/database.sqlite
config/database.php内の記述抜粋

  'connections' => [

      'sqlite' => [
          'driver' => 'sqlite',
          'database' => env('DB_DATABASE', database_path('database.sqlite')),
          'prefix' => '',
          'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
      ],
        
・.envファイルの編集
kokaki@skynew:~/www/laravel/testapp$ vi .env

  DB_CONNECTION=mysql
  DB_HOST=127.0.0.1
  DB_PORT=3306
  DB_DATABASE=laravel10
  DB_USERNAME=root
  DB_PASSWORD=
  ↓
  DB_CONNECTION=sqlite
        
・php artisan migrateでテーブルの作成
kokaki@skynew:~/www/laravel/testapp$ php artisan migrate

    Illuminate\Database\QueryException

  could not find driver (Connection: sqlite, SQL: PRAGMA foreign_keys = ON;)

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:829
    825▕                     $this->getName(), $query, $this->prepareBindings($bindings), $e
    826▕                 );
    827▕             }
    828▕
  ➜ 829▕             throw new QueryException(
    830▕                 $this->getName(), $query, $this->prepareBindings($bindings), $e
    831▕             );
    832▕         }
    833▕     }

      +40 vendor frames

  41  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()
        
※エラーが発生
→phpでsqliteがインストールされていないらしい。。。

・SQLiteモジュールのインストール
kokaki@skynew:~/www/laravel/testapp$ sudo apt install -y php8.1-sqlite3

  Reading package lists... Done
  Building dependency tree... Done
  Reading state information... Done
  The following NEW packages will be installed:
    php8.1-sqlite3
  0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
  Need to get 32.2 kB of archives.
  After this operation, 139 kB of additional disk space will be used.
  Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 php8.1-sqlite3 amd64 8.1.2-1ubuntu2.14 [32.2 kB]
  Fetched 32.2 kB in 1s (34.3 kB/s)
  Selecting previously unselected package php8.1-sqlite3.
  (Reading database ... 72071 files and directories currently installed.)
  Preparing to unpack .../php8.1-sqlite3_8.1.2-1ubuntu2.14_amd64.deb ...
  Unpacking php8.1-sqlite3 (8.1.2-1ubuntu2.14) ...
  Setting up php8.1-sqlite3 (8.1.2-1ubuntu2.14) ...
  
  Creating config file /etc/php/8.1/mods-available/sqlite3.ini with new version
  
  Creating config file /etc/php/8.1/mods-available/pdo_sqlite.ini with new version
  Processing triggers for libapache2-mod-php8.1 (8.1.2-1ubuntu2.14) ...
  Processing triggers for php8.1-cli (8.1.2-1ubuntu2.14) ...
        
kokaki@skynew:~/www/laravel/testapp$ sudo service apache2 restart

・php artisan migrateでテーブルの作成(リトライ)
kokaki@skynew:~/www/laravel/testapp$ php artisan migrate

    INFO  Preparing database.

  Creating migration table ................................................................................. 14ms DONE

    INFO  Running migrations.

  2014_10_12_000000_create_users_table ..................................................................... 28ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ..................................................... 12ms DONE
  2019_08_19_000000_create_failed_jobs_table ............................................................... 24ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .................................................... 27ms DONE
  2024_02_07_133544_create_tasks_table ...................................................................... 9ms DONE
        
・アプリケーションで使用時、エラーが発生

  SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
        
・データベースファイルの書き込み権限を追加
 ユーザ「kokaki」で作成、「www-data」で使用するため
kokaki@skynew:~/www/laravel/testapp$ sudo chmod -R 777 database/



■ディレクトリ作成
kokaki@skynew:~$ mkdir /home/kokaki/www/laravel/todo2
kokaki@skynew:~$ cd /home/kokaki/www/laravel/todo2/

■プロジェクト作成
kokaki@skynew:~/www/laravel/todo2$ composer create-project --prefer-dist laravel/laravel .

        :
        :
        :
  Use the `composer fund` command to find out more!
  > @php artisan vendor:publish --tag=laravel-assets --ansi --force
  
      INFO  No publishable resources for tag [laravel-assets].
      
  No security vulnerability advisories found.
  > @php artisan key:generate --ansi
  
      INFO  Application key set successfully.
        
■権限設定(オーナー)
kokaki@skynew:~/www/laravel/todo2$ sudo chown -R :www-data /home/kokaki/www/laravel/todo2/storage
kokaki@skynew:~/www/laravel/todo2$ sudo chown -R :www-data /home/kokaki/www/laravel/todo2/bootstrap/cache

■権限設定(アクセス)
kokaki@skynew:~/www/laravel/todo2$ sudo find ./ -type d -exec chmod 755 {} \;
kokaki@skynew:~/www/laravel/todo2$ sudo find ./ -type f -exec chmod 644 {} \;

■環境設定(国別指定)
kokaki@skynew:~/www/laravel/todo2$ vi config/app.php

  'timezone' => 'Asia/Tokyo',
  'locale' => 'ja',
  'fallback_locale' => 'ja',
  'faker_locale' => 'ja_JP',
           
■データベース設定
kokaki@skynew:~/www/laravel/todo2$ vi .env

  #DB_CONNECTION=mysql
  #DB_HOST=127.0.0.1
  #DB_PORT=3306
  #DB_DATABASE=laravel
  #DB_USERNAME=root
  #DB_PASSWORD=
  DB_CONNECTION=sqlite
        
■プロジェクト実行
kokaki@skynew:~/www/laravel/todo2$ php artisan serve

http://localhost:8000/

■テーブル作成(DBも作る)
kokaki@skynew:~/www/laravel/todo2$ php artisan make:migration create_tasks_tablele

  INFO  Migration [database/migrations/2024_02_16_092723_create_tasks_table.php] created successfully.
        
kokaki@skynew:~/www/laravel/todo2$ vi database/migrations/2024_02_16_092723_create_tasks_table.php

  public function up(): void
  {
      Schema::create('tasks', function (Blueprint $table) {
          $table->id();
          $table->string('name', 100);
          $table->boolean('status')->default(false);
          $table->timestamp('updated_at')->useCurrent()->nullable();
          $table->timestamp('created_at')->useCurrent()->nullable();
      });
  }
        
kokaki@skynew:~/www/laravel/todo2$ php artisan migrate

    WARN  The SQLite database does not exist: database/database.sqlite.

  ┌ Would you like to create it? ────────────────────────────────┐
  │ Yes                                                          │
  └──────────────────────────────────────────────────────────────┘

    INFO  Preparing database.

  Creating migration table ................................................................................. 15ms DONE

    INFO  Running migrations.

  2014_10_12_000000_create_users_table ..................................................................... 21ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ...................................................... 8ms DONE
  2019_08_19_000000_create_failed_jobs_table ............................................................... 18ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .................................................... 26ms DONE
  2024_02_16_092723_create_tasks_table ..................................................................... 10ms DONE
        
■モデルを作る
kokaki@skynew:~/www/laravel/todo2$ php artisan make:model Task

  INFO  Model [app/Models/Task.php] created successfully.
        
kokaki@skynew:~/www/laravel/todo2$ php artisan make:controller TaskController --resource

  INFO  Controller [app/Http/Controllers/TaskController.php] created successfully.
        
■ルーティング情報
kokaki@skynew:~/www/laravel/todo2$ vi routes/web.php

  use Illuminate\Support\Facades\Route;
  use App\Http\Controllers\TaskController;    // 追加
  
  Route::get('/', function () {
      return view('welcome');
  });
  
  Route::resource('tasks', TaskController::class);    // 追加
        
kokaki@skynew:~/www/laravel/todo2$ php artisan route:list

  GET|HEAD        / ..................................................................................................
  POST            _ignition/execute-solution ignition.executeSolution › Spatie\LaravelIgnition › ExecuteSolutionContr…
  GET|HEAD        _ignition/health-check ....... ignition.healthCheck › Spatie\LaravelIgnition › HealthCheckController
  POST            _ignition/update-config .... ignition.updateConfig › Spatie\LaravelIgnition › UpdateConfigController
  GET|HEAD        api/user ...........................................................................................
  GET|HEAD        sanctum/csrf-cookie .............. sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show
  GET|HEAD        tasks ........................................................... tasks.index › TaskController@index
  POST            tasks ........................................................... tasks.store › TaskController@store
  GET|HEAD        tasks/create .................................................. tasks.create › TaskController@create
  GET|HEAD        tasks/{task} ...................................................... tasks.show › TaskController@show
  PUT|PATCH       tasks/{task} .................................................. tasks.update › TaskController@update
  DELETE          tasks/{task} ................................................ tasks.destroy › TaskController@destroy
  GET|HEAD        tasks/{task}/edit ................................................. tasks.edit › TaskController@edit

                                                                                                           Showing [13] routes
        
kokaki@skynew:~/www/laravel/todo2$ mkdir resources/views/tasks
kokaki@skynew:~/www/laravel/todo2$ touch resources/views/tasks/index.blade.php
kokaki@skynew:~/www/laravel/todo2$ touch resources/views/tasks/edit.blade.php
kokaki@skynew:~/www/laravel/todo2$ mkdir resources/views/layout
kokaki@skynew:~/www/laravel/todo2$ touch resources/views/layout/layout.blade.php
kokaki@skynew:~/www/laravel/todo2$ touch resources/views/layout/tab-header.blade.php


Laravel入門 初回ガイダンス(第1回)


  tasks
  論理名    |物理名     |型                    |制約    |補足
  ID        |id         |bigserial             |not null|pk
  タスク名  |title      |character varying(40) |not null|
  ステータス|ststus     |integer               |not null|
  概要      |description|character varying(200)|        |
  作成日    |created_at |timestamp             |        |
  更新日    |updated_a t|timestamp             |        |
  
  create table tasks (
    id integer not null primary key
    , title var(40) not null
    , status integer not null
    , description varchar(200)
    , created_at timestamp
    , updated_at timestamp
  ) ;
  
    Schema::create('todos', function (Blueprint $table) {
        $table->id();
        $table->string('title', 40);
        $table->boolean('status')->default(false);
        $table->string('description', 200);
        $table->timestamp('created_at')->useCurrent()->nullable();
        $table->timestamp('updated_at')->useCurrent()->nullable();
    });
  
  INSERT INTO tasks (title,status,description) VALUES ('bitcoinの半減期を調べる',1,'bitcoinの半減期と価格の相関性を調べる');
  INSERT INTO tasks (title,status,description) VALUES ('サンフランシスコ旅行',1,'サンノゼ空港からパロ・アルトへの行き方を調べる');
  INSERT INTO tasks (title,status,description) VALUES ('アクアパッツァ',1,'再来週の食事会のためにアクアパッツァの作り方を学ぶ');
  INSERT INTO tasks (title,status,description) VALUES ('サンフランシスコ行きの航空券',1,'羽田からサンノゼ空港行きのチケットを予約');
        

Laravelの認証機能を徹底解説

入門者のためのLaravelのバリデーションとエラーメッセージ