この記事には、サイトを開発するときにLaravelを使用するためのいくつかの基本的なテクニックの説明が含まれており、このフレームワークを学習し始めた人に役立ちます。 たとえば、Ubuntu 12.04、PostgreSQL 9.3、Nginx 1.1.19、PHP 5.5.7、Composer、およびLaravel 4.1を使用して作成された新しいプロジェクトを使用します。 PostgreSQLの制御下で、サンプルデータベースが回転し、同じパスワードを持つサンプルユーザーがアクセスできます。 Nginxは、アドレスにアクセスするときに
examples.loc
ブラウザーの
examples.loc
は、スタブのメインページを開きます。このページには、Laravelがバンドルされており、「You are入荷しました」という碑文が付いています。
編集可能なファイルへのすべてのパスは、プロジェクトディレクトリを基準にして示されます。
環境
まず、Laravelにローカル環境をセットアップしました。 これを行うには、ディレクトリ
app/config/local
を作成し、それに
database.php
ファイルを追加し
database.php
。
<?php /** * app/config/local/database.php */ return array( 'default' => 'pgsql', 'connections' => array( 'pgsql' => array( 'driver' => 'pgsql', 'host' => 'localhost', 'database' => 'examples', 'username' => 'examples', 'password' => 'examples', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ), ), );
Laravelにデフォルトで
local
環境を使用するように依頼します。 これを行うには、ファイルbootstrap / start.phpを編集し、行
'your-machine-name'
を
'*'
置き換え
'your-machine-name'
。
// bootstrap/start.php $env = $app->detectEnvironment(array( 'local' => array('*'), ));
セントリー接続
Sentryの接続手順へのリンクは、記事の最後にあります。 簡単に言うと、私は次のことを行います。
行
"cartalyst/sentry": "2.0.*"
require
ブロックの
composer.json
に
"cartalyst/sentry": "2.0.*"
ます。
// composer.json { "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.1.*", "cartalyst/sentry": "2.0.*" }, ...
コマンドを実行します:
$ composer update
$文字を入力する必要はありません
$記号は、コマンドラインで
と入力する必要があることを意味します
composer update
と入力する必要があることを意味します
ファイルapp / config / app.phpのサービスプロバイダーのリストに追加します。
'Cartalyst\Sentry\SentryServiceProvider',
app / config / app.phpファイルのエイリアスのリストに追加します。
'Sentry' => 'Cartalyst\Sentry\Facades\Laravel\Sentry',
Sentry移行の実行:
$ php artisan migrate --package=cartalyst/sentry
Sentry構成ファイルを公開します。
$ php artisan config:publish cartalyst/sentry
app/config/packages/cartalyst/sentry/config.php
編集
app/config/packages/cartalyst/sentry/config.php
開き
app/config/packages/cartalyst/sentry/config.php
。 その中に文字列
'login_attribute' => 'email'
を見つけて
'login_attribute' => 'username'
に置き換え
'login_attribute' => 'username'
。これにより、Sentryは電子メールではなくログインによってユーザーを認証します。
Sentryの移行を実行すると、
email
フィールドはあるが
username
ない
users
テーブルが作成されました。 したがって、Sentryを機能させるには、不足しているフィールドを追加する必要があります。 これを行うには、移行を作成します。
$ php artisan migrate:make alter_users_add_username
app/database/migration
ディレクトリにファイルが表示されます。このファイルは現在の日付と時刻で構成され、
alter_users_add_username.php
で
alter_users_add_username.php
ます。 次のように編集します。
<?php /** * app/database/migration/0000_00_00_000000_alter_users_add_username.php */ use Illuminate\Database\Migrations\Migration; class AlterUsersAddUsername extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function($table) { $table->string('username'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function($table) { $table->dropColumn('username'); }); } }
移行を確認するには
$ php artisan migrate
移行が正常にロールバックされたことを確認するには、次のことを行います。
$ php artisan migrate:rollback
users
テーブルにスーパーユーザーエントリを追加する別の移行を作成します。
$ php artisan migrate:make add_user_admin
app/database/migrate
ディレクトリで
add_user_admin.php
で終わるファイルを
add_user_admin.php
て編集します:
<?php /** * app/database/migration/0000_00_00_000001_add_user_admin.php */ use Illuminate\Database\Migrations\Migration; class AddUserAdmin extends Migration { /** * Run the migrations. * * @return void */ public function up() { $user = Sentry::createUser(array( 'username' => 'admin', 'email' => 'admin@examples.loc', 'password' => 'password', 'activated' => 1, 'permissions' => array( 'superuser' => 1, ), )); } /** * Reverse the migrations. * * @return void */ public function down() { User::where('username', '=', 'admin')->firstOrFail()->delete(); } }
移行のロールバックとロールバックの方法を確認します。 そして、ユーザーの認証を担当するコントローラーを作成します。
ログインフォーム
app/controllers
ディレクトリで、
AuthController.php
ファイル
app/controllers
作成します。
<?php /** * app/controllers/AuthController.php */ class AuthController extends BaseController { /** * * * @return Illuminate\View\View */ public function getLogin() { $title = ''; return View::make('auth.login', compact('title')); } }
getLogin()
メソッドは、ページタイトルを
$title
変数を介して
auth.login
に
auth.login
。この
auth.login
は、管理者ログインページを表示します。
auth.loginビューを作成します。 これを行うには、
auth
ディレクトリを
app/views
ディレクトリに追加し、その中に
login.blade.php
ファイルを作成します。
/** * app/views/auth/login.blade.php */ @extends('layout') @section('main') <div class="container"> {{ Form::open(array('class' => 'form-signin')) }} @if (!$errors->isEmpty()) <div class="alert alert-danger"> @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach </div> @endif <h2 class="form-signin-heading">{{ $title }}</h2> {{ Form::text('username', null, array('class' => 'form-control', 'placeholder' => '')) }} {{ Form::password('password', array('class' => 'form-control', 'placeholde' => '')) }} <label class="checkbox"> {{ Form::checkbox('remember-me', 1) }} </label> {{ Form::submit('', array('class' => 'btn btn-lg btn-primary btn-block')) }} {{ Form::close() }} </div> @stop
login.blade.php
テンプレートは、
login.blade.php
テンプレートを拡張します。 したがって、私は
app/views
ディレクトリに作成し
app/views
:
/** * app/views/layout.blade.php */ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>{{ $title }}</title> @section('styles') {{ HTML::style('//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css') }} {{ HTML::style(URL::asset('styles/base.css')) }} @show </head> <body> @yield('main') @section('scripts') {{ HTML::script('//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js') }} @show <body> </html>
コントローラーメソッドとそれによって返される表現が存在した後、ルーティングを構成して、GET要求がアドレスに送信されるようにする必要があります。
examples.loc/login
examples.loc/login
は、
getLogin()
メソッドによって処理されました。 これを行うには、次のコードを
app/routes.php
ファイルに追加します。
// app/routes.php ... Route::group(array('before' => 'guest'), function () { Route::get('login', array( 'as' => 'auth.login', 'uses' => 'AuthController@getLogin' )); });
Route::get()
使用して、
auth.login
というルート
Route::get()
定義します。これ
getLogin()
AuthController
コントローラーの
getLogin()
/login
メソッドにGETリクエストを送信し
/login
。
また、
auth.login
グループにauth.login
auth.login
を配置しました。 このグループに含まれるルートの前に、
guest
フィルターが実行されます。 このフィルターは、ユーザーがゲストである場合にのみ、アドレス
/login
でのGETリクエストの処理が行われることを意味し
/login
。 許可されていません。
guest
フィルターを書き換えて、Sentryを使用するようにします。 これを行うには、
app/filters.php
ファイルで、
guest
フィルターコードを変更します。
// app/filters.php ... Route::filter('guest', function() { if (Sentry::check()) return Redirect::to('/'); }); ...
これで、ログインフォームがブラウザでどのように見えるかを確認できます。 これを行うには、に行きます
examples.loc/login
examples.loc/login
および...
エラーメッセージ
Call to undefined method Illuminate\Cookie\CookieJar::get()
ます。
Googleの軽い動きで、Sentry 2.0はLaravel 4.0と互換性がありますが、4.1とは互換性がないことがわかりました。 Sentry 2.1がすでにリリースされているのは良いことです。 エラーを取り除くために、
composer.json
のSentryのバージョンを2.1に変更します。
// composer.json { "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.1.*", "cartalyst/sentry": "2.1.*" }, ...
コマンドを実行します:
$ composer update
もう一度開いてみる
examples.loc/login
examples.loc/login
とログインフォームとパスワードが表示されます。 フォームをエレガントに見せるために、CSSを追加する必要があります。 これを行うには、
public
ディレクトリに
styles
ディレクトリを作成し、
base.css
ファイルを追加します。
/** * public/style/base.css */ body { padding-top: 40px; padding-bottom: 40px; background-color: #eee; } .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .form-signin-heading { text-align: center; } .form-signin .checkbox { font-weight: normal; } .form-signin .form-control { position: relative; font-size: 16px; height: auto; padding: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .form-signin .form-control:focus { z-index: 2; } .form-signin input[type="text"] { margin-bottom: -1px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .form-signin input[type="password"] { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; }
コントローラー
フォームがきれいに表示されるようになりましたが、「ログイン」ボタンをクリックするとエラー404が返されるので、
/login
アドレスに送信された
AuthController
POST要求ハンドラーを追加する必要があります。
<?php /** * app/controllers/AuthController.php */ class AuthController extends BaseController { /** * * * @return Illuminate\View\View */ public function getLogin() { $title = ''; return View::make('auth.login', compact('title')); } /** * * * @return Illuminate\Http\RedirectResponse */ public function postLogin() { Input::flash(); try { $credentials = array( 'username' => Input::get('username'), 'password' => Input::get('password') ); $user = Sentry::authenticate($credentials, Input::get('remember-me')); } catch (Exception $e) { return Redirect::to(route('auth.login')) ->withErrors(array($e->getMessage())); } return Redirect::intended(route('admin')); } /** * * * @return Illuminate\Http\RedirectResponse */ public function getLogout() { Sentry::logout(); return Redirect::route('auth.login'); } }
postLogin()
メソッドでは、フォームを介して送信されたデータは、
Input::flash()
を使用してセッションに保存されます。
try
ブロックで、Sentryはユーザーの認証を試みます。 ログインとパスワードの入力フォームで「Remember me」チェックボックスを設定すると、
Sentry::authenticate()
の2番目のパラメーターが
true
に渡され、Sentryは認証に成功した場合にユーザーを記憶します。 何らかの理由で認証が成功しなかった場合、
catch
で
Redirect::to()
メソッドがエラーメッセージのある場所のログインおよびパスワード入力ページに送信します。 認証が成功した場合、
Redirect::intended()
メソッドは、ログインおよびパスワード入力フォームにリダイレクトされたときに入力したいページにユーザーを送ります。 そのようなページが指定されていない場合、アドレス
/admin
でページが開き、
/admin
という名前のルートが関連付けられます。
getLogin()
メソッドは、ユーザーをログアウトする方法の最も単純な実装です。 終了すると、ユーザーはログインおよびパスワード入力ページにリダイレクトされます。
ルーティングの構成に進む前に、
/admin
送信されたリクエストを処理するメソッドを追加する必要があります。 これを行うには、ファイル
app/controllers/HomeController.php
を次のように編集します。
<?php /** * app/controllers/HomeController.php */ class HomeController extends BaseController { public function showWelcome() { return View::make('hello'); } public function getAdmin() { return link_to(route('auth.logout'), ''); } }
getAdmin()
メソッドは単にページに「終了」リンクを表示します。クリックすると、ユーザーはログアウトします。
ルーティング
さて、新しいメソッドがリクエストを処理できるように、
app/routes.php
で編集し
app/routes.php
:
/** * app/routes.php */ Route::get('/', function() { return View::make('hello'); }); Route::group(array('before' => 'guest'), function () { Route::get('login', array( 'as' => 'auth.login', 'uses' => 'AuthController@getLogin' )); Route::post('login', array( 'before' => 'csrf', 'uses' => 'AuthController@postLogin' )); }); Route::group(array('before' => 'auth'), function () { Route::get('admin', array( 'as' => 'admin', 'uses' => 'HomeController@getAdmin', )); Route::get('logout', array( 'as' => 'auth.logout', 'uses' => 'AuthController@getLogout' )); });
guest
フィルターが実行される前のルートの最初のグループには、GETおよびPOST要求の
/login
アドレスのルーティングが含まれます。
guest
フィルターは、
guest
からのリクエストのみが
/login
アドレスで処理されることを意味し
/login
。 権限のないユーザー。
ルートの2番目のグループ(
auth
フィルターが実行される前)には、アドレス
/admin
および
/logout
ルーティングが含まれ
/logout
。
auth
フィルターは、許可されたユーザーからのアドレスのみがこれらのアドレスで処理されることを意味します。
また、Sentryを使用するように
auth
フィルターを編集する必要があります。 これを行うには、
app/filters.php
ファイル
app/filters.php
開き、次のように
auth
フィルターを変更します。
// app/filters.php ... Route::filter('auth', function() { if (!Sentry::check()) return Redirect::guest(route('auth.login')); }); ...
これで、管理者ログインとパスワードpasswordを使用して管理者パネルにログインを試みることができます。 権限のないユーザーは
/admin
ページにアクセスできません。認証に成功した場合にのみアクセスできます。 また、認証後、メインページへのリダイレクトが発生するため、
/login
ページに移動することはできません。
この例が初心者の開発者がLaravelのいくつかの要素をよりよく理解するのに役立つことを願っています。
関連リンク
getcomposer.org/doc/00-intro.md#installation-nix
laravel.com/docs/installation#install-laravel
cartalyst.com/manual/sentry/installation/laravel-4
UPD
Github.com/bskton/examples/tree/eformサンプルコード