20210117のlaravelに関する記事は6件です。

laravel 認証試す

Laravel8系で公式が用意している認証を試す。

Laravelプロジェクトを作成

$ composer create-project laravel/laravel

laravel uiを追加

composer require laravel/ui

laravel uiではなくLaravel BreezeやJetstreamを使うよう案内されているがとりあえずlaravel uiを使う

https://github.com/laravel/ui

This legacy package is a very simple authentication scaffolding built on the Bootstrap CSS framework. While it continues to work with the latest version of Laravel, you should consider using Laravel Breeze for new projects. Or, for something more robust, consider Laravel Jetstream.

laravel uiをインストールするとコマンドが二つ使用可能になる。
ui:authでlogin等に使うviewを作成し、ui:contollersでLogincontroller等を作成する。

$ php artisan list
省略...
 ui
  ui:auth              Scaffold basic login and registration views and routes
  ui:controllers       Scaffold the authentication controllers
$ php artisan ui:auth
$ php artisan ui:controllers

route追加

ログイン後にリダイレクトされるHomeController@indexとauthに必要なrouteを追加

web.php
Route::middleware('auth:web')->group(function () {
    Route::get('/home', [\App\Http\Controllers\HomeController::class, 'index']);
});
\Illuminate\Support\Facades\Auth::routes();

webサーバー起動

dbセットアップの後php artisan serveでwebサーバーを起動する。

http://127.0.0.1:8000/
スクリーンショット 2021-01-17 20.46.22.png

右上でログイン/ログアウトできる。

authミドルウェアを読む

Kernel.phpのrouteMiddlewareにauthが登録されている。authというkeyでAuthenticate::classが使用される。

Kernel.php
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,

Authenticate.phpはIlluminate\Auth\Middleware\Authenticateを継承している。

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware

Illuminate\Auth\Middleware\Authenticate を読む

handle関数ではauthenticate関数が実行される。

    public function handle($request, Closure $next, ...$guards)
    {
        $this->authenticate($request, $guards);

        return $next($request);
    }

指定されたguardsを全てcheckし、guardが通ればshouldUseを実行。全てチェックに失敗すればunauthenticatedを実行する。

    // 第二引数のguardsは `Route::middleware('auth:web')` で指定した時のwebが与えられる。
    protected function authenticate($request, array $guards)
    {
        // 引数が指定されていない場合はnullを持つ配列にする。
        // $this->auth->guardでnullを渡すとconfigのauth.phpのdefault guardが使用される。
        if (empty($guards)) {
            $guards = [null];
        }


        foreach ($guards as $guard) {
            // `$this->auth` で参照されるインスタンスはコンストラクタでDIされる。
            // Authの型はIlluminate\Foundation\Applicationで指定されており、\Illuminate\Auth\AuthManager::classになる。
            // $this->auth->guard関数でguard文字列からguardの実態を返す
            // check関数で現在のユーザーが認証されているかどうかを判断します。
            if ($this->auth->guard($guard)->check()) {
                // 認証済みのguardがあればデフォルトドライバーとして登録する
                return $this->auth->shouldUse($guard);
            }
        }

        // 未認証の場合はunauthenticatedを実行
        $this->unauthenticated($request, $guards);
    }

guardの実態は↓の命名規則で決まる \Illuminate\Auth\AuthManager の関数で返されるインスタンスか、カスタムガード登録時に指定したインスタンスになる。

        $driverMethod = 'create'.ucfirst($config['driver']).'Driver';
        if (method_exists($this, $driverMethod)) {
            return $this->{$driverMethod}($name, $config);
        }

https://qiita.com/tomoeine/items/40a966bf3801633cf90f#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0-guard-%E3%81%AF%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E7%99%BB%E9%8C%B2%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%98%E3%82%83

unauthenticated関数

unauthenticatedでは認証エラーをスローする。redirectToでリダイレクトさせるpathを指定することが可能。

    protected function unauthenticated($request, array $guards)
    {
        throw new AuthenticationException(
            'Unauthenticated.', $guards, $this->redirectTo($request)
        );
    }

session driver

guardにsessionを指定するとAuthManager.phpのcreateSessionDriver関数が実行され、SessionGuardインスタンスが作成される。

SessionGuardのcheck関数で現在のユーザーが認証されているかどうかを判断する。check関数自体はGuardHelpers traitで実装されている。

    public function check()
    {
        return ! is_null($this->user());
    }

$this->user()はGuardHelpersを実装したクラスで実装されている。

session driverのuser関数

セッションからuserを取り出して返す。

    public function user()
    {
        if ($this->loggedOut) {
            return;
        }

        // If we've already retrieved the user for the current request we can just
        // return it back immediately. We do not want to fetch the user data on
        // every call to this method because that would be tremendously slow.
        if (! is_null($this->user)) {
            return $this->user;
        }

        // getName()はガードに付けられた名前で、基本的にはwebになる
        $id = $this->session->get($this->getName());

        // First we will try to load the user using the identifier in the session if
        // one exists. Otherwise we will check for a "remember me" cookie in this
        // request, and if one exists, attempt to retrieve the user using that.
        if (! is_null($id) && $this->user = $this->provider->retrieveById($id)) {
            $this->fireAuthenticatedEvent($this->user);
        }

        // If the user is null, but we decrypt a "recaller" cookie we can attempt to
        // pull the user data on that cookie which serves as a remember cookie on
        // the application. Once we have a user we can return it to the caller.
        if (is_null($this->user) && ! is_null($recaller = $this->recaller())) {
            $this->user = $this->userFromRecaller($recaller);

            if ($this->user) {
                $this->updateSession($this->user->getAuthIdentifier());

                $this->fireLoginEvent($this->user, true);
            }
        }

        return $this->user;
    }

ログイン処理を追う

laravel ui でログイン用のコントローラーが作成される。
具体的な処理はAuthenticatesUsersで実装されている

LoginController.php
class LoginController extends Controller
{
    use AuthenticatesUsers;

ログイン処理では
1. requestのvalidateチェック
2. ログイン試行回数チェック
3. attemptLoginでログインを試す
4. ログインに失敗したらログイン試行回数をインクリメント

AuthenticatesUsers.php
    public function login(Request $request)
    {
        $this->validateLogin($request);

        // If the class is using the ThrottlesLogins trait, we can automatically throttle
        // the login attempts for this application. We'll key this by the username and
        // the IP address of the client making these requests into this application.
        if (method_exists($this, 'hasTooManyLoginAttempts') &&
            $this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        if ($this->attemptLogin($request)) {
            return $this->sendLoginResponse($request);
        }

        // If the login attempt was unsuccessful we will increment the number of attempts
        // to login and redirect the user back to the login form. Of course, when this
        // user surpasses their maximum number of attempts they will get locked out.
        $this->incrementLoginAttempts($request);

        return $this->sendFailedLoginResponse($request);
    }

attemptLogin

requestから認証に必要な情報を取得してguardに渡してログインを試す

    protected function attemptLogin(Request $request)
    {
        // `$this->guard()`では`Auth::guard()`が実行され、configのauth.phpのデフォルトガード(で指定されているドライバー)が返される。
        // credentials関数でuserNameとpasswordだけ抽出する
        return $this->guard()->attempt(
            $this->credentials($request), $request->filled('remember')
        );
    }

SessionGuardのattempt

デフォルトでWebガードが指定されているのでSessionGuardのattemptを見る。
$this->provider->retrieveByCredentialsでuserを取得し、$this->hasValidCredentials($user, $credentials)で認証している。
認証に通ればlogin関数を実行する

    public function attempt(array $credentials = [], $remember = false)
    {
        $this->fireAttemptEvent($credentials, $remember);

        $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

        // If an implementation of UserInterface was returned, we'll ask the provider
        // to validate the user against the given credentials, and if they are in
        // fact valid we'll log the users into the application and return true.
        if ($this->hasValidCredentials($user, $credentials)) {
            $this->login($user, $remember);

            return true;
        }

        // If the authentication attempt fails we will fire an event so that the user
        // may be notified of any suspicious attempts to access their account from
        // an unrecognized user. A developer may listen to this event as needed.
        $this->fireFailedEvent($user, $credentials);

        return false;
    }

プロバイダーはCreatesUserProviders traitのcreateUserProvider関数で作成しており、Eloquentプロバイダーの場合はEloquentUserProvider.phpインスタンスが使用される。
EloquentUserProviderのretrieveByCredentials関数は以下になっている。
引数のcredentialsを使ってqueryを組み立てていることが分かる。ポイントとしてここではqueryにパスワードは含めない。
email/passwordでログインする場合はここではemailのみを使ったqueryになる。
ちなみにretrieve(リトリーブ)は取り出すと言う意味。retryと文字が似ているが関係ない。

    public function retrieveByCredentials(array $credentials)
    {
        if (empty($credentials) ||
           (count($credentials) === 1 &&
            Str::contains($this->firstCredentialKey($credentials), 'password'))) {
            return;
        }

        // First we will add each credential element to the query as a where clause.
        // Then we can execute the query and, if we found a user, return it in a
        // Eloquent User "model" that will be utilized by the Guard instances.
        $query = $this->newModelQuery();

        foreach ($credentials as $key => $value) {
            // パスワードはここではチェックしない
            if (Str::contains($key, 'password')) {
                continue;
            }

            if (is_array($value) || $value instanceof Arrayable) {
                $query->whereIn($key, $value);
            } else {
                $query->where($key, $value);
            }
        }

        return $query->first();
    }

hasValidCredentials関数で認証情報と一致しているかチェックする
条件は
1. userが取得できている
2. providerを使った秘密情報のvalidateに成功する

    protected function hasValidCredentials($user, $credentials)
    {
        $validated = ! is_null($user) && $this->provider->validateCredentials($user, $credentials);

        if ($validated) {
            $this->fireValidatedEvent($user);
        }

        return $validated;
    }

validateCredentials関数は以下になっており、ユーザーが指定したパスワードとハッシュ化して保存してあるuserレコードのパスワードを一致判定している。

    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['password'];

        return $this->hasher->check($plain, $user->getAuthPassword());
    }

SessionGuardのlogin処理

providerによるuserの取得と認証検証に成功するとlogin処理が実行される。
ここでは以下が行われる。
1. sessionの更新
2. remember処理
3. $userを認証済みuserとして登録

    public function login(AuthenticatableContract $user, $remember = false)
    {
        $this->updateSession($user->getAuthIdentifier());

        // If the user should be permanently "remembered" by the application we will
        // queue a permanent cookie that contains the encrypted copy of the user
        // identifier. We will then decrypt this later to retrieve the users.
        if ($remember) {
            $this->ensureRememberTokenIsSet($user);

            $this->queueRecallerCookie($user);
        }

        // If we have an event dispatcher instance set we will fire an event so that
        // any listeners will hook into the authentication events and run actions
        // based on the login and logout events fired from the guard instances.
        $this->fireLoginEvent($user, $remember);

        $this->setUser($user);
    }

sessionの更新

    protected function updateSession($id)
    {
        $this->session->put($this->getName(), $id);

        $this->session->migrate(true);
    }

sessionのキーは↓の書式になる

    public function getName()
    {
        return 'login_'.$this->name.'_'.sha1(static::class);
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【コピペ】Docker ComposeでLaravel開発環境を構築その参

前回、docker-compose.yml達と一緒にLaravelをリポジトリ管理して、かなりスッキリした。
【コピペ】Docker ComposeでLaravel開発環境を構築その弐

でも、ふと思った、、、Laravelは別リポジトリで管理したいな。。。

マシンスペック

  • Mac mini 2018
  • macOS Catalina(10.15.x)
  • Intel Core-i7 3.2GHz 6コア
  • メモリ 32GB
  • SSD 512GB

やること

  • Docker Compose環境のLaravelを別リポジトリにする

前提条件

  • 空リポジトリを用意しておく

Docker Compose環境の準備

【コピペ】Docker ComposeでLaravel開発環境を構築その弐#使い方

src/laravelを別リポジトリにする

[Mac]$ pwd
/Users/xxx/docker
[Mac]$ cd src
[Mac]$ mv laravel laravel_bak
[Mac]$ git clone <前提条件で用意したリポジトリURL> laravel
[Mac]$ cp -pR laravel_bak/. laravel

以降は、IDEで src/laravel を開いてプッシュする

※注)dockerをIDEで開くと、dockerの方のリポジトリにプッシュされるので、src/laravelを開くこと!

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

Laravelの実行環境を一から構築する

Laravelには「Homestead」と「Laradock」があり、簡単に開発環境を用意することができます。しかし、これらを本番環境で使用することはできませんし、Dockerやサーバーレスを使わない場合は一から環境を構築する必要があります。この記事では、Laravelの実行環境を一から構築する手順を説明します。

使用ソフトウェア・バージョン

  • Laravel 8.21.0
  • PHP 8.0(PHP-FPM)
  • Nginx 1.18.0
  • MySQL 8.0.22
  • Ubuntu 20.04

*Dockerは使いません

参考にしたコード

HomesteadはLaravel公式の開発環境ですが、Homesteadを構築するコードがGitHubで公開されています。

laravel/settler

scripts/provision.sh」に環境を構築するコードが記述されています。Homesteadは多様な環境に対応できるよう多くのパッケージをインストールしているため、このコードを参考に必要なものだけインストールするようにします。

実行手順

1.PHPのインストール
2.php.iniの設定
3.PHP-FPMユーザーの作成
4.PHP-FPMの設定
5.Nginxの設定
6.Composerのインストール
7.Laravelのインストール・設定

1.PHPのインストール

  • ppa:ondrej/phpリポジトリをシステムに追加する
  • PHP8(PHP-FPM)および拡張機能のインストール

PHPのバージョン選定

まずPHPのバージョンを選定します。利用可能なもののうち最も新しいバージョンが好ましいですが、環境によっては最新のものが利用できない場合があります。

Ubuntu20.04(LTS)の場合、apt-get installでインストールできるバージョンはPHP7.4のため、現時点(2021年1月)で最新のPHP8がインストールできません。そのため、PPAを使ってインストールするようにします。

PPA(Personal Package Archive)は個人が管理している非公式のリポジトリです。最新のパッケージが使えますがアップデートの保証はないため、リポジトリの選定と扱いには気を付ける必要があります。PHPのインストールには以下のPPAを使います。

ppa:ondrej/php

このリポジトリは、Debianの開発者でありPHP5の頃からパッケージ管理を行っている人のもので、公式パッケージもこのリポジトリを採用していることから信頼できるリポジトリと言えます。

ppa:ondrej/php開発者のページ

また、調べたところUbuntu公式のPHPパッケージのリリースは1年ほど前でしたが(更新されていない)、PPAは1ヶ月程度でアップデートされています。PPAの方がセキュリティパッチが更新される頻度が多いためより安全であると思われます。

・ppa:ondrej/phpリポジトリをシステムに追加する

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

Laravelのサーバー要件

次にPHPをインストールしますが、まずは公式ホームページでLaravel 8.×のサーバー要件を確認します。

Laravelのサーバー要件

  • PHP >= 7.3
  • BCMath PHP Extension
  • Ctype PHP Extension
  • Fileinfo PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

太字の「BCMath」「Mbstring」「XML」以外はPHPをインストールすると有効になるため、PHPおよび3つの拡張機能をインストールすれば要件を満たすことができます。

・PHP8(PHP-FPM)および拡張機能のインストール(ppa:ondrej/php)

sudo apt-get install php8.0-fpm php8.0-bcmath php8.0-mbstring php8.0-xml php8.0-mysql php8.0-zip

php-fpmとLaravelに必要な3つの拡張機能およびMySQL拡張機能をインストールしています。php8.0-zipはLaravelのインストールで必要になります。

*NginxではなくApacheを使う場合は「php8.0-fpm」ではなく「php8.0」をインストールしてください。Apacheおよび関連パッケージがインストールされます。

php8.0-fpmには以下のパッケージも含まれています。

php-common php8.0-cli php8.0-opache php8.0-readline

これらはLaravelが動作する最低限の拡張機能であるため、必要になった時点で他のパッケージもインストールしましょう。上記で紹介した「laravel/settler」のprovision.shでは、どのような拡張機能を使用しているか確認することができます。またPHP開発者の新原さんのブログも参考になると思います。

Shin x Blog

2.php.iniの設定

  • FPMとCLIのphp.iniを設定する

PHPの設定ファイルは以下の2つです。

  • /etc/php/8.0/fpm/php.ini(FPM)
  • /etc/php/8.0/cli/php.ini(CLI)

これらのファイルは本番用の推奨設定ファイルである以下と同じものです。

  • /usr/lib/php/8.0/php.ini-production(FPM)
  • /usr/lib/php/8.0/php.ini-production.cli(CLI)

・FPMとCLIのphp.iniを設定する

*以下は「FPM」「CLI」両方の設定ファイルで変更

memory_limit = 512M
date.timezone = "Asia/Tokyo"

*以下は「FPM」の設定ファイルでのみ変更

upload_max_filesize = 100M
post_max_size = 100M

なお、これらの値はHomesteadで使用されている値ですので、環境に応じて適切な値を設定してください。

また、開発環境の場合はエラーを表示するように設定します。

error_reporting = E_ALL
display_errors = On

3.PHP-FPMユーザーの作成

  • 新規ユーザー作成
  • デフォルトのパーミッション設定
  • authorized_keysの設定
  • デプロイディレクトリの作成

PHP-FPMをインストールするとデフォルトのユーザーである「www-data」が作成されます。このwww-dataまたはnginxユーザーを使用することもできますが、セキュリティ上好ましくないため新たにPHP-FPMユーザー(PHP実行ユーザー)を作成します。

PHP-FPMとNginxのユーザーおよびパーミッションについては以下の記事が参考になります。

NGINX and PHP-FPM. What my permissions should be?

・新規ユーザーの作成

sudo useradd phpuser

このユーザーにはsudo権限は与えません。また、第三者がファイルを操作できないよう「.bashrc」に以下を追記します。

・デフォルトのパーミッション設定

umask 0027

パーミッションは以下のようになります。

  • ディレクトリ 750
  • ファイル 640

SSHログインまたはdeployerを使う場合は認証が必要となるため、以下に公開鍵を設定しておきます。

・authorized_keysの設定

/home/phpuser/.ssh/authorized_keys

・デプロイディレクトリの作成

sudo mkdir /var/www 
sudo chown phpuser:phpuser /var/www 
sudo chmod 750 /var/www

デプロイ先は「/var/www」でなくても構いませんが、PHP-FPMユーザーを所有者としパーミッションを750に設定しましょう。

4.PHP-FPMの設定

  • PHP-FPMの設定ファイルを編集する
  • PHP-FPMを再起動する

新しく作成したユーザーをPHP-FPMのユーザーとして設定します。

・PHP-FPMの設定ファイルを編集する

sudo vi /etc/php/8.0/fpm/pool.d/www.conf

user = phpuser
group = phpuser
listen = /run/php/php8.0-fpm.sock *UNIXドメインソケット(デフォルトのまま)
listen.owner = phpuser *Unixドメインソケットを使う場合に設定が必要
listen.group = phpuser

UnixドメインソケットではなくTCP接続を行う場合は下記のように「IPアドレス:ポート番号」で設定します。

listen = 127.0.0.1:9000

・PHP-FPMを再起動する

sudo systemctl restart php8.0-fpm

5.Nginxの設定

  • NginxユーザーにPHP-FPMグループを加える
  • 設定ファイルを編集 /etc/nginx/conf.d/default.conf
  • Nginxの再起動

*Nginxは公式を参照してインストールしてください

Nginxのインストール

・NginxユーザーにPHP-FPMグループを加える

sudo gpasswd -a nginx phpuser

これはNginxがPHP-FPMと通信を行う際にパーミッションエラーを起こさないようにするための措置です。

続いて、Laravel公式の設定例を参考にして設定ファイルを編集します。

Laravel用のNginx設定

変更する箇所は以下になります。

・設定ファイルを編集 /etc/nginx/conf.d/default.conf

server_name localhost; *本番はドメイン名
root /home/ubuntu/laravel/public *開発環境
root /var/www/current/public; *本番環境(deployerを使う場合)
fastcgi_pass unix:/run/php/php8.0-fpm.sock;

rootディレクティブには、Laravelの公開ディレクトリ(public)のパスを指定します。上記はdeployerを使って「/var/www/」に「laravel」というプロジェクト名でデプロイした場合のディレクトリになります。開発環境の場合はデフォルトユーザーであるubuntuのホームディレクリで良いかと思います。

・Nginxの再起動

sudo systemctl restart nginx

6.Composerのインストール

Composerは公式に参照してインストールしてください。

Composerのインストール

7.Laravelのインストール・設定

  • Laravelのインストール
  • 「.env」の編集
  • config/database.phpの編集
  • config/app.phpの編集
  • パーミッションの設定

ユーザーUbuntuのホームディレクリでLaravelをインストールします。

・Laravelのインストール

composer create-project --prefer-dist laravel/laravel laravel(プロジェクト名)

バージョンを指定する場合は「laravel/laravel」の後に「=」を付けて指定します。

例:laravel/laravel=8.4.0

「--prefer-dist」オプションはzipでダウンロードするので高速です。

以下のコマンドでインストールされたバージョンを確認します。

cd laravel
php artisan -V

インストール完了後「.env」「config/databse.php」「config/app.php」の3つの設定ファイルを編集します。

MySQLを使う場合は「.env」に以下を設定します。

・「.env」の編集

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mysql *データベース名
DB_USERNAME=mysql-user
DB_PASSWORD=mysql-password

「.env」ファイルは機密情報を含みgit管理下に含まれないため、別途保存しておいてデプロイ時にコピーする必要があります。

データベースの設定ファイルは「.env」以外に「config/databse.php」があります。このファイルは「.env」に値が設定されていない場合にのみ適用されます。そのため、必要な箇所のみ変更します。

・config/database.phpの編集

'connections' => [
  'mysql' => [
    'collation' => 'utf8mb4_bin',

MySQLのcollation(照合順序)である「utf8mb4_bin」は、大文字・小文字、ひらなが・カタカナ、絵文字などすべての文字を異なるものとして判定します。日本語を使う場合に適したcollationです。

続いて、app.phpでタイムゾーンを東京に変更します。

・config/app.phpの編集

'timezone' => 'Asia/Tokyo',

最後に、laravelディレクリのパーミッションをディレクトリ(755)ファイル(640)にしておきます。

・パーミッションの設定

chmod -R u=rwX,g=rX,o= /home/ubuntu/laravel

以上で環境の構築は完了です。開発環境であればlocalhostにアクセスするとLaravelのwelcomeページが表示されるはずです。これらの手順を毎回実行するのは煩雑なので、Ansible等を使うまたはスクリプト化して自動で行うことをお勧めします。

laravel.png

終わりに

LaravelにはHomesteadやLaradockなど開発環境を簡単に用意できるものがありますが、一から構築するとなるとなかなか大変です。PHPパッケージのインストールやPHP-FPM/Nginxの設定など、まとまった情報がなかったので今回まとめて記事にしました。環境構築の一助になれば幸いです。

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

Laravel 多対多。野球選手を例にして考えてみる

Laravel多対多について

多対多の概念や使い方が難しかったので、野球選手とポジションを例に考えてみる。
野球選手:ポジション

例えば、

選手目線

大谷は投手と外野の複数のポジションを守れる

ポジション目線

外野は大谷とイチロ-が守れる
このとき、野球選手とポジションは多対多の関係にあるといえる
この考えから下記のテーブルを作成する。

users(選手)目線

イチロー(1):外野(4)
大谷(2):投手(1)、外野(4)
阿部(3):捕手(2)、内野(3)

ポジション目線

投手(1):大谷(2)
捕手(2):阿部(3)
内野(3):阿部(3)
外野(4):イチロー(1)と大谷(2)
image.png

image.png

image.png

このとき、選手目線からみたポジションの情報がほしいときは下記のModelを作成する

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Member extends Model
{

    public function potisions()
    {
                // 第2,3,4引数は省略できる
                // 実際は第2:users_positions 第3:users_id 第4:positions_id 
        return $this->belongsToMany('App\Potision');
    }

}

このModelを使えば、選手目線の情報(例えば大谷は投手と外野)が取得できる。
逆にポジション目線の情報(例えば外野はイチローと大谷)が欲しい場合は下記のモデルを作成する。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Potision extends Model
{
      public function members()
    {
                // 第2,3,4引数は省略できる
        return $this->belongsToMany('App\User');
    }  
}

これらのModelを使って情報を取得する。

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

laravel 背景画像を固定化させる方法

はじめに

  1. 今回、久々にHTML CSSを編集して画像を背景にしたいと思い備忘録で投稿させて頂きます。
  2. 画面をスクロールしても背景は固定化されている。
  3. 背景の大きさは画面一杯に設定します。
  4. Asset関数を使用してフォルダを参照します。
  5. 写真素材はこちらでDLしました。写真AC

HTMLの編集

HTMLとCSSを結びつけるasset関数を記述して下さい。
<link rel="stylesheet" href="{{ asset('css/sample.css') }}">
これをhead内に記述して下さい。

sample.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Sample Title</title>
    <link rel="stylesheet" href="{{ asset('css/sample.css') }}">//これを記述して下さい
</head>
<body>
</body>

Asset関数とは

laravel独自のヘルパ関数の一つです。
画像やCSS、JavaScriptといったリソースデータの読み込みをする際に使います。
極論に言うと、publicフォルダの中を確実に参照させるために使います。
因みに{{}} の意味は、xssの対策です。

CSSの編集

sample.css
body {
  width: 100%;
  height:100vh;
  background-image: url(../images/4317917_m.jpg);  
  background-position: center center; 
  background-repeat: no-repeat;  
  background-attachment: fixed; 
  background-size: cover;
 }

background-imageを使って画像を呼び出し

background-image: url(../images/4317917_m.jpg);
..は一つ上の階層フォルダを参照しているという意味になります。
/images imagesというフォルダ(CSSと同じ位置に作ったフォルダ)を参照する。
最後に画像の名前をコピペ+拡張子も必ず記述。

background-position: center center

画像を常に上下左右の中央に配置させる。

background-repeat: no-repeat;

画像を繰り返し表示しないようにする。

background-attachment: fixed;

ページなどのコンテンツの高さが画像より大きい場合は自動で調整してくれる。

background-size: cover;

画面、ブラウザのサイズに基づいて、背景画像を調整。
このように画像いっぱいに画面を調整してくれます。以上です。
“スクリーンショット” 2021-01-16 19.34.37.jpg

参考にしたURL

テックアカデミー
背景画像をブラウザいっぱいに表示しているCSS記述方法

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

Lravelを初めて導入した

Laravelを初めて使用して、導入に成功したのでアウトプットのために記事を投稿します。

まずは、PHPをインストールします。MacにはデフォルトでPHPが使用できるそうですが、Laravelをインストールする場合にはPHPもインストールします。

brew install php@7.4

今回は、Laravel6を使用します。
Laravel6はPHP7.2以降に対応しているため7.4をインストールします。

次にComposerをインストールします。
ComposerはPHPのパッケージを管理することができます。

brew install composer

その後、Laravelをインストール

composer global require "laravel/installer"

この後、laravelのコマンドを使用できるように設定します。(php artisan serve)など

その後、laravelのプロジェクトを起動してサーバーを立ち上げます。

composer create-project laravel/laravel プロジェクト名 --prefer-dist バージョン
php artisan serve

するとサーバーが立ち上がり、Laravelのトップページが表示されていれば成功です。

ちなみに「rails s]だとローカルホストのポート番号は3000でしたが、「php artisan serve」の場合は番号が8000になります。

以上、アウトプットのために投稿させていただきました。

初投稿でしたが、今後も少しずつ投稿していきたいと思いますので、宜しくお願いいたします。

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