システム開発はWordpressを少しだけカスタマイズするだけの知識しか無いのですが、今回はPHPで人気のあるフレームワークLaravelを学んで見たいと思います。
(仮想環境に開発環境を構築すれば、あとはWEBからの情報収集で何とかなるものだと思っています。。。安易な考え?)
最終的には、Laravelで業務レベルのCMSを構築できればと考えております。
(何かWEBサービス作りたいですね)
フレームワークの知識も無いため(当然Laravelを触るのは、はじめてです)、作業の簡素化を図ります・・・
はじめにしたことは、ログインなどの認証、およびCRUDなどの管理画面の実装を出来る限り簡単に済ませたいと思い、その辺りの便利なライブラリパッケージを探しました。
Laravelには標準で認証機能がついてそうですが、Role、Permission(役割や権限)の設定までは対応していないようでした。
そこで、機能が豊富なLaravelのadminパッケージを幾つか試していきたいと思います。(結構数がリリースされているため、Laravelの勉強を兼ねてどんどん試してみます)
今回選んだLaravel adminは「VOYAGER」です。理由は、Googleで検索すると一番に紹介(とあるサイト上にて)されていたことと、ビジュアル面で使いやすそうな印象があったからです。
VOYAGERのデモサイトは無いのでしょうか?とりあえず自分の環境にインストールして確認することにしました。
VOYAGERの環境を構築する
VOYAGERをインストールする前に、Laravelをインストールしなければなりません。
Laravelのインストールは、もちろんはじめてです。。。
かろうじて、Composerの知識が少しだけあったので、Laravelのインストールは簡単にすませることができました。
Laravelのインストール
$ composer create-project --prefer-dist laravel/laravel <demo>
コマンド1発で、Laravelがインストールできました。簡単すぎる・・・たくさんのパッケージがインストールされました。Laravelはsymfonyの勉強もできるのかな?
Installing laravel/laravel (v5.5.22) - Installing laravel/laravel (v5.5.22): Downloading (100%) Created project in demo > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 68 installs, 0 updates, 0 removals - Installing hamcrest/hamcrest-php (v2.0.0): Downloading (100%) - Installing mockery/mockery (1.0): Downloading (100%) - Installing vlucas/phpdotenv (v2.4.0): Loading from cache - Installing symfony/css-selector (v3.3.13): Loading from cache - Installing tijsverkoyen/css-to-inline-styles (2.2.0): Loading from cache - Installing symfony/polyfill-mbstring (v1.6.0): Loading from cache - Installing symfony/var-dumper (v3.3.13): Loading from cache - Installing symfony/routing (v3.3.13): Loading from cache - Installing symfony/process (v3.3.13): Loading from cache - Installing symfony/http-foundation (v3.3.13): Loading from cache - Installing symfony/event-dispatcher (v3.3.13): Loading from cache - Installing psr/log (1.0.2): Loading from cache - Installing symfony/debug (v3.3.13): Loading from cache - Installing symfony/http-kernel (v3.3.13): Downloading (100%) - Installing symfony/finder (v3.3.13): Loading from cache - Installing symfony/console (v3.3.13): Downloading (100%) - Installing doctrine/lexer (v1.0.1): Loading from cache - Installing egulias/email-validator (2.1.3): Downloading (100%) - Installing swiftmailer/swiftmailer (v6.0.2): Loading from cache - Installing paragonie/random_compat (v2.0.11): Loading from cache - Installing ramsey/uuid (3.7.1): Loading from cache - Installing psr/simple-cache (1.0.0): Loading from cache - Installing psr/container (1.0.0): Loading from cache - Installing symfony/translation (v3.3.13): Loading from cache - Installing nesbot/carbon (1.22.1): Loading from cache - Installing mtdowling/cron-expression (v1.2.1): Loading from cache - Installing monolog/monolog (1.23.0): Loading from cache - Installing league/flysystem (1.0.41): Loading from cache - Installing erusev/parsedown (1.6.4): Downloading (100%) - Installing doctrine/inflector (v1.2.0): Loading from cache - Installing laravel/framework (v5.5.22): Downloading (100%) - Installing fideloper/proxy (3.3.4): Loading from cache - Installing jakub-onderka/php-console-color (0.1): Loading from cache - Installing jakub-onderka/php-console-highlighter (v0.3.2): Loading from cache - Installing dnoegel/php-xdg-base-dir (0.1): Loading from cache - Installing nikic/php-parser (v3.1.2): Loading from cache - Installing psy/psysh (v0.8.15): Downloading (100%) - Installing laravel/tinker (v1.0.2): Loading from cache - Installing filp/whoops (2.1.14): Downloading (100%) - Installing fzaninotto/faker (v1.7.1): Loading from cache - Installing sebastian/version (2.0.1): Loading from cache - Installing sebastian/resource-operations (1.0.0): Loading from cache - Installing sebastian/recursion-context (3.0.0): Loading from cache - Installing sebastian/object-reflector (1.1.1): Loading from cache - Installing sebastian/object-enumerator (3.0.3): Loading from cache - Installing sebastian/global-state (2.0.0): Loading from cache - Installing sebastian/exporter (3.1.0): Loading from cache - Installing sebastian/environment (3.1.0): Loading from cache - Installing sebastian/diff (2.0.1): Loading from cache - Installing sebastian/comparator (2.1.0): Loading from cache - Installing doctrine/instantiator (1.0.5): Loading from cache - Installing phpunit/php-text-template (1.2.1): Loading from cache - Installing phpunit/phpunit-mock-objects (4.0.4): Loading from cache - Installing phpunit/php-timer (1.0.9): Loading from cache - Installing phpunit/php-file-iterator (1.4.5): Downloading (100%) - Installing theseer/tokenizer (1.1.0): Loading from cache - Installing sebastian/code-unit-reverse-lookup (1.0.1): Loading from cache - Installing phpunit/php-token-stream (2.0.2): Downloading (100%) - Installing phpunit/php-code-coverage (5.2.4): Downloading (100%) - Installing webmozart/assert (1.2.0): Loading from cache - Installing phpdocumentor/reflection-common (1.0.1): Loading from cache - Installing phpdocumentor/type-resolver (0.4.0): Loading from cache - Installing phpdocumentor/reflection-docblock (4.2.0): Downloading (100%) - Installing phpspec/prophecy (1.7.3): Downloading (100%) - Installing phar-io/version (1.0.1): Loading from cache - Installing phar-io/manifest (1.0.1): Loading from cache - Installing myclabs/deep-copy (1.7.0): Loading from cache - Installing phpunit/phpunit (6.4.4): Loading from cache symfony/var-dumper suggests installing ext-symfony_debug () symfony/routing suggests installing doctrine/annotations (For using the annotation loader) symfony/routing suggests installing symfony/config (For using the all-in-one router or any loader) symfony/routing suggests installing symfony/dependency-injection (For loading routes from a service) symfony/routing suggests installing symfony/expression-language (For using expression matching) symfony/routing suggests installing symfony/yaml (For using the YAML loader) symfony/event-dispatcher suggests installing symfony/dependency-injection () symfony/http-kernel suggests installing symfony/browser-kit () symfony/http-kernel suggests installing symfony/class-loader () symfony/http-kernel suggests installing symfony/config () symfony/http-kernel suggests installing symfony/dependency-injection () symfony/console suggests installing symfony/filesystem () egulias/email-validator suggests installing ext-intl (PHP Internationalization Libraries are required to use the SpoofChecking validation) paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.) ramsey/uuid suggests installing ircmaxell/random-lib (Provides RandomLib for use with the RandomLibAdapter) ramsey/uuid suggests installing ext-libsodium (Provides the PECL libsodium extension for use with the SodiumRandomGenerator) ramsey/uuid suggests installing ext-uuid (Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator) ramsey/uuid suggests installing moontoast/math (Provides support for converting UUID to 128-bit integer (in string form).) ramsey/uuid suggests installing ramsey/uuid-doctrine (Allows the use of Ramsey\Uuid\Uuid as Doctrine field type.) ramsey/uuid suggests installing ramsey/uuid-console (A console application for generating UUIDs with ramsey/uuid) symfony/translation suggests installing symfony/config () symfony/translation suggests installing symfony/yaml () monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB) monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server) monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required)) monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server) monolog/monolog suggests installing graylog2/gelf-php (Allow sending log messages to a GrayLog2 server) monolog/monolog suggests installing mongodb/mongodb (Allow sending log messages to a MongoDB server via PHP Driver) monolog/monolog suggests installing php-amqplib/php-amqplib (Allow sending log messages to an AMQP server using php-amqplib) monolog/monolog suggests installing php-console/php-console (Allow sending log messages to Google Chrome) monolog/monolog suggests installing rollbar/rollbar (Allow sending log messages to Rollbar) monolog/monolog suggests installing ruflin/elastica (Allow sending log messages to an Elastic Search server) monolog/monolog suggests installing sentry/sentry (Allow sending log messages to a Sentry server) league/flysystem suggests installing league/flysystem-aws-s3-v2 (Allows you to use S3 storage with AWS SDK v2) league/flysystem suggests installing league/flysystem-aws-s3-v3 (Allows you to use S3 storage with AWS SDK v3) league/flysystem suggests installing league/flysystem-azure (Allows you to use Windows Azure Blob storage) league/flysystem suggests installing league/flysystem-cached-adapter (Flysystem adapter decorator for metadata caching) league/flysystem suggests installing league/flysystem-eventable-filesystem (Allows you to use EventableFilesystem) league/flysystem suggests installing league/flysystem-rackspace (Allows you to use Rackspace Cloud Files) league/flysystem suggests installing league/flysystem-sftp (Allows you to use SFTP server storage via phpseclib) league/flysystem suggests installing league/flysystem-webdav (Allows you to use WebDAV storage) league/flysystem suggests installing league/flysystem-ziparchive (Allows you to use ZipArchive adapter) league/flysystem suggests installing spatie/flysystem-dropbox (Allows you to use Dropbox storage) league/flysystem suggests installing srmklive/flysystem-dropbox-v2 (Allows you to use Dropbox storage for PHP 5 applications) laravel/framework suggests installing aws/aws-sdk-php (Required to use the SQS queue driver and SES mail driver (~3.0).) laravel/framework suggests installing doctrine/dbal (Required to rename columns and drop SQLite columns (~2.5).) laravel/framework suggests installing guzzlehttp/guzzle (Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).) laravel/framework suggests installing league/flysystem-aws-s3-v3 (Required to use the Flysystem S3 driver (~1.0).) laravel/framework suggests installing league/flysystem-rackspace (Required to use the Flysystem Rackspace driver (~1.0).) laravel/framework suggests installing nexmo/client (Required to use the Nexmo transport (~1.0).) laravel/framework suggests installing pda/pheanstalk (Required to use the beanstalk queue driver (~3.0).) laravel/framework suggests installing predis/predis (Required to use the redis cache and queue drivers (~1.0).) laravel/framework suggests installing pusher/pusher-php-server (Required to use the Pusher broadcast driver (~3.0).) laravel/framework suggests installing symfony/dom-crawler (Required to use most of the crawler integration testing tools (~3.3).) laravel/framework suggests installing symfony/psr-http-message-bridge (Required to psr7 bridging features (~1.0).) psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.) psy/psysh suggests installing hoa/console (A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit.) filp/whoops suggests installing whoops/soap (Formats errors as SOAP responses) sebastian/global-state suggests installing ext-uopz (*) phpunit/phpunit-mock-objects suggests installing ext-soap (*) phpunit/php-code-coverage suggests installing ext-xdebug (^2.5.5) phpunit/phpunit suggests installing phpunit/php-invoker (^1.1) phpunit/phpunit suggests installing ext-xdebug (*) Writing lock file Generating autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover Discovered Package: fideloper/proxy Discovered Package: laravel/tinker Package manifest generated successfully. > @php artisan key:generate Application key [base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] set successfully.
パーミッションを設定
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
.envの編集
最後に、データベース情報を登録すれば、最低限の設定は完了です。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=demo DB_USERNAME=demo DB_PASSWORD=demo
※WEBサーバー(nginx)、データベース(MySQL)の設定は省略しています。
サイトにアクセスして、インストールの確認です。
http://demo.site/

無事にエラーも発生すること無く動作しているようです。
続いて、VOYAGERのインストールです。
VOYAGERのインストール
$ composer require tcg/voyager
$ php artisan voyager:install
こちらもコマンド2発でインストールが完了です。
ただし、MySQLのバージョンの影響で下記のエラーが発生しインストールに失敗しました。
[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `use rs_email_unique`(`email`)) [Doctrine\DBAL\Driver\PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes [PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
MySQLのバージョンによっては、 Laravelのutf8mb4_unicode_ciで不具合が発生するみたいです。
AppServiceProvider.phpを修正することで、エラーを回避できました。キーを設定するフィールドで問題が発生するようです。
$ vi app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Schema; // 追加 public function boot() { Schema::defaultStringLength( 191 ); // 追加 }

VOYAGERのインストール後のテーブル一覧です。結構な数のテーブルが作成されています。
最後に、管理者のアカウントを登録します。
$ php artisan voyager:admin <admin@demo.site> --create
管理画面にアクセスしてみると
http://demo.site/admin

先程作成したアカウントを入力し、ログインします。

ログインすると、このようなダッシュボードが表示されます。Post、Page、Mediaなど・・・ブログに特化した機能が既に構築されています。
VOYAGERを使ってみた感想
インストールしただけですが、とてもシンプルでビジュアル的にも使い勝手が良さそうな印象です。
Databaseの機能を使えば、CRUDがWEB上から簡単に設定することができそうです。
compassの機能は、マニュアル的なものでしょうか?何気に便利そうです。
settingsの機能は、設定項目をどんどん追加していけて便利そうです。
気になったところ
- CRUDの一般ユーザー向けのページは、自前で構築していかないと駄目?
- ユーザー登録、パスワードの再発行などはLaravelの機能と連携できる?
- 管理画面のデザインや機能を簡単にカスタマイズできる?
などなど、後日調査してみたいと思います。
特定の管理者向けのCMSをサクッと構築する場合は、VOYAGERはそのままで活用できそうです。ただ、不特定多数のユーザーに提供するCMSとなると、ユーザー登録を含めいろいろと思考錯誤がでてきそうですね。
ユーザー登録(メールアドレス認証、パスワード再発行)から退会まで、この辺りのフローがサクッと構築できるパッケージはあるのだろうか?
引き続き調べて見たいと思います。
■VOYAGER
https://laravelvoyager.com/