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

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

storeとupdateで共通で使えるバリデーション

storeとupdateでバリデーションを共通化したいけど、updateの時だけユニークチェックしたい。という時の書き方。あまりキレイじゃないね。。。

public function valid()
{
  $validator = \Validator::make($this->toArray(), [
    'code' => 'required|max:255',
  ]);

  if ($this->id && !$validator->fails()) {
    $validator = \Validator::make($this->toArray(), [
      'code' => 'unique:titles,code,' . $this->id
    ]);
  }

  return $validator;
}

Requestに値を入れてテストする

コントローラーをテストする時にRequestの変数に値を入れる。

$request = new Request;

$request->merge([
'name' => 'testname',
]);

$controller = new \Lb\Http\Controllers\TitleController($request);

$controller->update($request, 100);

$title = Title::find(100);

$this->assertEquals($title->name, 'testname');

長くなったLaravelのModelを分割

長くなったLaravelのModelを分割する方法の一つとして、私は上位モデルを使うときがある。


Titleモデルのうち、Updateに関する機能を独立させるときはこんな感じ。テーブル名を指定するのがポイント。

class TitleUpdate extends Title
{
 protected $table = 'titles';

 public function myvalidator($request)
 {
	return \Validator::make($request->toArray(), [
		'releasedate' => 'date_format:Y/m/d',
	]);
 }
}

XserverではOwncloud9以降がインストールできない

XserverではOwncloud9以降がインストールできなかった。libxml2のバージョンが低いから。これは困った。しょうがいないからOwncloud8を使うしかないんだけど、Owncloud8だとPHP7に対応していない。つまりXserverのPHPが7以上にあげられないのだ。

Laravel5でajax

Laravel5.2系の古いバージョンでajax動かしていたんだけど、5.2系の新しいバージョンだと動かない。よくわからないけどTOKEN入れないとダメらしい。

js側

$.ajaxSetup({
 headers: {
  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 }
});

ヘッダ

<meta name="csrf-token" content="{{ csrf_token() }}" />

XserverのPHPでエラー

Laravel5.3をXserverで動かそうとしたらエラーになった。

 [ERROR] Use of undefined constant STDIN - assumed 'STDIN'

bootstrap/autoload.phpの先頭にdefine('STDIN', fopen('php://stdin', 'r'));を置いたら収まった。何だったんだ。

<?php

define('LARAVEL_START', microtime(true));
define('STDIN', fopen('php://stdin', 'r'));

Laravelのmigrate:resetで外部キーエラー

Laravelで

php artisan migrate:reset

したら、以下のエラーが出た。外部キー関連のエラー。

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or upda
te a parent row: a foreign key constraint fails (SQL: drop table if exists
`tags`)

dropする順番間違えていた。先にキーの関連付けテーブル消すべきだった。以下が正しい順番。

public function down()
{
 Schema::dropIfExists('title_tag');
 Schema::dropIfExists('tags');
}

Laravelのログインをメールアドレス以外にする

AuthControllerに「protected $username = 'name';」を足す。

<?php

namespace Song2\Http\Controllers\Auth;

use Song2\User;
use Validator;
use Song2\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    protected $username = 'name';

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/';

XserverにLaravelを置くときの.htaccess

<IfModule mod_rewrite.c>
    suPHP_ConfigPath /home/MyServerName/MyDomain/xserver_php/
    AddHandler x-httpd-php5.5 .php .phps
    AddHandler fcgid-script .php .phps
    FCGIWrapper "/home/MyServerName/MyDomain/xserver_php/php-cgi -c /home/MyServerName/MyDomain/xserver_php/php.ini" .php
    FCGIWrapper "/home/MyServerName/MyDomain/xserver_php/php-cgi -c /home/MyServerName/MyDomain/xserver_php/php.ini" .phps
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

LaravelのPHPUnitでログインする

LaravelのPHPUnitでログインする。

class AccessTest extends TestCase
{

    public function setUp()
    {
        parent::setUp();

        $user = \App\User::where('name', 'dummy')->first();

        $this->be($user);
    }
    
    public function testBasicExample()
    {
        $this->visit('home');
    }
}