Laravel 5.2 認証

イントロダクション

Laravelでは簡単に認証が実装できます。実際ほとんど全て最初から設定済みです。認証の設定ファイルはconfig/auth.phpに用意してあり、認証サービスの振る舞いを調整できるように、読みやすいコメント付きでたくさんのオプションが用意されています。

Laravelの認証機能は「ガード」と「プロバイダ」を中心概念として構成されています。ガードは各リクエストごとに、どのようにユーザを認証するかを定義します。たとえば、Laravelにはセッションストレージとクッキーを使いながら状態を維持するsessionガードと、各リクエストごとに認証をパスさせるための「APIトークン」を使用したユーザ認証を行うtokenガードが用意されています。

プロバイダは永続ストレージから、どのようにユーザを取得するかを定義します。LaravelはEloquentとデータベースクリエビルダを使用しユーザを取得する機能を用意しています。しかし、アプリケーションの必要性に応じて、自由にプロバイダを追加できます。

混乱しても心配ありません。通常のアプリケーションでは、デフォルトの認証設定を変更する必要はありません。

データベースの検討事項

デフォルトととしてLaravelは、App\User Eloquentモデルappディレクトリに用意しています。このモデルはデフォルトEloquent認証ドライバで使用しています。もしアプリケーションでEloquentを使用しなければ、Laravelクエリビルダを使用するdatabase認証ドライバを使用する必要があります。

App\Userモデルのデータベーススキマー構築時に、確実にパスワードカラムを最低60文字確保してください。デフォルトの255文字にするのが、良い方法でしょう。

さらにusers、もしくは同等の働きをするテーブルには、100文字のremember_token文字列カラムも含めてください。このカラムはアプリケーションが管理する"remember me"セッションのトークンを保存しておくカラムです。マイグレーションで$table->rememberToken();を実行すると用意されます。

認証クイックスタート

Laravelでは認証に関連する2つのコントローラーがApp\Http\Controllers\Auth名前空間下に用意されています。AuthControllerは新ユーザの登録と「ログイン」を処理します。もうひとつのPasswordControllerには、登録済みユーザがパスワードを忘れた時にリセットするためのロジックが準備されています。必要なメソッドを読み込むために両方のコントローラーでトレイトが使われています。多くのアプリケーションで、これらのコントローラーを変更する必要は全く無いでしょう。

ルート定義

簡単なコマンド一つで、認証に必要となるルート定義とビューをすべてスカフォールディングできる簡単な手段をLaravelは提供しています。

php artisan make:auth

このコマンドはインストールしたてのアプリケーションに対し実行してください。認証の全エンドポイントに対するルートとともに、登録とログインのビューが準備されます。HomeControllerも生成され、アプリケーションのダッシュボード(管理領域)に対する、ログインリクエストのPOSTを処理します。しかし、アプリケーションの必要に応じて、このコントローラは自由に削除できます。

ビュー

前のセクションで説明したとおり、php artisan make:authコマンドはresources/views/authディレクトリへ、認証に必要なすべてのビューを生成します。

make:authコマンドはresources/views/layoutsディレクトリにアプリケーションのベースレイアウトビューも生成します。これらのビューはすべてBootstrap CSSフレームワークを使用していますが、自由にカスタマイズしてください。

認証

これで、認証コントローラを含め、必要なルートとビューの準備が整いました。アプリケーションに新しいユーザを登録できるようになりました。ブラウザでアプリケーションへアクセスしてください。認証コントローラは(内部で使用しているトレイトにより)、既存ユーザの認証と、新しいユーザをデータベースへ保存するロジックをすでに備えています。

パスのカスタマイズ

ユーザが認証に成功すると、/のURIへリダイレクトします。これをカスタマイズするには、AuthControllerredirectToプロパティに認証後のリダイレクト先の場所を定義してください。

protected $redirectTo = '/home';

ユーザが認証に失敗した場合、自動的にログインフォームへリダイレクトします。

ユーザがアプリケーションからログアウトした後のリダイレクト先をカスタマイズするには、AuthControllerredirectAfterLogoutプロパティを定義してください。

protected $redirectAfterLogout = '/login';

このプロパティが定義されていない場合は、/のURIへリダイレクトします。

ガードのカスタマイズ

更に、ユーザを認証するために使用する「ガード」をカスタマイズすることも可能です。最初に、AuthControllerguardプロパティを定義してください。このプロパティの値は、auth.php設定ファイルのガード設定に対応させます。

protected $guard = 'admin';

バリデーション/保管域のカスタマイズ

アプリケーションに新しいユーザを登録する場合に入力してもらうフォームのフィールドを変更するか、データベースに新しいユーザレコードを登録する方法をカスタマイズしたい場合は、AuthControllerクラスを変更してください。このクラスはアプリケーションで新しいユーザのバリデーションと作成に責任を持っています。

AuthControllervalidatorメソッドはアプリケーションの新しいユーザに対するバリデーションルールで構成されています。このメソッドはお気に召すまま自由に変更してください。

AuthControllercreateメソッドは新しいApp\UserレコードをEloquent ORMを使用し、データベースに作成することに責任を持っています。データベースの必要に合わせて自由にこのメソッドを変更してください。

認証済みユーザの取得

Authファサードを使えば認証済みユーザへ簡単にアクセスできます。

$user = Auth::user();

もしくは、ユーザが認証済みであれば、Illuminate\Http\Requestインスタンス経由で、ユーザへアクセスすることもできます。コントローラメソッドでタイプヒントしたクラスは、自動的にインスタンスが依存注入されることを思い出してください。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    /**
     * ユーザプロフィールの更新
     *
     * @param  Request  $request
     * @return Response
     */
    public function updateProfile(Request $request)
    {
        if ($request->user()) {
            // $request->user()は認証済みユーザのインスタンスを返す
        }
    }
}

現在のユーザが認証されているか調べる

ユーザが既にアプリケーションにログインしているかを調べるには、Authファサードのcheckメソッドが使えます。認証時にtrueを返します。

if (Auth::check()) {
    // ユーザはログインしている
}

しかし特定のルートやコントローラーにユーザをアクセスさせる前に、認証済みであるかをミドルウェアにより確認することもできます。より詳細についてはルートの保護のドキュメントを参照してください。

ルートの保護

ルートミドルウェアは特定のルートに許可されたユーザのみアクセスを許すために使われます。Laravelにはapp\Http\Middleware\Authenticate.phpの中で定義されているauthミドルウェアが最初から用意されています。ルートの定義にこのミドルウェアを指定するだけです。

// ルートクロージャを使用する

Route::get('profile', ['middleware' => 'auth', function() {
    // 認証済みのユーザのみが入れる
}]);

// コントローラを使用する

Route::get('profile', [
    'middleware' => 'auth',
    'uses' => 'ProfileController@show'
]);

もちろんコントローラークラスを使っているならルート定義に付加する代わりに、コントローラーのコンストラクターでmiddlewareメソッドを呼び出すことができます。

public function __construct()
{
    $this->middleware('auth');
}

ガードの指定

authミドルウェアをルートに対し指定するときに、認証を実行するガードを指定することもできます。

Route::get('profile', [
    'middleware' => 'auth:api',
    'uses' => 'ProfileController@show'
]);

指定するガードは、auth.php設定ファイルのguards配列のキーを指定してください。

認証回数制限

Laravelの組み込みAuthControllerクラスを使用している場合に、アプリケーションのログイン制限を行うにはIlluminate\Foundation\Auth\ThrottlesLoginsトレイトをuseします。デフォルトでは何度も正しくログインできなかった後、一分間ログインできなくなります。制限はユーザの名前/メールアドレスとIPアドレスで限定されます。

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    // AuthControllerクラスの残りの部分…
}

自前のユーザ認証

もちろん、Laravelに含まれる認証コントローラーを使うことを強要しているわけでありません。これらのコントローラーを削除する選択肢を選ぶのなら、Laravel認証クラスを直接使用しユーザの認証を管理する必要があります。心配ありません。それでも簡単です!

Laravelの認証サービスにはAuthファサードでアクセスできます。クラスの最初でAuthファサードを確実にインポートしておきましょう。次にattemptメソッドを見てみましょう。

<?php

namespace App\Http\Controllers;

use Auth;

class AuthController extends Controller
{
    /**
     * 認証を処理する
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password])) {
            // 認証に成功した
            return redirect()->intended('dashboard');
        }
    }
}

attemptメソッドは最初の引数として、キー/値ペアの配列を受け取ります。配列中の他の値は、データベーステーブルの中からそのユーザを見つけるために使用されます。ですから、上の例ではemailカラムの値により、ユーザが取得されます。ユーザが見つかれば、配列でメソッドに渡されたハッシュ済みのpassword値と、データベースに保存してあったハッシュ済みpasswordが比較されます。2つのハッシュ済みパスワードが一致したら、そのユーザの新しい認証セッションが開始されます。

attemptメソッドは、認証が成功すればtrueを返します。失敗時はfalseを返します。

リダイレクタ―のintendedメソッドは、認証フィルターにかかる前にアクセスしようとしていたURLへ、ユーザをリダイレクトしてくれます。そのリダイレクトが不可能な場合の移動先として、フォールバックURIをこのメソッドに指定できます。

追加条件の指定

お望みであれば、ユーザのメールアドレスとパスワードに付け加え、認証時のクエリに追加の条件を指定することも可能です。

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // ユーザは存在しており、かつアクティブで、資格停止されていない
}

注意: この例のように、emailを必ず認証に使用しなくてならない訳ではありません。データーベース中にあるユーザ名(username)に該当する、一意にユーザを特定できるカラムであれば何でも使用できます。

特定のGuardインスタンスへのアクセス

Authファサードのguardメソッドにより、使用したいガードインスタンスを指定できます。これにより全く異なった認証用のモデルやユーザテーブルを使い、アプリケーションの別々の部分に対する認証を管理することができます。

guardメソッドへ渡すガード名は、auth.php認証ファイルのguards設定の一つと対応している必要があります。

if (Auth::guard('admin')->attempt($credentials)) {
    //
}

ログアウト

アプリケーションからユーザをログアウトさせるには、Authファサードのlogoutメソッドを使用してください。これはユーザセッションの認証情報をクリアします。

Auth::logout();

継続ログイン

アプリケーションでログイン維持(Remember me)機能を持たせたい場合は、attemptメソッドの第2引数に論理値を指定します。ユーザが自分でログアウトしない限り、認証が無期限に持続するようになります。もちろん、"remember me"トークンを保存するために使用する文字列のremember_tokenカラムをusersテーブルに持たせる必要があります。

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // $rememberがtrueなら、このメンバーは継続ログインされる…
}

この機能を使用している時に、ユーザが"remember me"クッキーを使用して認証されているかを判定するには、viaRememberメソッドを使用します。

if (Auth::viaRemember()) {
    //
}

他の認証方法

Userインスタンスによる認証

既に存在しているユーザインスタンスでアプリケーションにログインさせる必要があれば、loginメソッドにそのユーザインスタンスを指定し呼び出してください。指定されたオブジェクトはIlluminate\Contracts\Auth\Authenticatable契約を実装している必要があります。もちろん、Laravelが用意しているApp\Userモデルはこのインターフェイスを実装しています。

Auth::login($user);

// 指定したユーザでログインする(このセッションだけでない)
Auth::login($user, true);

もちろん、使用したいガードインスタンスを指定することもできます。

Auth::guard('admin')->login($user);

IDによるユーザ認証

ユーザをアプリケーションへIDによりログインさせる場合は、loginUsingIdメソッドを使います。このメソッドは認証させたいユーザの主キーだけを引数に受け取ります。

Auth::loginUsingId(1);

// 指定したユーザでログインする(このセッションだけでない)
Auth::loginUsingId(1, true);

ユーザを一度だけ認証する

onceメソッドを使用すると、アプリケーションにユーザをそのリクエストの間だけログインさせることができます。セッションもクッキーも使用しないため、ステートレスなAPIを構築する場合に便利です。onceメソッドの引数はattemptメソッドと同じです。

if (Auth::once($credentials)) {
    //
}

HTTP基本認証

HTTP基本認証により、専用の「ログイン」ページを用意しなくても手っ取り早くアプリケーションにユーザをログインさせられます。これを使用するには、ルートにauth.basicミドルウェアを付けてください。auth.basicミドルウェアはLaravelフレームワークに含まれているので、定義する必要はありません。

Route::get('profile', ['middleware' => 'auth.basic', function() {
    // 認証済みのユーザのみが実行できる…
}]);

ミドルウェアをルートに指定すれば、ブラウザーからこのルートへアクセスされると自動的に認証が求められます。デフォルトでは、auth.basicミドルウェアはユーザを決める"username"としてユーザのemailカラムを使用します。

FastCGIの注意

PHP FastCGIを使用している場合、初期状態のままでHTTP基本認証は正しく動作しないでしょう。以下の行を.htaccessファイルへ追加してください。

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

ステートレスなHTTP基本認証

セッションの識別クッキーを用いずにHTTP基本認証を使用することもできます。これは特にAPI認証に便利です。実装するには、onceBasicメソッドを呼び出すミドルウェアを定義してください。onceBasicメソッドが何もレスポンスを返さなかった場合、リクエストをアプリケーションの先の処理へ通します。

<?php

namespace Illuminate\Auth\Middleware;

use Auth;
use Closure;

class AuthenticateOnceWithBasicAuth
{
    /**
     * 送信されたリクエストの処理
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return Auth::onceBasic() ?: $next($request);
    }

}

次にルートミドルウェアを登録し、ルートに付加します。

Route::get('api/user', ['middleware' => 'auth.basic.once', function() {
    // 認証済みのユーザのみが実行できる
}]);

パスワードリセット

データベースの検討事項

ほとんどのWebアプリケーションは、パスワードを忘れた場合にリセットする機能をユーザへ提供しています。アプリケーションを構築するたびごと、何度も実装しなくても済むように、Laravelはパスワードリマインダーを送信し、パスワードをリセットするための便利な手法を提供しています。

これを利用するには、App\UserモデルがIlluminate\Contracts\Auth\CanResetPassword契約を実装しているか確認してください。もちろん、フレームワークに用意されているApp\Userモデルでは、既にこのインターフェイスが実装されています。Illuminate\Auth\Passwords\CanResetPasswordトレイトで、このインターフェイスで実装する必要のあるメソッドが定義されています。

リセットトークンテーブルマイグレーションの生成

次にパスワードリセットトークンを保存しておくためのテーブルを作成します。このテーブルのマイグレーションは、最初からLaravelのdatabase/migrationsディレクトリに含まれています。ですから、マイグレートするために必要なのは次のコマンド実行だけです。

php artisan migrate

ルート定義

Laravelはユーザのパスワードをリセットするために必要なロジックを全部含んでいる、Auth\PasswordControllerを用意しています。パスワードリセットに必要な全ルートは、make:auth Artisanコマンドで生成します。

php artisan make:auth

ビュー

パスワードリセットの場合も、make:authコマンドを実行すれば、パスワードリセットに必要な全部のビューが生成されます。ビューはresources/views/auth/passwordsに生成されます。アプリケーションに合わせ、自由にカスタマイズしてください。

パスワードリセット後の処理

ユーザのパスワードをリセットするルートとビューを定義できたら、ブラウザーで/password/resetのルートへアクセスするだけです。フレームワークに含まれている PasswordControllerは、パスワードリセットリンクを含むメールを送信し、データベースのパスワードを更新するためのロジックを含んでいます。

パスワードがリセットされたら、そのユーザは自動的にアプリケーションにログインされ、/homeへリダイレクトされます。パスワードリセット後のリダイレクト先をカスタマイズするには、PasswordControllerredirectToプロパティを定義してください。

protected $redirectTo = '/dashboard';

注意: デフォルトでパスワードリセットトークンは、一時間有効です。これは、config/auth.phpファイルのexpireオプションにより変更できます。

カスタマイズ

認証ガードのカスタマイズ

auth.php設定ファイルにより、複数のユーザテーブルごとに認証の振る舞いを定義するために使用する、「ガード」をそれぞれ設定できます。用意されているPasswordControllerコントローラに$guardプロパティを追加することにより、使用するガードを選択できます。

/**
 * 使用する認証ガード
 *
 * @var string
 */
protected $guard = 'admins';

パスワードブローカーのカスタマイズ

複数のユーザテーブルに対するパスワードをリセットするために使用する、別々のパスワード「ブローカー」をauth.phpファイルで設定できます。用意されているPasswordControllerコントローラに$brokerプロパティを追加し、使用するブローカーのカスタマイズができます。

/**
 * 使用するパスワードブローカー
 *
 * @var string
 */
protected $broker = 'admins';

カスタムガードの追加

独自の認証ガードはAuthファサードのextendメソッドを使用し、定義します。サービスプロバイダの中で、呼び出します。

<?php

namespace App\Providers;

use Auth;
use App\Services\Auth\JwtGuard;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * サービスの初期起動後の登録実行
     *
     * @return void
     */
    public function boot()
    {
        Auth::extend('jwt', function($app, $name, array $config) {
            // Illuminate\Contracts\Auth\Guardのインスタンスを返す

            return new JwtGuard(Auth::createUserProvider($config['provider']));
        });
    }

    /**
     * コンテナへの結合登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

上記の例のように、コールバックをextendメソッドに渡し、Illuminate\Contracts\Auth\Guardの実装を返します。このインスタンスは、カスタムガードで定義が必要ないくつかのメソッドを持っています。

カスタムガードが定義できたら、guards設定で使用してください。

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

カスタムユーザプロバイダの追加

ユーザ情報を保管するために伝統的なリレーショナルデータベースを使用したくなければ、Laravelに独自の認証ユーザプロバイダを拡張する必要があります。Authファサードのproviderメソッドを使い、カスタムユーザプロバイダを定義します。 サービスプロバイダの中で、このproviderメソッドを呼び出してください。

<?php

namespace App\Providers;

use Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * サービスの初期起動後の登録実行
     *
     * @return void
     */
    public function boot()
    {
        Auth::provider('riak', function($app, array $config) {
            // Illuminate\Contracts\Auth\UserProviderのインスタンスを返す
            return new RiakUserProvider($app['riak.connection']);
        });
    }

    /**
     * コンテナへの結合登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

providerメソッドでプロバイダを登録したら、config/auth.php設定ファイルで新しいユーザプロバイダへ切り替えます。最初に、新しいドライバを使用するproviderを定義します。

'providers' => [
    'users' => [
        'driver' => 'riak',
    ],
],

次に、このプロバイダをguards設定項目で利用します。

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
],

ユーザプロバイダ契約

Illuminate\Contracts\Auth\UserProviderは、MySQLやRiakなどのような持続性のストレージシステムに対するIlluminate\Contracts\Auth\Authenticatableの実装を取得することだけに責任を持っています。これらの2つのインターフェイスはユーザデータがどのように保存されているか、それを表すのがどんなタイプのクラスなのかに関わらず、認証メカニズムを機能し続けるために役立っています。

Illuminate\Contracts\Auth\UserProvider契約を見てみましょう。

<?php

namespace Illuminate\Contracts\Auth;

interface UserProvider {

    public function retrieveById($identifier);
    public function retrieveByToken($identifier, $token);
    public function updateRememberToken(Authenticatable $user, $token);
    public function retrieveByCredentials(array $credentials);
    public function validateCredentials(Authenticatable $user, array $credentials);

}

retrieveById関数は通常MySQLデータベースの自動増分IDのようなユーザを表すキーを受け付けます。IDにマッチするAuthenticatable実装が取得され、返されます。

retrieveByToken関数は一意の$identifierremember_tokenフィールドに保存されている"remember me" $tokenからユーザを取得します。前のメソッドと同じく、Authenticatable実装が返されます。

updateRememberTokenメソッドは$userremember_tokenフィールドを新しい$tokenで更新します。新しいトークンは真新しいものでも、「Remember me」ログインに成功した時の値でも、ログアウト時のnull値でも受け付けます。

retrieveByCredentialsメソッドはアプリケーションにログイン時にAuth::attemptメソッドに指定するのと同じく、ユーザ認証情報の配列を引数に取ります。メソッドは認証情報に一致するユーザを裏の持続ストレージから「クエリ」する必要があります。典型的な使用方法の場合、このメソッドは$credentials['username']の"where"条件でクエリを実行するでしょう。メソッドはUserInterfaceの実装を返します。このメソッドはパスワードバリデーションや認証を行ってはいけません

validateCredentialsメソッドは指定された$userとユーザを認証するための$credentialsとを比較します。たとえばこのメソッドは$user->getAuthPassword()文字列と$credentials['password']Hash::makeした値を比較します。このメソッドはユーザの認証情報のバリデーションだけを行い、論理値を返します。

Authenticatable契約

これでUserProviderの各メソッドが明らかになりました。続いてAuthenticatable契約を見てみましょう。プロバイダはretrieveByIdretrieveByCredentialsメソッドでこのインターフェイスの実装を返していたことを思い出してください。

<?php

namespace Illuminate\Contracts\Auth;

interface Authenticatable {

    public function getAuthIdentifierName();
    public function getAuthIdentifier();
    public function getAuthPassword();
    public function getRememberToken();
    public function setRememberToken($value);
    public function getRememberTokenName();

}

このインターフェイスはシンプルです。getAuthIdentifierNameメソッドは、ユーザの「主キー」フィールドの名前を返します。getAuthIdentifierメソッドはユーザの主キーを返します。MySQLを裏で使用している場合、これは自動増分される主キーでしょう。getAuthPasswordはユーザのハッシュ済みのパスワードを返します。このインターフェイスはどのORMや抽象ストレージ層を使用しているかに関わらず、どんなUserクラスに対しても認証システムが動作するようにしてくれています。デフォルトでLaravelはappディレクトリ中に、このインターフェイスを実装してるUserクラスを持っています。ですから実装例として、このクラスを調べてみてください。

イベント

Laravelは認証処理の過程で、様々なイベントを発行します。EventServiceProviderの中で、こうしたイベントに対するリスナを設定できます。:

/**
 * アプリケーションに指定されたイベントリスナ
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Attempting' => [
        'App\Listeners\LogAuthenticationAttempt',
    ],

    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\LogSuccessfulLogin',
    ],

    'Illuminate\Auth\Events\Logout' => [
        'App\Listeners\LogSuccessfulLogout',
    ],

    'Illuminate\Auth\Events\Lockout' => [
        'App\Listeners\LogLockout',
    ],
];

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる