いきなりファサードにチャレンジする
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(); } }
ファサードを作る
<?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()
で、メソッドが動く。