- 投稿日:2020-05-15T22:10:09+09:00
MacでのLaravel6の環境構築でエラーが起こった件
Laravelのインストールコマンドでエラーが起こった
Composerの準備をこちらの記事の手順で完了した後、
下記のLaravelのインストールをコマンドを実行。$ composer global require laravel/installerすると、下記のエラーが発生しました。
Your requirements could not be resolved to an installable set of packages. Problem 1 - laravel/installer v3.0.0 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension. - laravel/installer v3.0.1 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension. - Root composer.json requires laravel/installer ^3.0 -> satisfiable by laravel/installer[v3.0.1, v3.0.0]. You are using a snapshot build of Composer 2, which may be the cause of the problem. Run `composer self-update --stable` and then try again. In case it solves the problem, please report an issue mentioning Composer 2. Installation failed, deleting ./composer.json.原因
エラー文から「ext-zip」というものが足りていないということがわかった。
試行錯誤して調べるうちに、HomebrewでPHPがインストールできていない可能性が浮上した。試したこと
そこで、下記のコマンドでHomebrewでのPHP7.4のインストールを実行。
$ brew install php@7.4このコマンド完了は5分程かかりました。
その後、再度下記のLaravelのインストールをコマンドを実行。$ composer global require laravel/installerすると、以下のようにうまくインストールできました。
この前後の環境構築に関してはこちらの記事をにまとめてあるので是非参考にしてください。
- 投稿日:2020-05-15T22:08:45+09:00
MacでのLaravel6の環境構築の手順
目的
- 学習の記録のため。
- 環境構築で少し苦戦したため。
環境構築の手順
- PHPのパッケージ管理プログラム「Composer」のインストール
- Laravelをインストールする(ここで少し苦戦した)
- プロジェクトを作成する
PHPのパッケージ管理プログラム「Composer」のインストール
Laraveではプログラミングをダウンロードしてインストールするのではなく
PHPのパッケージ管理プログラム「Composer」というものを利用する。以下のリンクからcomposerのファイルを直接ダウンロードして配置する。
https://getcomposer.org/download/Latest Snapshot をクリックすると
「ダウンロード」フォルダに「composer.phar」というファイルがダウンロードされる。次にターミナルを起動。
ダウンロードフォルダに移動し/user/local/binに配置する。$ cd ~/Downloads $ sudo mv composer.phar /usr/local/bin/composerパスワードを求められるので入力する。
composer.pharが/usr/local/bin/内にcomposerという名前で移動するコマンド。
これでいつでもcomposerが呼び出し可能になる。最後にcomposerのパーミション(アクセス権)を設定する。
$ chmod a+x /usr/local/bin/composerこれで、composerが実行できるようになり、composerの準備は完了。
$ composer -V Composer version 2.0-dev上記のようになっていれば正常にインストールできている。
Laravelをインストールする
ターミナルを起動し以下を実行する。
$ composer global require laravel/installerうまくいけばこれでLaravelがインストールされる。
下記エラーが出た場合はこちらの記事を参考にしてください。
環境変数PATHの設定
環境変数PATHにインストールの場所を追記しないとLaravelのコマンドが使えない。
そこで、以下のコマンドを実行。$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile $ source ~/.bash_profileすると、Laravelがコマンドとして認識されるようになる。
プロジェクトを作成する
アプリを作成するディレクトリに移動し以下のコマンドを実行する。
$ laravel new プロジェクト名その後、以下のように作成したプロジェクトに移動しサーバーを起動するコマンドを実行。
$ cd プロジェクト名/ $ php artisan serve Laravel development server started: http://127.0.0.1:8000ここまで完了して、
http://localhost:8000/
にアクセスすると以下のようにLaravelのトップページが表示される。
- 投稿日:2020-05-15T22:02:15+09:00
Laravel7 auth ユーザー登録 まとめ
環境
macOS (10.15.4)
Laravel 7.10.2
PHP 7.4.2
MySQL 5.7.26
Apache 2.2.34はじめに
laravelのauth認証を用いて、usersテーブルから私が作成したaccountsテーブルでの認証に変更しようと試みたら結構ハマったのでまとめておく。
デフォルト機能
laravel7ではまず、laravel/uiをインストールする必要がある。そして、用意されている認証機能を作成する。
composer require laravel/ui php artisan ui vue --authaccountsテーブル
初めに作成したaccountsテーブルにはremember_tokenカラムのデフォルト値を用意していなかったので、新しくマイグレーションファイルを作成して変更しようとしたところ,
php artisan migrate が実行されないエラーが生じた。原因を調べてみると、composer で “doctrine/dbal” パッケージを追加する必要があるらしい。そのため、以下のコマンドを実行した。
composer require doctrine/dbalこれで、migrateでカラムの型を変更することができた。
auth.phpの修正
accountsテーブルで認証するために、いくつか追記、修正する必要がある。
<?php return [ 'defaults' => [ 'guard' => 'web', 'passwords' => 'accounts', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'accounts', ], 'api' => [ 'driver' => 'token', 'provider' => 'accounts', 'hash' => false, ], ], 'providers' => [ 'accounts' => [ 'driver' => 'eloquent', 'model' => App\Models\Account::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], 'accounts' => [ 'provider' => 'accounts', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], 'password_timeout' => 10800, ];Modelの修正
次にModelの修正をした。追加するカラムだけ追加する必要がある。
<?php namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\user as Authenticatable; use Illuminate\Notifications\Notifiable; class Account extends Authenticatable { // use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', 'register_date', 'delete_date', 'delete_fg', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; }Controllerの修正
AuthディレクトリのRegisterControllerの中を以下のように修正する。インサート時に、ユーザーの入力以外のデータを必要とする場合は、デフォルト値を用意する必要がある。
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\User; use App\Models\Account; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; class RegisterController extends Controller { /* |-------------------------------------------------------------------------- | Register Controller |-------------------------------------------------------------------------- | | This controller handles the registration of new users as well as their | validation and creation. By default this controller uses a trait to | provide this functionality without requiring any additional code. | */ use RegistersUsers; /** * Where to redirect users after registration. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest'); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]); } /** * Create a new user instance after a valid registration. * * @param array $data * @return \App\User */ protected function create(array $data) { return Account::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'register_date' => date("Y-m-d"), 'delete_date' => null, 'delete_fg' => 0, 'remember_token' => null, ]); } }これで、無事にaccountsテーブルにuserを登録することができた。
- 投稿日:2020-05-15T20:13:46+09:00
コードから読み解くautoloadの仕組み ~第一層 大雑把にautoloaderの仕組みを理解しよう~
初めに
皆さんcomposerから利用できる
autoload
はご存じでしょうか?PHPのFWであるLaravelなどを使用される方の多くは使用されたことがあるかと思います。自分がautoload
と出会ったのはLaravelを触れたあたりで、初めて見たときは、
「いちいちrequire
しなくてもほかのファイルの機能が使えるのは便利だな~。」
と思っていました。そして使っていくうちに、
「自分が勝手に追加したファイルもちゃんと読み込んでくれている!怖っ!!(謎の恐怖)」
と思うようになり、だんだんその恐怖心が強まってきたのである日気が済むまでautoload
の仕組みを調べました。そして調べた内容を自分のうちにとどめておいても仕方ないし、共有することで自分の考えがよりまとまったり、指摘による考えの修正が起こるかもしれないと思ったのでここへ書いてみました。
もしautoload
の仕組みに興味があったり、自分と同じような恐怖感に覚えがあれば見てみてください。この記事の流れ
autoload
の仕組みはこの記事を含めて3回に分けて紹介していこうと思っています。
ちなみにこの表の深さの欄が下に行けば行くほど扱う内容がニッチで複雑なものになっていきます。もしautoload
の仕組みをを軽く知りたいのであれば、一層だけでも十分だと思います。
深さ タイトル 内容 第一層 大雑把にautoloaderの仕組みを理解しよう autoloadで使用するファイルの働きからautoloadの仕組みを理解する 第二層 より深くautoloadの仕組みを理解しよう 第一層で扱ったファイルのコードからautoloadの仕組みを理解する 第三層 autoloadの完全理解を目指せ! 第一層、二層で扱えなかった事柄の補足 ※第二層、三層は後日公開予定(2020/05/15時点)
扱うツールついて
第一~三層で扱うツールは以下の通りです。
ツール バージョン Laravel 7.11.0 Composer 1.10.5 また、今回解説するComposerはLaravelインストール時に自動でインストールされたものであるので、Composerから
autoload
を単体でインストールした場合と異なる点があるかもしれません。第一層 大雑把に
autoload
の仕組みを理解しよう※タイトル詐欺のようで申し訳ないのですが、この記事ではファイル内のコードの説明をあまりしません。コードの説明は第二層で説明するので、第二層が公開されるまでしばしお待ちください。
aoutload
の構造
autoload
のファイル構造は以下のようになっています。//
以降はファイルごとの役割を表しています。autoload▾ vendor/ ※読み込むファイルのデータを格納 ▾ composer/ autoload_classmap.php //※ autoload_files.php //※ autoload_namespaces.php //※ autoload_psr4.php //※ autoload_real.php //autoloadの実行 autoload_static.php //※ ClassLoader.php //autoloadの実態 installed.json LICENSE autoload.php //autoloadの入り口ファイルごとの役割
次は役割ごとにファイルを分けて、ファイルの中で何が行われているか見てみます。あと実際のコードも載せておきます。
autoload
の入り口
autoload
の入り口はautoload.php
が担います。詳しく説明すると、phpの実行が行われる同時にautoload
の実行を行うautoload_real.php
のある関数へ処理を行うよう命令し、その結果を返します。コードを見るとこんな感じautoload.php// autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php'; //autoload_real.phpのgetLoader()へautoloadの処理を実行するように命令し、結果を返す return ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b::getLoader();ちなみにLaravelで
autoload.php
はこんなところに書かれています。/public/index.php//ここへ読み込むことで、Laravelの処理のすべてでautloadが使用できるようになる require __DIR__.'/../vendor/autoload.php';
autoload
の実行
autoload.php
で処理を命令されたgetLoader()
は大きく分けて3つのことを行います。
1. 読み込むファイルのデータが格納されたファイル(autoload_static.phpなど)に、autoload
の実態があるファイル(ClassLoader.php)へデータを渡すよう命令。
2.autoload
を実行させる
3. その他必要なファイル(これらがどう必要かあまりわかっていません)を読み込み
実際のコードはこちらautoload_real.phppublic static function getLoader() { if (null !== self::$loader) { return self::$loader; } spl_autoload_register(array('ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; //1. 読み込むファイルのデータが格納されたファイル(autoload_static.phpなど)に、`autoload`の実態があるファイル(ClassLoader.php)へデータを渡すよう命令 call_user_func(\Composer\Autoload\ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } //2. `autoload`を実行させる $loader->register(true); if ($useStaticLoader) { $includeFiles = Composer\Autoload\ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } //3. その他必要なファイル(これらがどう必要かあまりわかっていません)を読み込み foreach ($includeFiles as $fileIdentifier => $file) { composerRequire35d447dc237e2326be89407c57b5ca8b($fileIdentifier, $file); } return $loader; } }読み込むファイルのデータを格納
この役割を担うファイルは複数ありますが、開発環境によって使用するファイルが異なるので一度にすべてのファイルが実行されるわけではありません。また、ファイルごとに格納されたデータを紹介すると、
autoload_classmap.php
⇒ Laravelで使用するファイルの名前空間+クラス名をキー、そのファイルの絶対パスを値とした連想配列が格納されている。autoload_files.php
⇒ Laravelを使用するうえで重要であろうファイル(自分はよくわかっていない)の配列が格納されているautoload_namespaces.php
⇒ Laravelで使用するファイルの名前空間をキー、そのファイルの絶対パスを値とした連想配列が格納されている。autoload_psr4.php
⇒ Laravelで使用するファイルの名前空間をキー、そのファイルの絶対パスを値とした連想配列が格納されている。autoload_static.php
⇒autoload_classmap.php
+autoload_files.php
+autoload_namespaces.php
+autoload_psr4.php
のデータが格納されている。現在のPHPのバージョンの関係上、autoload
ではこれらの4つのファイルの代わりにこのファイルが実行される。読み込むファイルのデータのされ方と、どのようにしてそのデータを
autoload
の実態であるClassLoader.php
へ送っているのかを確認するために、autoload_static.php
のコードを見てみましょう。autoload_static.php//名前空間+クラス名をキー、絶対パスを値とした連想配列でデータを格納 public static $classMap = array ( 'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php', 'App\\Eloquent\\Contribute' => __DIR__ . '/../..' . '/app/Eloquent/Contribute.php', 'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php', 'App\\Http\\Controllers\\Contribute' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php', 'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php', 'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php', 'App\\Http\\Middleware\\CheckForMaintenanceMode' => __DIR__ . '/../..' . '/app/Http/Middleware/CheckForMaintenanceMode.php', 'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php', 'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php', 'App\\Http\\Middleware\\TrimStrings' => __DIR__ . '/../..' . '/app/Http/Middleware/TrimStrings.php', 'App\\Http\\Middleware\\TrustProxies' => __DIR__ . '/../..' . '/app/Http/Middleware/TrustProxies.php', 'App\\Http\\Middleware\\VerifyCsrfToken' => __DIR__ . '/../..' . '/app/Http/Middleware/VerifyCsrfToken.php', 'App\\Model\\Contribute\\Input' => __DIR__ . '/../..' . '/app/Model/Contribute/Input.php', 'App\\Providers\\AppServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AppServiceProvider.php', 'App\\Providers\\AuthServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AuthServiceProvider.php', 'App\\Providers\\BroadcastServiceProvider' => __DIR__ . '/../..' . '/app/Providers/BroadcastServiceProvider.php', 'App\\Providers\\EventServiceProvider' => __DIR__ . '/../..' . '/app/Providers/EventServiceProvider.php', 'App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/app/Providers/RouteServiceProvider.php', 'App\\TestModel' => __DIR__ . '/../..' . '/app/TestModel.php', 'App\\User' => __DIR__ . '/../..' . '/app/User.php', //省略 //ClassLoader.phpへデータを送信 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixesPsr0; $loader->classMap = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$classMap; }, null, ClassLoader::class); }
autoload
の実態
ClassLoader.php
はautoloa
の実態ということもあって、やることは送られてきたデータをただ読み込むだけです。コードはこちらClassLoader.php//ファイルを読み込む関数の呼び出し public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); } //データの読み込みとデータに基づくファイルの読み込み public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); //ここはただ include $file してるだけ。 return true; } } //送られてきたデータを取得 public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; }終わりに
今回の記事は以上となります。
autoload
のファイルに書かれたコードはPHPのマジックメソッドを使って作られているので、解読は自力でもやりやすかったです。(それでも構造の理解は結構大変だった...)
この関数はどう使われているのか疑問に思った方は、後日公開される第二層の記事を楽しみにしてください。こちらほうは今回あっさりとしか紹介しなかった関数などについてじっくり紹介していきます。あとLaravelに関しての記事もいくつか書いているので、こちらも読んでいただけるとありがたいです!!
Laravelのサービスコンテナのバインドと解決の仕組みが知りたい!
Laravelのsingletonメソッドの機能とその仕組みについて
- 投稿日:2020-05-15T18:16:30+09:00
Laravelで多言語処理を行う
前提条件
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っていますメッセージファイル作成
(1) /sample/resources/lang/en/messages.phpを作成
en/messages.php<?php return [ 'sample' => 'sample message' ];(2) /sample/resources/lang/jaフォルダを作成
(3) /sample/resources/lang/ja/messages.phpを作成ja/messages.php<?php return [ 'sample' => 'サンプルメッセージ' ];Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpに下記を追記
use Illuminate\Support\Facades\App;
(2) /sample/app/Http/Controllers/SampleController.phpにmultiLangメソッドを追記
public function multiLang(Request $request) { if ($request->query('lang') === 'ja') { App::setLocale('ja'); } else { App::setLocale('en'); } $data = [ 'msg' => __('messages.sample'), ]; return view('sample.multiLang', $data); }App::setLocaleメソッドを使うことによってresources/langフォルダ内のどのフォルダを使うか設定することができます
App::setLocaleメソッドを呼ばなかった場合、config/app.php内のlocaleが使われます
__('messages.sample')でmessages.php内のsample要素の値を取得できます(3) /sample/routes/web.phpに下記を追記
Route::get('sample/multi-lang', 'SampleController@multiLang');
viewの作成
/sample/resources/views/sample/multiLang.blade.phpファイル作成
multiLang.blade.php<html> <head> <title>sample</title> </head> <body> <div>{{ $msg }}</div> <div>@lang('messages.sample')</div> </body> </html>bladeでは
@lang
('messages.sample')でmessages.php内のsample要素の値を取得できます
{{ __('messages.welcome') }}と書いても取得できます動作確認
http://localhost/laravelSample/sample/multi-lang
sample message sample message
http://localhost/laravelSample/sample/multi-lang?lang=ja
サンプルメッセージ サンプルメッセージ
- 投稿日:2020-05-15T17:14:56+09:00
【Laravel】artisanコマンドで作成するファイルと手動で作成していいファイルのまとめ
はじめに
初Qiitaです。皆さん、Laravel使ってますか?
Webアプリを開発する時に、不慣れだとどのファイルがコマンドで作成すべきで、
どのファイルが手動で作っても大丈夫というのを確認しつつ進めたりして、
手間取ってしまいませんか?Laravel初心者の私がちょうどそんな状態で、
こういう切り口で説明してくれるページがあるといいなぁ、と思い。
探したんですが見つからなかったので、今回は自分でまとめてみたいと思います。artisanコマンドで作るファイル
- マイグレーションファイル (2020_05_XX_XXXXXX_create_hoge_table.php)
- コントローラーファイル (HogeController.php)
マイグレーションファイル
DBにテーブルを追加(モデルを追加)する時に作成します。
hogeがモデル名です。
php artisan make:model hoge --migration/database/migrations/内にマイグレーションファイルができるので編集します。
終わったらマイグレーションを実行します。php artisan migrationこれでDBにテーブルが追加されます。
ちなみに、使うモデルはコントローラー内で呼び出してから使うと幸せになれます。(必須ではないですが)
use App\Hoge;コントローラーファイル
このファイルにアクション(メソッド)を追加していきます。
HogeControllerがコントローラー名です。php artisan make:controller HogeController/Http/Controllers/内にコントローラーファイルができるので編集します。
artisanコマンドは不要なファイル
こちらはコマンド操作がいらない、最初からある or 手動で作成してもよいファイルです。
- ルーティングファイル(/routes/web.php)
- ビューファイル(index.blade.php)
ルーティングの追加
インストール時から存在している /routes/web.php に追記していきましょう。
ビューファイル
htmlを記載するためのファイルですね。
/resources/views/内に好きに作ってOKです。
階層も深くできるので、機能ごとにディレクトリにまとめるのがよいでしょう。ちなみに私はSmartyの名残でテンプレートファイルと読んでいますが、ビューファイルと呼ぶ方が今どきっぽいですね。
おまけ 個人的によく使うartisanコマンド
サーバーの起動。
php artisan serveそして、コマンドラインでDBの内容確認できて便利なtinker。
php artisan tinkerおわりに
以上です。
ここちゃうやんけ!的なツッコミ大歓迎です。
- 投稿日:2020-05-15T16:50:22+09:00
Laravelマイグレーションの基本まとめ(6以降対応)
はじめに
Laravelのマイグレーションはデータベースをコントロールする機能です。
僕だけかもしれませんが、開発していく中でマイグレーションファイルははたまに触るくらいなので毎回ググっていたという経緯から備忘録としてマイグレーションの主な機能についてリスト化していきます。マイグレーション生成
まずは超基本的なマイグレーションファイルを作成するコマンド
$ php artisan make:migration create_[テーブル名]_table $ php artisan make:migration create_users_tableこのコマンドを実行するとusersテーブルが作成されます。
マイグレーションファイルのオプション
マイグレーションファイルを作成する際に--tableと--createのオプションを指定できます。
例えば、以下のコマンドではオプションがない場合テーブル名が何かわからないので、
--table=usersをつけることで、usersテーブルの雛形を作成してくれます。$ php artisan make:migration add_votes_to_users_table --table=usersマイグレーション構造
マイグレーションを実行したら、以下のようなファイルが作成されます。
ここではカラムの追加やカラム型・物理名・論理名などを指定できます。マイグレーションはupとdownのメソッドがあります。
upメソッドは新しいテーブル、カラム、インデックスをデータベースへ追加するために使用します。
downメソッドはupメソッドが行った操作を元に戻します。ロールバックの機能ですね。
2014_10_12_000000_create_users_table.php<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } }マイグレーション実行
マイグレーション構成を確認できたらマイグレーションを実行します。
$ php artisan migrate実働環境でのマイグレーション強制
マイグレーションを強制実行するコマンドがあります。
$ php artisan migrate --forceこれ使ったことないです。
データ全部飛んじゃうので使うなって新人の頃に強く言われましたね。例え、使うことがあってもリーダーに確認してからにしましょう。
ロールバック
マイグレーションをロールバックするコマンドもあります。
ロールバックとは巻き戻すという意味で最後に実行したマイグレーション実行を巻き戻してくれます。$ php artisan migrate:rollbackマイグレーション変更・追加
生成したマイグレーションにカラムを追加したい場合、新たにマイグレーションを生成する必要があります。
例えば、usersテーブルにageカラムを追加したい場合、以下のように書きます。
public function up() { Schema::table('users', function (Blueprint $table) { $table->integer('age'); //カラム追加 }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('age'); //カラムの削除 }); }以上になります!
- 投稿日:2020-05-15T16:24:53+09:00
Laravelでプロジェクトの作成フロー
新規プロジェクト
ターミナル# バージョン指定なし (最新版をインストール, 初期値でmysqlを利用する) $ composer create-project --prefer-dist laravel/laravel プロジェクト名 # バージョン指定あり (初期値でmysqlを利用する) $ composer create-project --prefer-dist "laravel/laravel=5.5.*" sampleproject #書き方はいろいろ $ composer create-project laravel/laravel sampleproject --prefer-dist "6.0.*"初期設定
タイムゾーンを日本に変更
タイムゾーンの変更
config/app.php'timezone' => 'UTC', #UTCをAsia/Tokyoに変更 'timezone' => 'Asia/Tokyo',言語を日本に変更
config/app.php'locale' => 'en', #enをjaに変更 'locale' => 'ja',DBの文字設定
config/database.php'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', #mb4を消す(顔文字を不要) 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',デバックバーのインストール
ターミナル$ composer require barryvdh/laravel-debugbar画面上に非表示にするために、.envファイルを変更する
.envAPP_DEBUG=true #falseに変更する APP_DEBUG=falseこれでも画面に残っている場合は、キャッシュを消す
ターミナル$php artisan cache:clear $php artisan config:clearDBの設定変更
.envファイルの下記のDB設定における、DATABASE名、USERNAM名、PWを設定していく
.envDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laravel DB_PASSWORD=MAMPでDBの作成
MAMPでUSERを作成
作成した情報を記述する
.envDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_task DB_USERNAME=laravel_user DB_PASSWORD=password接続できるか確認
ターミナル$php artisan migrate成功した場合は、無事にDBに接続できている。
MAMPのDBをSeaquel Proで確認する場合
ユーザー名:root
パスワード:root
データベース:
ソケット:/Applications/MAMP/tmp/mysql/mysql.sock
これで接続すれば、確認ができる
Laravel-ui認証
laravel/uiパッケージをインストール$composer require laravel/ui:^1.0 --devフロントエンドのスカフォールドをインストール// 基本的なスカフォールドを生成 php artisan ui bootstrap php artisan ui vue php artisan ui react // ログイン/ユーザー登録スカフォールドを生成 php artisan ui bootstrap --auth php artisan ui vue --auth php artisan ui react --auth依存パッケージのインストール$ npm install && npm run devエラーメッセージを日本語化
下記リンクを開く
https://github.com/minoryorg/laravel-resources-lang-jaダウンロードしたフォルダを開くと、jaというフォルダが存在する
resources/langフォルダに、ダウンロードしたjaフォルダを追加
これで日本語されています
passwordなど英語表記のものを日本語にするには、validation.php'attributes' => [], //最下部のattributesにパスワードの項目を追加する 'attributes' => [ 'password'=>'パスワード' ],ターミナルで開いておきたい
ターミナル(タブ1)$ npm run development -- --watchターミナル(タブ2):ローカルサーバー$ php artisan serveターミナル(タブ3):コマンド実行用$ 何かターミナルコマンド入力する際に利用するMVCの操作
ここからMVCコントローラーの操作を進めていく
ルーティング
web.php#型 Route::get('url', 'コントローラー@アクション'); #例 Route::get('tests/test', 'TestController@index'); #リソースを利用して、記述短縮 Route::resource('photos', 'PhotoController');マニュアル:
https://readouble.com/laravel/6.x/ja/controllers.htmlTestController@indexでコントローラーを紐づけている。
routingの一覧を確認//ターミナルで確認 $ php artisan route:list //ファイルで確認 $ php artisan route:list > route.textコントローラー
コントローラーとモデルの作成
ターミナル#モデル単体を作成 $php artisan make:model Models/Test # モデル、マイグレーションファイル、コントローラーを同時に作成 $ php artisan make:model Models/Test -mc #コントローラーの作成(基本的なアクション含む) php artisan make:controller PhotoController --resourceModels/Test Modelsフォルダの中で、Test.phpを作成
-mcはマイグレーションファイルとコントローラーを同時に作成するオプションマイグレーションファイルの作成
ターミナル$php artisan make:migration create_tests_tableマイグレーションの記述
マニュアル
https://readouble.com/laravel/6.x/ja/migrations.html
マニュアルを参考に、カラム型、制限をかけて、カラム修飾子で詳細に設定するマイグレーションを実行
マイグレーションを実行$ php artisan migrateマイグレーションの履歴を確認$php artisan migrate:statusマイグレーションをロールバックする$php artisan migrate:rollback --step:5コントローラーの作成
ターミナル$ php artisan make:controller TestControllerコントローラーの記述
TestController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Test; #モデルとコントローラーを紐づける class TestController extends Controller { // public function index() #railsの場合はdef indexだが、 laravelの場合はpublic function index() { $values = Test::all(); #モデルを介して、DBから情報を取得 dd($values); #railsのbinding.pryのように取得した内容を確認できる。 return view('tests.index', compact('values')); #ここでどのviewなのか指定して紐づける #つまり、最後にどのviewにどの値を持っていくか指定する。 } }View
ログインしているか、していないで表示切り替え
マニュアル
https://readouble.com/laravel/6.x/ja/blade.html認証によって表示切り替え@auth // ユーザーは認証済み @else // @endauth @guest // ユーザーは認証されていない @endguestaタグにrouteのリンクを埋め込む
routeのnameを記述することで、リンク先のURLを簡単に指定できる
<a href={{ route(contacts.index) }}
- 投稿日:2020-05-15T16:17:49+09:00
Laravel Excel使ってみた
概要
今もっともメジャーと思われるLaravelのExcelプラグイン。
早さだけなら「fast-excel」もあるが情報がないので。インストール
phpで以下の拡張モジュールが必要なのであらかじめ使えるようにしておく。
php_zip php_xml php_gd2
composerでLaravelプロジェクトにプラグイン追加$ composer require maatwebsite/excel
laravel 6.9の環境ではlaravel-excel 3.1.19がインストールされた。
次に設定を施していく。まずはlaravelのソースに追加。
[config/app.php]'providers' => [ /* * Package Service Providers... */ + Maatwebsite\Excel\ExcelServiceProvider::class, ] (略) 'aliases' => [ (略) 'Event' => Illuminate\Support\Facades\Event::class, + 'Excel' => Maatwebsite\Excel\Facades\Excel::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, (略)次に以下のコマンドを叩いて専用の設定ファイルを生成する。
$ php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"設定ファイル laravel/config/excel.php が作られます。
デフォルトでPDFでのエクスポート機能が有効になってました。
- 投稿日:2020-05-15T15:17:20+09:00
LaravelでDatabaseTransactionsを利用してDBにアクセスするテストを高速に実行する。
概要
タイトルでほぼ終わってる感がありますが、
DatabaseTransactions
トレイトを利用すると、DBへの書き込みテストを高速に行うことができます。説明
DBに対するテストをする場合に
RefreshDatabase
を利用する例をよく見ますが、
RefreshDatabaseは内部的にphp artisan migrate:fresh
が行われており、データベースの作り直しから始まるので、Migrationが増えてくるとかなり時間が掛かるようになってきます。
DatabaseTransactions
を利用するとテストのsetup時点でbeginTransactionして、tearDown時にrollbackしてくれるので、データベースを作り直すことが無く、高速に実行できます。デメリットは?
データベースを作り直すわけではないので、完全に実行前に戻るわけではありません。
例えばautoIncrementなidを持つtableなどに対してテストを行った場合は、たとえrollbackしても自動採番の数字は戻りません。そこら辺を理解した上で利用できる状況であれば、とても高速です。
- 投稿日:2020-05-15T01:27:23+09:00
MacでのLaravel6の環境構築
目的
- 学習の記録のため。
- 環境構築で少し苦戦したため。
環境構築の手順
- PHPのパッケージ管理プログラム「Composer」のインストール
- Laravelをインストールする
- アプリケーションを作成する
1. PHPのパッケージ管理プログラム「Composer」のインストール
Laraveではプログラミングをダウンロードしてインストールするのではなく
PHPのパッケージ管理プログラム「Composer」というものを利用する。以下のリンクからcomposerのファイルを直接ダウンロードして配置する。
https://getcomposer.org/download/Latest Snapshot をクリックすると
「ダウンロード」フォルダに「composer.phar」というファイルがダウンロードされる。
- 投稿日:2020-05-15T00:32:08+09:00
Laravel 7 アプリからメールを送信する
目的
- Laravelアプリからのメール送信で非常に詰まったため実施方法をまとめる
実施環境
- ハードウェア環境(下記の二つの環境で確認)
項目 情報 OS macOS Catalina(10.15.3) ハードウェア MacBook Pro (16-inch ,2019) プロセッサ 2.6 GHz 6コアIntel Core i7 メモリ 16 GB 2667 MHz DDR4 グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いて導入 MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入 前提情報
- Dockerなどを使用せず、直接MacにLaravelの開発環境を構築して作業を行っている。自分の環境の構築方法を下記に記載する。
- Gmailを用いたメールの送信を行う。
説明後の着地点
- 当該laravelアプリのtinker上からコマンドにより指定したメールアドレスへのメール送信を行うことができる。
概要
- Googleアカウントの取得と設定
- Laravelアプリ側でのメール設定
- 確認
詳細
- Googleアカウントの取得と設定
- メールを送信するGoogleアカウントを作成する後ログインする。すでに持っているアカウントで送信を行う場合はログインする。
- 先にログインしたGoogleアカウントのGmailアドレスとパスワードを記憶しておく。
- 下記の方法で安全性の低いアプリのアクセスを有効にする。
Laravelアプリ側でのメール設定
- メール送信を実装したいアプリのアプリ名ディレクトリまでターミナルで移動する。
アプリ名ディレクトリで下記コマンドを実行して設定ファイルを開く。
$ vi .env開いた設定ファイルの26行目付近に下記の様な記載がある事を確認する。
アプリ名ディレクトリ/.envMAIL_MAILER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}"先の設定ファイルのメールの設定部分を下記の様に修正する。
アプリ名ディレクトリ/.envMAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=安全性の低いアプリのアクセスを有効にしたGoogleアカウントのgmailアドレス MAIL_PASSWORD=安全性の低いアプリのアクセスを有効にしたGoogleアカウントのログインパスワード MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=安全性の低いアプリのアクセスを有効にしたGoogleアカウントのgmailアドレス MAIL_FROM_NAME=メール差出人の名前(任意のものを入力する)筆者の環境での当該記載の例を下記に記載する。(パスワードのみ伏せる)
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=laravel.mail.0104@gmail.com MAIL_PASSWORD=************* MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=laravel.mail.0104@gmail.com MAIL_FROM_NAME=demo-laravel-crud.envファイルを保存して閉じる。
確認