ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

いきなりファサードにチャレンジする

Laravelのドキュメントには「ファサードを始める前にIoCコンテナを習得しとけよ!」って強めに書いてある。しかし「Auth」って書くだけでメソッドを呼び出すことができるファサード、すぐ使いたかったのでいきなりやってみた。未だにIoCコンテナはわからない。

まずパッケージを作る

パッケージを作るコマンドは以下の通り。ベンダ名は適当に「futari」にした。パッケージ名も適当に「rei」にした。

php artisan workbench futari/rei --resources


プロキシの設定を忘れていたので、実行するとエラーが色々でるけど気にしない。

C:\xampp\arana>php artisan workbench futari/rei --resources
Package workbench created!
Loading composer repositories with package information
The "https://packagist.org/packages.json" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: そのようなホストは不明です。
failed to open stream: php_network_getaddresses: getaddrinfo failed: そのようなホストは不明です。
https://packagist.org could not be fully loaded, package information was loaded
from the local cache and may be out of date
Installing dependencies (including require-dev)
  - Installing illuminate/support (4.0.x-dev 6bed4bb)
    Cloning 6bed4bb4e06b9aa4ee7ee518a40176d1532b1af5

<中略>


  - https://github.com/illuminate/support.git
    fatal: unable to access 'https://github.com/illuminate/support.git/': Coud not resolve host: github.com




install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-plugins] [--no-custom-installers] [--no-scripts] [--no-progress] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader]


これで以下のフォルダが作られる。中には基本的なパッケージが入っている。

C:\xampp\laravel\workbench\futari\rei

ツリー構造はこんな感じ。

C:\xampp\laravel\workbench\futari>tree
C:.
└─rei
    ├─public
    ├─src
    │  ├─config
    │  ├─controllers
    │  ├─Futari
    │  │  └─Rei
    │  ├─lang
    │  ├─migrations
    │  └─views
    ├─tests
    └─vendor
        └─illuminate
            └─support
                └─Illuminate

オートロードする

workbenchに置いただけでは、Laravelは自作パッケージを認識しない。オートロードする。「最後でいいや」と思ってこれを後回しにしたらドツボにハマった。

C:\xampp\laravel>php artisan dump-autoload
Generating optimized class loader
Running for workbench [futari\rei]...

自作パッケージをapp.phpを追加する

app.phpのprovidersの末尾に自作パッケージを追加する。これで終了。

'providers' => array(

	'Illuminate\Foundation\Providers\ArtisanServiceProvider',
	'Illuminate\Auth\AuthServiceProvider',
	'Illuminate\Cache\CacheServiceProvider',
	'Illuminate\Foundation\Providers\CommandCreatorServiceProvider',
	'Illuminate\Session\CommandsServiceProvider',
	'Illuminate\Foundation\Providers\ComposerServiceProvider',
	'Illuminate\Routing\ControllerServiceProvider',
	'Illuminate\Cookie\CookieServiceProvider',
	'Illuminate\Database\DatabaseServiceProvider',
	'Illuminate\Encryption\EncryptionServiceProvider',
	'Illuminate\Filesystem\FilesystemServiceProvider',
	'Illuminate\Hashing\HashServiceProvider',
	'Illuminate\Html\HtmlServiceProvider',
	'Illuminate\Foundation\Providers\KeyGeneratorServiceProvider',
	'Illuminate\Log\LogServiceProvider',
	'Illuminate\Mail\MailServiceProvider',
	'Illuminate\Foundation\Providers\MaintenanceServiceProvider',
	'Illuminate\Database\MigrationServiceProvider',
	'Illuminate\Foundation\Providers\OptimizeServiceProvider',
	'Illuminate\Pagination\PaginationServiceProvider',
	'Illuminate\Foundation\Providers\PublisherServiceProvider',
	'Illuminate\Queue\QueueServiceProvider',
	'Illuminate\Redis\RedisServiceProvider',
	'Illuminate\Auth\Reminders\ReminderServiceProvider',
	'Illuminate\Foundation\Providers\RouteListServiceProvider',
	'Illuminate\Database\SeedServiceProvider',
	'Illuminate\Foundation\Providers\ServerServiceProvider',
	'Illuminate\Session\SessionServiceProvider',
	'Illuminate\Foundation\Providers\TinkerServiceProvider',
	'Illuminate\Translation\TranslationServiceProvider',
	'Illuminate\Validation\ValidationServiceProvider',
	'Illuminate\View\ViewServiceProvider',
	'Illuminate\Workbench\WorkbenchServiceProvider',
    'Futari\Rei\ReiServiceProvider',
),

サービスプロパイダーを編集する

サービスプロパイダーを編集する。以下のファイルを開く。

C:\xampp\arana\workbench\futari\rei\src\Futari\Rei\ReiServiceProvider.php

サービスプロパイダーのregisterメソッドに以下を追加する。

$this->app->bind('rei', function($app)
{
   return new Rei;
});

サービスプロパイダーファイルの全体は以下のようになるはず。

<?php namespace Futari\Rei;

use Illuminate\Support\ServiceProvider;

class ReiServiceProvider extends ServiceProvider {

	/**
	 * Indicates if loading of the provider is deferred.
	 *
	 * @var bool
	 */
	protected $defer = false;

	/**
	 * Bootstrap the application events.
	 *
	 * @return void
	 */
	public function boot()
	{
		$this->package('futari/rei');
	}

	/**
	 * Register the service provider.
	 *
	 * @return void
	 */
	public function register()
	{
        $this->app->bind('rei', function($app)
        {
            return new Rei;
        });
	}

	/**
	 * Get the services provided by the provider.
	 *
	 * @return array
	 */
	public function provides()
	{
		return array();
	}

}

ファサードを作る

ファサードReiFacade.phpを作る。

<?php namespace Futari\Rei;

class ReiFacade extends \Illuminate\Support\Facades\Facade {

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'rei'; }

}

クラスを作る

クラスRei.phpを作る。

<?php

namespace Futari\Rei;

class Rei {

    public $title = '';

    public function dd($var) {

        echo '<pre>';
        dd($var);
        echo '</pre>';
        exit;
    }

    public function getPage($var) {

        return ['title' => $this->title];
    }

}

ファサードをapp.phpに追加する

	'aliases' => array(

		'App'             => 'Illuminate\Support\Facades\App',
		'Artisan'         => 'Illuminate\Support\Facades\Artisan',
		'Auth'            => 'Illuminate\Support\Facades\Auth',
		'Blade'           => 'Illuminate\Support\Facades\Blade',
		'Cache'           => 'Illuminate\Support\Facades\Cache',
		'ClassLoader'     => 'Illuminate\Support\ClassLoader',
		'Config'          => 'Illuminate\Support\Facades\Config',
		'Controller'      => 'Illuminate\Routing\Controllers\Controller',
		'Cookie'          => 'Illuminate\Support\Facades\Cookie',
		'Crypt'           => 'Illuminate\Support\Facades\Crypt',
		'DB'              => 'Illuminate\Support\Facades\DB',
		'Eloquent'        => 'Illuminate\Database\Eloquent\Model',
		'Event'           => 'Illuminate\Support\Facades\Event',
		'File'            => 'Illuminate\Support\Facades\File',
		'Form'            => 'Illuminate\Support\Facades\Form',
		'Hash'            => 'Illuminate\Support\Facades\Hash',
		'HTML'            => 'Illuminate\Support\Facades\HTML',
		'Input'           => 'Illuminate\Support\Facades\Input',
		'Lang'            => 'Illuminate\Support\Facades\Lang',
		'Log'             => 'Illuminate\Support\Facades\Log',
		'Mail'            => 'Illuminate\Support\Facades\Mail',
		'Paginator'       => 'Illuminate\Support\Facades\Paginator',
		'Password'        => 'Illuminate\Support\Facades\Password',
		'Queue'           => 'Illuminate\Support\Facades\Queue',
		'Redirect'        => 'Illuminate\Support\Facades\Redirect',
		'Redis'           => 'Illuminate\Support\Facades\Redis',
		'Rei' => 'Futari\Rei\ReiFacade',
		'Request'         => 'Illuminate\Support\Facades\Request',
		'Response'        => 'Illuminate\Support\Facades\Response',
		'Route'           => 'Illuminate\Support\Facades\Route',
		'Schema'          => 'Illuminate\Support\Facades\Schema',
		'Seeder'          => 'Illuminate\Database\Seeder',
		'Session'         => 'Illuminate\Support\Facades\Session',
		'Str'             => 'Illuminate\Support\Str',
		'URL'             => 'Illuminate\Support\Facades\URL',
		'Validator'       => 'Illuminate\Support\Facades\Validator',
		'View'            => 'Illuminate\Support\Facades\View',

	),

これで完成のはず。

Rei::dd()

で、メソッドが動く。